mb_send_mail()が迷惑メールになってしまうときの対処法

システム開発

PHPのmb_send_mail()は簡易的なメール送信方法なので、メーラーによっては迷惑メールフォルダに入ってしまったり、「詐欺メールの疑いがあります」みたいな文言が表示されることがあります

仮にgmail宛の送信では問題なかったとしても、そのほかのメーラーでは問題が起こるケースがあります(ありました)

これはmb_send_mail()から受け取ったメールを、とあるウェブ上で見ることのできるウェブメールサービスで開いたときのものです

「このメールの送信者は、認証に対応していない不審な送信者です。なりすましやフィッシング、詐欺メールの恐れがありますので注意してください。」

「このメールは「●●●●●」が送信元アドレスを変更して送信したものです。」

との記載があり、このメールから怪しい雰囲気がたっぷり醸し出されています

もちろんこのメールはまっとうな(?)サービスから送られているもので、決して怪しいものではありません(本当です!)

でも知らない人が見たら、怪しすぎるので対策をすることにしました

SMTPによる送信

まずは便利なmb_send_mail()に別れを告げ、SMTP経由によるメール送信に変更します

SMTPによるメール送信はPHPMailerを使いました

コンポーザーから「composer require phpmailer/phpmailer」でインストールします

コンポーザーの入っていない人は公式サイトからダウンロードしてね

そして公式にある使用方法を参考に、以下のPHPファイルを用意します

const SMTP_MAIL_HOST       = "host_name_dayo";
const SMTP_MAIL_USERNAME   = "user_name_dayo";
const SMTP_MAIL_PASSWORD   = "password_dayo";
const SMTP_MAIL_ENCRPT     = "encrpt_dayo";
const SMTP_PORT            = 587;
const SITE_EMAIL_FROM      = "from_email_dayo";
const SITE_EMAIL_FROM_NAME = "from_name_dayo";
 
/**
 * SMTPでメール送信
 * @param type $to
 * @param type $subject
 * @param type $message
 * @param type $bccToAdmin
 * @return boolean
 */
function smtpMail($to, $subject, $message){
 
    require 'vendor/autoload.php';
 
    $mail = new PHPMailer(true);
 
    try {
        $mail->isSMTP();
        $mail->Host       = SMTP_MAIL_HOST;
        $mail->SMTPAuth   = true;
        $mail->Username   = SMTP_MAIL_USERNAME;
        $mail->Password   = SMTP_MAIL_PASSWORD;
        $mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
        $mail->Port       = SMTP_PORT;
 
        //Recipients
        $mail->CharSet    = "UTF-8";
        $mail->Encoding   = "base64";
        $mail->setFrom(SITE_EMAIL_FROM, mb_convert_encoding(SITE_EMAIL_FROM_NAME, "UTF-8", "AUTO"));
        $mail->addAddress($to);
 
        // Content
        $mail->Subject    = mb_convert_encoding($subject, "UTF-8", "AUTO");
        $mail->Body       = mb_convert_encoding($message, "UTF-8", "AUTO");
 
        $mail->send();
        return true;
    } catch (Exception $e) {
        return false;
    }
}

あとは送信したいところで上記のPHPファイルをrequireしてsmtpMail()を呼びます

注意点

公式ページのサンプル通りに以下の指定をつけると、画面にデバッグ表示が出てしまうので注意してください

$mail->SMTPDebug = SMTP::DEBUG_SERVER;

SPFレコードを追加

SMTPでメール送信しただけでは十分に信頼できるメールにはならないので、SPFレコードを追加します

追加するSPFレコードはこんなフォーマットです

v=spf1 +a:{server_host_name} +a:{server_domain} +mx ~all

{server_host_name}はサーバーのホスト名、{server_domain}はサイトのドメイン名に置き換えます

SPFレコードは自分が利用してるサーバーの管理画面内から追加します

利用してるサーバー会社によって微妙に管理画面のフォーマットは違うと思いますが、基本的なやり方は同じだと思います

タイプはTXT(テキスト)を選択し、コンテンツ欄に先ほどのSPFレコードを入力

そうするとこんな感じでレコード一覧に表示されます

(見えてないけどMXレコードも設定してね)

SPFレコード付きでテスト送信

再びSPFレコード付きの状態でテスト送信した結果がこちら

ほとんどの箇所がモザイクでよく見えないけど、ちゃんと警告文は消えています

めでたし、めでたし