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でメール送信する際に迷惑メールと判断されないために気をつけること

adsbygoogle

フォロー