sendmail: Error during delivery: Message is missing sender's address
PHPでsendmailをした際、
sendmail: Error during delivery: Message is missing sender's addressというエラーが出て、しばらくハマったので備忘録としてφ(..)メモメモ
結論から言うと、ただのFrom:のスペルミスなんですけどね…。
PHPでUTF-8のメールを送る例
function sendMail($mailto, $subject, $body, $fromMail = '', $fromName = '')
{
global $cfg;
$header = "MIME-Version:1.0\n".
"Content-Type:text/plain;charset=UTF-8\n".
"Content-Transfer-Encoding:8bit\n";
if ($fromName != "") {
$header .= "From:{$fromName}<{$fromMail}>\n";
} else if ($fromMail != '') {
$header .= "From:{$fromMail}\n";
} else {
$header .= "From:{$cfg['MAIL_FROM']}\n";
}
$subject = mb_encode_mimeheader($subject, 'UTF-8');
mail($mailto, $subject, $body, $header);
}
解説
UTF-8に対応していないメールソフトはそろそろ窓から投げ捨てても良いと思うので、基本的にはPHPに標準で組み込まれているmail関数を使えば良い……
………のですが、件名だけはmb_encode_mimeheaderでBase64エンコードしないと日本語が文字化けするので、ラッパー的にsendMailという関数を作っています。
ついでにMIME-Versionとかcharset設定もヘッダーに追加したり、メール送信元の設定を分岐したりしています。
- 送信者のメールアドレスと名前を両方指定する場合
- 送信者のメールアドレスのみ指定する場合
- どちらも指定せずにデフォルトの送信者アドレス($cfg['MAIL_FROM'])にする場合
みたいな。
Message is missing sender's address
で、本題の「Message is missing sender's address」ですが、要するに「送信元のメールアドレスが指定されてないやんけ!」という意味です。
この「Message is missing sender's address」でググるとsendmail.iniのforce_sender=にメールアドレスを設定しましょう的な記事もひっかかるかと思います。間違ってはいないのですが、そこが本質ではなく、メールを送るのに送信元を書いていないのが問題なのです。
以前、「WindowsのPHPでsendmailを使えるようにする」で書いたとおり、Windows環境でもsendmailを使えるようにするには複数のやり方があり、送信元の設定もsendmail.iniを書き換えれば良いとも限りません。
それに一般的にはPHP等のスクリプトをローカル環境でテストして、問題なければレンタルサーバーへアップロードする、という流れだと思いますが、ローカル環境でsendmail.iniを設定し、レンタルサーバーでも設定し、というのは二度手間じゃないですかね。そもそもレンタルサーバー側のsendmail.iniは編集できないのが普通でしょうし。
というわけで、原則として、mail関数を使うときはFrom:ヘッダーも記述する、というルールにしたほうが後々便利だと思うのです。ただ、毎回スクリプト中にメールアドレスを書くのも手間だし、後で修正するのが大変なので、先述のような自前の関数を用意して、デフォルトの送信元($cfg['MAIL_FROM'])をincludeファイルか何かに設定しておけば良いかな、と。
FromとFormって似てるよね…
このミスを過去に何回やったかわからないのですが… お恥ずかしい話… 今回のトラブルはFromをFormと書き間違えていたという恥ずかしいミスでした…。
(◎フロム ×フォーム)
実は今までPEARにあるMailクラスでメール送信をしており、件名も本文もISO-2022に変換するのを基本としていました。しかし最近はUTF-8が当たり前で、UTF-8にしかない絵文字を使う方も多くなった関係で、どうしてもメールをUTF-8対応にせざるをえなくなったんですね。
そこで先述のようなsendMail関数を作っていてFromをFormにスペルミスして、
Error during delivery: Message is missing sender's address
(Fromが指定されとらんやんけ!)
と怒られた、というだけの話でした。ちゃんちゃん。
まとめ
Error during delivery: Message is missing sender's address
が表示されたときは From: ヘッダーが指定されていない可能性が高いので、まずそこをチェックしよう!
(特にスペルミスとかね…)
ちなみに、From:に指定しているメールアドレスのドメインが、そのサーバーのドメインとは異なる場合、(SPAM対策で)これまた別のエラーになるので、SPFレコードを設定したり、Return-Path:ヘッダーを追加したり、といった対策が必要です。
そのあたりが気になる方はこちらの記事もどうぞ。
PHPでメール送信する際に迷惑メールと判断されないために気をつけること