主に静的サイトにメールフォームを設置する際、TransmitMail をよく利用させていただいています。TransmitMail は Copyright 表示不要の PHP 製汎用メールフォームシステムで、ファイルの添付や CSV 出力など、柔軟で豊富な機能が特徴です。

一方 WordPress 案件では、用途に応じてプラグインの WP MW Form や ContactForm 7 を利用していますが、場合によってはこの TransmitMail をテーマに組み込んで利用することもあります。

ただ、TransmitMail はメールヘッダに Reply-To(返信先アドレス)を設定することができません。ググってもその方法が見つかりませんでしたので、私なりにカスタマイズしてみました。

Reply-To ヘッダを設定する理由

通常メールに返信する場合、 From(送信元アドレス)のメールアドレス宛てに返信されます。そのためメールフォームでは、管理者宛てに送信されるメールの From に、フォームに入力されたメールアドレスを設定することが多いと思います。

しかし、フォームに入力されるメールアドレスは様々なので、From のドメインとフォームの送信サーバのドメインが異なることになるため、受信側のメールサーバのセキュリティによって「なりすまし」と判断され、迷惑メールに振り分けられたり、受信できなかったりする場合があります。特に Gmail はほぼ間違いなくスパム扱いされます。

そこで、From にはメールサーバのドメインを設定し、Reply-To にフォームに入力されたメールアドレスを設定することで、なりすましと判断されることなく、フォームに入力されたアドレスに対して返信することが可能となります。

ちなみに、メーリングリストはその性質上、From は普通に送信者のアドレスですが、Reply-To にメーリングリストのアドレスが設定されています。

TransmitMail (v2) で Reply-To ヘッダを設定する方法

TransmitMail では、メール送信ライブラリの Qdmail が使われています。(Qdmail は開発が終了していて PHP7 では動かないらしい?ですが、TransmitMail は正常に動いています。)

qdmail.php を確認すると Reply-To の設定があったので、TransmitMail の機能として、lib/TransmitMail.php(TransmitMail プログラム本体)に Reply-To の設定項目を追加します。

当初、設定ファイルの記述方法(v2)にある「自動返信メールの宛先」の設定のように、Reply-To にフォームのメールアドレスの name 属性の値を指定するようにしてみましたが、エラーが出て送信できませんでしたので、Reply-To を有効に設定した場合に自動返信メールの宛先が設定されるようにしました。

自動返信メールを送信しない設定でも、初期値として 'auto_reply_email_input_name'(自動返信メールの宛先)の値にフォームのメールアドレスの name 属性の値(デフォルトは 'メールアドレス' )が設定されているので大丈夫です。

71行目あたり「// 設定の初期値」の「// 基本的な設定」の中にReply-To の初期値(下記コードの9行目)を追加します。

    // 設定の初期値
    private $default_config = array(
        // 基本的な設定
        'return_path' => '',
        'email' => '',
        'cc_email' => '',
        'bcc_email' => '',
        'from_email' => '',
        'replyto' => false,  // Reply-To の初期値
        'subject' => '',
        'auto_reply' => true,
        'auto_reply_email_input_name' => 'メールアドレス',
        'auto_reply_cc_email' => '',
        'auto_reply_bcc_email' => '',
        'auto_reply_from_email' => '',
        'auto_reply_subject' => '',
        'auto_reply_name' => '',

1102行目あたりからのメール送信内容の設定項目の1155行目あたりにある管理者宛メールの設定(管理者宛メールとは書かれていませんが、下記の } else { から } の間)の中に、Reply-To が有効な場合に 'auto_reply_email_input_name' の値(自動返信メールの宛先)を設定する記述(下記コードの8〜11行目)を追加します。

        if ($is_auto_reply) {
            // 自動返信メールの場合
                :
                :
        } else {
                :
                :
            // Reply-To メールアドレスの設定がある場合
            if ($this->config['replyto'] == true) {
                $this->mail->replyto($this->post[$this->config['auto_reply_email_input_name']]);
            }
        }

次に、設定ファイルで 'from_email':From(送信元アドレス)をメールサーバのドメインのメールアドレスに設定し、 'replyto':Reply-To(返信先アドレス)を有効に設定します。
TransmitMail (v2) では YAML 、PHP、JSON のいずれかの形式の設定ファイルを選べますが、以下はデフォルトの YAML 形式の設定ファイル(config.yml)を使用した場合の記述方法です。('from_email' の値は例です)

    from_email: noreply@will3in.co.jp
    replyto: true

これで、From(送信元アドレス)は任意のメールアドレスが、Reply-To(返信先アドレス)にはフォームに入力されたメールアドレスが設定されます。