IT系おじさんのチラシの裏
2018年10月~
当サイトの記事にはアフィリエイト広告のリンクが含まれる場合があります

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

関連記事

Windows環境にphpmyadminをインストールする

最近のレンタルサーバーなら管理ページでポチっとボタンひとつでphpmyadminのインストールくらい完了しますし、手動でやるとしても公式サイトからZIPをダウンロードして解凍してアップロードする程度で

Windows版PHPでSFTP接続するにはphp_ssh2.dllが必要

Web運営のメンテナンス作業(ローカルへのバックアップ作業とか)を自動化する方法について4回にわけて記事にしてきました。 WSHでブラウザを自動操作する PHPでファイルとDB(Postgre

コメント

新しいコメントを投稿する

[新規投稿]
 
TOP