拙作のCopyright表示不要のオープンソースメールフォームシステム「TransmitMail」のバージョン2をリリースしました。

2013年の冬のWCANで「TransmitMail 2 を作ってます!」っていう発表をしてからもうすぐ2年です…。遅くなってすみません…。

以下、v2で何が変わったのかを簡単にご紹介します。

v1を利用している人はv2に移行したほうが良い?

現在、v1を利用している方は、そのままv1を利用してもらって特に問題はありません。基本的な動作はv1とv2で違いはありませんので、v2にアップグレードしたからといって特別何かが便利になるといったことはありません。

1点だけ機能面で違う点は、v2では「添付ファイルの入力必須」ができるようになりましたので、「添付ファイルの入力必須」を利用したい方はv2に移行していただくと良いかと思います。

ただ今後は、v1は不具合や脆弱性等の対応は行いますが、機能改善等は行わない予定でいますので、今からTransmitMailを設置する方はv2をご利用いただければと思います。

変わらないこと

先に変わらないことをご紹介しますと、HTMLテンプレートの書き方は下記の「グローバルエラーの書き方」と「自動返信メール本文のファイル名」以外は変わっていません。v1からのアップグレード方法はまた別途、ブログ記事等で書きたいと思いますが、HTMLテンプレートはほぼそのまま利用可能です。(v1からのアップグレード方法をGithub wikiに書きました → v1 から v2 へのアップグレード方法 · dounokouno/TransmitMail Wiki

送信メール本文のテンプレートは変更点はありませんので、そのまま利用できます。

変わったこと

変わったこと目次

グローバルエラーの書き方

グローバルエラーの書き方が下記のように変わりました。

v1の場合

{if:$global_error_flag}
<p>入力内容に誤りがあります。</p>
<ul>
    {loop:$global_error}
    <li>{$global_error[]}</li>
    {/loop:$global_error}
</ul>
{/if:$global_error_flag}

v2の場合

{if:$global_errors}
<p>入力内容に誤りがあります。</p>
<ul>
    {loop:$global_errors}
    <li>{$global_errors[]}</li>
    {/loop:$global_errors}
</ul>
{/if:$global_errors}

$global_error_flag が無くなって、エラーの有無の判別に $global_errors を利用するようになりました。

一つ覚えることが少なくなったので、すっきりしたかなと思います。

自動返信メール本文のファイル名が変わった

自動返信メールの本文のファイル名が mail_autoreply_body.txt から mail_auto_reply_body.txt に変わりました。

設定ファイルの書き方が変わった

設定ファイルはYAML、JSON、PHPから選べるようになりました。一応、YAMLが推奨です。一番簡単に書けるので。

それぞれの設定ファイルの書き方は config/ 以下にサンプルを用意していますので、それを見ながらそれぞれ config.ymlconfig.jsonconfig.php を作ってもらえればと思います。

(サンプルに無い設定は、また別途、ドキュメントを整理したいと思っています。 → ドキュメントを書きました。

設定ファイルの読み込みは index.php12行目にあります。

初期値では config/config.yml を読み込むようになっていますので、 config/config.yml 以外を利用する場合はここを書き換えてください。

設定ファイルの書き方が簡単になった

v1の設定ファイルは必要の無いコードがたくさん書かれていましたが、設定の初期値をTransmitMail本体で持つようにしたので、「初期値の無いもの」と「初期値から変更をしたいもの」だけを記述すればいいようになりました。

最低限必要な設定は「メールアドレス」と「件名」だけです。

「メールアドレス」と「件名」と「自動返信の件名」を書いただけの config.yml は下記のような感じです。

config:
    to_email: username@example.com
    to_subject: [株式会社テスト]お問い合わせ
    auto_reply_subject: [株式会社テスト]お問い合わせありがとうございます

4行だけです。短くてすっきりです。

チェックモードのパラメータが変わった

チェックモードのパラメータが ?mode=check から ?checkmode に変わりました。(チェックモード以外のモードは無いので。)

チェックモードを利用する場合は設定ファイルに checkmode: 1 または checkmode: 2 を書き加えます。( checkmode の初期値は 0 でチェックモードは無効になっています。)

チェックモードが便利になった

checkmode: 1 はこれまでのチェックモードと同じですが、 checkmode: 2 を指定すると、各種設定の初期値はどんな内容か、また設定ファイルでどのように上書きされるかが表示されます。

TransmitMailが想定通り動かないときは checkmode: 2 で確認してもらうと問題解決の助けになるかと思います。

半角カタカナの入力チェック機能がなくなった

半角カタカナの入力チェック機能はv2では削除しました。(メール送信時に文字化けしてしまうため。)

添付ファイルを入力必須にできるようになった

ご要望が多かった(かどうかは分かりませんが、それなりに要望のあった)「添付ファイルの入力必須」ができるようになりました。

添付ファイルの入力必須は、いつもの添付ファイルの記述に下記のコードを追加します。

<input type="hidden" name="file_required[]" value="ファイルの入力必須">

input.html363行目付近もあわせて参照してもらえればと思います。

複数のTransmitMailを設置しやすくなった

v1ではTransmitMailを複数設置しようと思うと、TransmitMailで利用するファイル一式を設置したい分だけ用意する必要がありましたが、v2ではTransmitMail本体は1つでそれをインクルードすれば良いようになりました。v1でもカスタマイズをすればできましたが、v2では標準で対応しています。

例えば、下記のようなファイル構成にして、

public_html/
    ├ form1/
    │   ├ index.php
    │   ├ input.html
    │   ├ confirm.html
    │   ├ finish.html
    │   ├ error.html
    │   ├ config/
    │   │   ├ .htaccess
    │   │   ├ config.yml
    │   │   ├ mail_body.txt
    │   │   └ mail_auto_reply_body.txt
    │   ├ log/
    │   │   └ .htaccess
    │   └ tmp/
    │       └ .htaccess
    ├ form2/
    │   └ ※form1と同じ構成
    └ TransmitMail/
        └ lib/
            └ ※libディレクトリの中身一式

index.phprequire_once の部分を下記のように修正すると、TransmitMail本体は1つで複数のメールフォームを設置できます。

require_once '../TransmitMail/lib/TransmitMail.php';

カスタマイズしやすくなった

v2を開発した主な理由はこれなのですが、PHPベタ書きだったv1から、v2ではTransmitMailクラスに処理をまとめたので、TransmitMailクラスを継承して処理を上書きしたり、といったことがやりやすくなりました。

また、各処理のあとに afterXXX というメソッドを呼ぶようにしてあるので、「処理Aと処理Bの間に処理を挟みたい」みたいなことがやりやすくなるかなと思っています。

どんな処理があって、どんなメソッドがあるかは、その部分のコードを貼っておきますので、興味のある方はご確認いただければと思います。

public function run()
{
    // リクエストを取得
    $this->getRequest();

    if (method_exists($this, 'afterGetRequest')) {
        $this->afterGetRequest();
    }

    // アクセス拒否ホストを判別
    $this->checkDenyHost();

    if (method_exists($this, 'afterCheckDenyHost')) {
        $this->afterCheckDenyHost();
    }

    // 入力内容をチェック
    $this->checkInput();

    if (method_exists($this, 'afterCheckInput')) {
        $this->afterCheckInput();
    }

    // 表示画面を判別、$page にセット
    $this->setPageName();

    if (method_exists($this, 'afterSetPageName')) {
        $this->afterSetPageName();
    }

    // 入力内容をテンプレートプロパティにセット
    $this->setTemplateProperty();

    if (method_exists($this, 'afterSetTemplateProperty')) {
        $this->afterSetTemplateProperty();
    }

    // $page にあわせて、メール送信、HTMLを出力
    $this->setTemplateAndSendMail();

    if (method_exists($this, 'afterSetTemplateAndSendMail')) {
        $this->afterSetTemplateAndSendMail();
    }
}

カスタマイズ例は、またブログ記事等でご紹介できればと思っています。

まとめ

以上、TransmitMail 2 のリリースのお知らせと変更点のご紹介でした。

v2を使ってみた方の感想などお待ちしておりますm(_ _)m