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レコード付きの状態でテスト送信した結果がこちら
ほとんどの箇所がモザイクでよく見えないけど、ちゃんと警告文は消えています
めでたし、めでたし
ディスカッション
コメント一覧
まだ、コメントがありません
新たにPostされたDocs
: ツール関連
キーボードを銀軸から赤軸に買い替えた話
約3年半前、仕事で使うキーボードとしてARCHISS ProgresTouchの ...: スマホ
楽天モバイルがおすすめできない人の特徴とは?
楽天モバイルの最強プランをおすすめできない人の特徴を簡単にまとめてみました また ...: システム開発
なぜスクラムがつらいのか?開発現場が疲弊するのか?スクラムに対する違和感と共に原因を考えてみた
今ではどこの開発現場に行っても、やれスクラムスクラムと、まるでスクラムでもやって ...: Laravel
1つのテーブルを複数のテーブルと結合したい【Laravel10】
1つのテーブルを2つの異なるテーブルに対して結合したいケースがあったのでLara ...: Laravel
Laravelで複数画像アップロード時のvalidateを指定【Laravel10】
jQuery - Image Uploaderを使って、フォームから複数の画像を ...HashMap
created_by
はやぴ
Web/アプリ開発エンジニア
Sierにてお堅いB向けのソフトウェア開発を経て、現在はC向けのWebやアプリを中心に開発しています。
Utilities