PHPでメールを(sendmailで)送るスクリプトを作成しています。

しかし、送る文字数が多すぎると↓のエラーになってしまいます。
534 Message header size, or recipient list, exceeds policy limit.
sendmail: Unable to submit message.

エラー内容をWebで調べましたが見つかりませんでした。
どなたか解決方法教えていただけませんでしょうか。

回答の条件
  • 1人50回まで
  • 登録:2006/11/10 14:20:45
  • 終了:2006/11/17 14:25:03

回答(7件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402006/11/10 14:31:59

ポイント18pt
Message header size, or recipient list, exceeds policy limit

意訳すると、ヘッダのサイズか受信者のリストがポリシーで決められた上限を超えていますよ。


エラーメッセージから推測すると、おそらく多人数に一度に送信しようとしているのではないですか?

sendmail の設定を変えるのも一案ですが、結局いつか上限に引っかかるので、同じメールでも何人かごとに分割して送信してみてはどうでしょうか?

id:kamesann

回答ありがとうございます。

送る相手は一人だけで、一日一通です。文字数は変更できないという条件があります。

(作業ログのようなものを送るので)

翻訳すると受信側の問題といっているように見えるのですが、PHPを実行した直後にでるエラーなので

PHPでおくるsendmailの制限にも感じています。

2006/11/10 14:59:00
id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402006/11/10 15:07:22

ポイント17pt

あくまでエラーメセージからの推測になりますが、Message body とはなっていないので、本文の文字数とは直接的には無関係です。

また、メッセージ自体は送信側の Sendmail からのようなので、PHPの制限でもなさそうです。

Sendmail の設定を変えても受信側のサーバーが受け取らない可能性もあるので、まずは問題をはっきりさせた方が良いでしょう。


Message header とは To: CC: Subject: 等のヘッダの部分です。これには本文は含まれません。

送信時に何かヘッダーを設定していますか?

たとえば長文の Subject をつける等。

id:kamesann

文字数は多くても5000文字程度なのでSendmailのMaxMessageSize以下であると思います。

ヘッダーへの付加は特別行っていません。Subjectは1~10文字程度です。

あて先も決まったあて先1件なので、変化している要素は本文の文字数くらいなので、

本文だと考えています。

2006/11/10 17:22:05
id:kurukuru-neko No.3

kurukuru-neko回答回数1844ベストアンサー獲得回数1552006/11/10 17:49:20

ポイント17pt

>534 Message header size, or recipient list,

>exceeds policy limit.

意味は回答#1の方のto,cc,bcc数が多いエラーです。

確認ポイント(php mail関数)

1. messageで行の改行はしていますか?

2. additional_headers ,additional_parameters

は正しいですか?

php mail関数マニュアル ・ サンプル

http://php.benscom.com/manual/ja/function.mail.php

==========================================

google検索

phpでsendmail送信

http://masago.kir.jp/php20050202.php

id:kamesann

今ためしていますが、中間報告として。

2は問題なさそうです。

1ですが、本文は全く改行していません。

現在わかっていることとして、本文が全角で3000文字未満だと正常に送信できて3000文字以上だとエラーとなります。)

改行していないので1行が3000文字で動作が違うとも言い換えられますね。

ただwordwrapを使ってみたり1000文字で改行してみても動作がかわらないので

やはり本文の文字数を疑っています。


コード的にはこんな感じです

sbjには文字が10文字程度

bodyには日本語の文章で3000文字以上

toはメールアドレス

がはいっています

$body = wordwrap($body, 70);

$sbj = i18n_convert($sbj, "JIS", "SJIS");

$sbj = i18n_mime_header_encode($sbj);

$header="Reply-To: ".$_POST['email']."\nContent-Type: text/plain;charset=iso-2022-jp\nX-Mailer: PHP/".phpversion();

mail($to,$sbj,$body,$header);

2006/11/10 22:50:47
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402006/11/10 18:36:25

ポイント17pt

>あて先も決まったあて先1件なので、変化している要素は本文の文字数くらいなので、

>本文だと考えています。

結局のところ試してみないと分からないので、テスト的にほぼ同じ環境で本文を 10 文字程度にしてみて送信できるか見てみてはどうでしょうか?

できれば Sendmail に渡している生データそのものが見れると分かりやすいんですけど。


あと気になったのは、E-mail って一行あたりの文字数に制限があったような?

MIME で添付ファイルにしてみるのも手かもしれません。

id:kamesann

制限は70文字みたいですが、なぜかそれを超えても送信できています。

コードは3の方の部分へ書き込みました。

2006/11/10 22:53:13
id:b-wind No.5

b-wind回答回数3344ベストアンサー獲得回数4402006/11/10 23:23:49

ポイント17pt

まず、本題とは関係ないかもしれませんが、

・wordwrap は日本語を考慮される?

・$_POST['email'] をそのまま使用するのは危険

・$header 中の改行コードは "\r\n" では?

という疑問もあるのですが、


$header の phpversion() の後にも改行を足してみてはどうでしょうか?

id:kamesann

$header 中の改行コード"\r" → "\r\n"

header の phpversion() の後にも改行を足す。

二つやりましたが、結果は変わらずでした。。

2006/11/11 14:53:44
id:tobeoscontinue No.6

tobeoscontinue回答回数214ベストアンサー獲得回数542006/11/11 13:01:46

ポイント17pt

>現在わかっていることとして、本文が全角で3000文字未満だと正常に送信できて3000文字以上だとエラーとなります。)

ということなので$bodyに問題があるように思います。

$body = wordwrap($body, 70);

wordwrapは文字のエンコーディングを考慮しないので漢字コードの途中に\nを挿入してしまい、それが問題になっているのではないでしょうか。特にJISはシフトイン、アウト方式なので矛盾してくると思います。(\nが挿入されても漢字シフトの中で\nとして認識されていないので長いメッセージだと判定された。)

またwordwrap()にはhttp://www.secureinfo.jp/archives/2006/04/php_wordwrap_1.html]PHP "wordwrap()" 関数にバッファオーバーフローの脆弱性というのがあるそうなのでこれかもしれません。

function mb_wordwrap($str, $width, $break="\n")
{
  $length = mb_strlen($str);
  $contents = '';
  for ($i= 0; $i < $length; $i += $width)
    $contents .= mb_substr($str, $i, $width).$break;
  return $contents;
}

mbstringを使って文字のエンコーディングを考慮したwordwrapを書いてみました。UTF-8では確認しました。JISでは上手く動くか分かりません(シフトイン、アウトなので)。変換する前はSJISだと思うのでその状態だと動くと思うのですが。

環境によっては

mb_language("ja");

mb_internal_encoding("SJIS");

が必要かもしれません。

id:kamesann

ビンゴでした。

作成していただいたコードを適用した結果エラーはでなくなりました。

1000文字程度で改行コードをいれた場合には直らなかったのがふに落ちないですが・・・

そんなことはないと思いますが、3000文字超えた場合には1行70文字でないとだめとか??

で、実はメールを1行でおくらなければならないという制限があります。

(wordwrapは問題切り分けのために入れました)

解決方法は、、なさそうですよね・・・

ありがとうございました。

2006/11/11 15:06:26
id:kurukuru-neko No.7

kurukuru-neko回答回数1844ベストアンサー獲得回数1552006/11/11 14:49:32

ポイント17pt

mb_send_mailを試してみてはどうでしょうか?

※:php.ini sendmail_fromが設定されていると仮定

$header ="Reply-To: ".$_POST['email']."\r\n";

$header.="X-Mailer: PHP/".phpversion();

mb_language( "ja" );

mb_internal_encoding( "SJIS" );

mail($to,$sbj,$body,$header);

mb_send_mail

http://jp.php.net/manual/ja/function.mb-send-mail.php

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません