質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

php メール送信時のアドバイスをお願いします。

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,322

chapp

score 203

お世話になります。PHPでのメール配信に関して質問、アドバイスのほどお願いします。

現在、kagoyaのマネージド専用サーバーを借りており、メール配信テストを行っているのですが、期待するような動作が確認できず、皆様のご意見を頂戴出来ればと、質問いたします。

現在の状況は、以下の通り。思い付きで箇条書きで書き留めます。

1.    メール配信はデータベースを参照しながら配信。
2.    メール数は、3万件程度。
3.    バックグラウンドで配信するため、exec("nohup php -c '' 'mail.php' 'start'> /dev/null &");のスクリプトを介し別ファイルで実行。
4.    メール配信はsendmail。10通に1秒を開けながら送信。
5.    借りているサーバーは専用サーバーだが、メールサーバーは共有サーバーとのこと。
6.    上記仕様で送信テストを行ったら、3万件送信するつもりが、2万5千件でストップ。時間にして2時間以上。
7.    バックグラウンドで送信せず、直接送信ファイルにアクセスをして送信すると、約1万7千件を送信した辺りでタイムアウト。

このような状況ですが、

1.バックグラウンドで送信したとき、デバッグをとる場合はどうしたらよろしいのですか?
2.メールを確実に送るにはどうしたらよいのでしょうか?
3.送信スピードを上げるにはどうしたよろしいのでしょうか?

以上、抽象的な質問になっているようで恐縮ですが、皆様のご意見を頂戴したく質問させていただきました。
色々なご意見があるかと思います。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2017/06/02 09:20 編集

    「10通に1秒を開けながら送信」はどのように行っているのでしょうか?バックグラウンド実行で失敗した際にサーバー側のエラーログなどに何か残っていますでしょうか?また、利用しているサーバーにメール送信数等の制限はありますでしょうか?

    キャンセル

  • chapp

    2017/06/02 20:52

    matsu1006様 ご質問ありがとうございます。送信時の間隔はsleep()を使って間を開けています。 また、サーバー側のメール送信数に制限はないようですが、メールサーバーは共有サーバーとの事なので、「キューが多く溜まっていると外すこともある」との回答を受けた記憶があります。 他、エラーログは現在サーバー会社に問い合わせています。確認が取れ次第ご報告いたしますので、引き続きよろしくお願いいたします。

    キャンセル

回答 3

checkベストアンサー

+2

幾つか確認はさせていただきたいので追記修正依頼に書かせていただいておりますが、
現時点で分かる内容にて回答させていただきます。

1.バックグラウンドで送信したとき、デバッグをとる場合はどうしたらよろしいのですか?

error_log()を利用
file_put_contents()FILE_APPENDをつけて日時と出力したい内容を入れて、みたいな感じのお手製ログ出力

メールを確実に送るにはどうしたらよいのでしょうか?
3.送信スピードを上げるにはどうしたよろしいのでしょうか?

下記の質問が参考になるでしょうか。
PHP メール一括送信について

あとは適当な送信数に達したらPHP自体を一度終了させて定期実行で送信対象がなくなるまで繰り返す、ですかね。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/02 20:55

    ご親切なアドバイスを、ありがとうございます。
    今から色白と調べてみます。
    取り急ぎのご挨拶で恐縮ですが、改めてご報告もかねてコメントいたします。

    キャンセル

  • 2017/06/04 05:15

    sleep()を使ってるとのことなのでやはり一度PHPを終了させた方がいいと思います。
    送信先をどのように持っているかはわかりませんが、例えば30分程度で送れそう件数だけを送ったら送信済みフラグをたてて一度PHP実行を終了し、繰り返し実行させるという感じですね。
    送信先をBCCに突っ込むと1回で済むのは済みますが何万件となると何か弊害が出ないとも限らないので何かで検証は必要ですね。
    それこそ1回の送信で数百件~数千件をBCCで一括送信して終わるまで繰り返しというのも考えられなくはないです。※メール本文に受信者名とか変換で入れるような仕様であれば1件ずつしかないでしょうけど。

    キャンセル

  • 2017/06/25 19:02

    お世話になっております。アドバイスの通り、ある一定の件数を超えた場合は別テーブルに残し、その後CRONで小出しで配信する仕組みにしてみました。これで少し様子を見てみます。ありがとうございました。

    キャンセル

+2

それくらいの規模になるとスパム認定されそうですが
そのあたりメールサーバー側の契約はクリアになっているのでしょうか?
一日8万6,400秒を10秒に1度メールを送ると3万件送るのに
3日半はかかる計算ですがだいじょうぶなのでしょうか?
たとえば5千件~1万件程度を上限として、フラグをわたし何回かに
分割してスクリプトを走らせるわけにはいきませんか?

デバグについては、ログをとって確認することと
場合によっては自分のWEBメール宛にBCCで送るとか考えられなくはないですが
そうなるとメールの通数が倍になるのでちょっと現実的ではないかもしれませんね

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/02 10:06

    10通に1秒、間を空けるようなので逆ですね。3000秒+αだと思います。

    キャンセル

  • 2017/06/02 10:07 編集

    あ、10通を1秒ですか・・・失礼しました

    キャンセル

  • 2017/06/02 20:55

    ご親切なアドバイスを、ありがとうございます。
    今から色白と調べてみます。
    取り急ぎのご挨拶で恐縮ですが、改めてご報告もかねてコメントいたします。

    キャンセル

+1

がると申します。

比較的大量のmail送信は、幾分と昔に少し触っておりましたので。
以下の内容はもしかすると「今は古い」かもしれないので、というお断りが入る前提、なのですが。

PHPのmail関数などでは取得はできなかった、と記憶をしているのですが。
本来的には、mailは(E)SMTPというプロトコルで流れる一連の通信なのですが。「明確に届かない」場合は、どこかの通信で5xxが返ってくるのですが(mailサービスによって箇所が異なった、と記憶しています)。
一方で「smapっぽいから、通信少し控えてね」の場合、4xxが返ってきたのを覚えています(これもまたmailサービスによってxxの部分は異なってました)。

ですので。
基本的には
・「届かないメールアドレス」ができるだけlistの中に混入しないように、listの正常化には気を配る
・SMTPの戻り値が把握できるようにしておいて、4xxが出たら「そのドメイン宛のmail」はしばらく控える
が正攻法で。

あとは、幾分グレーなやり方になりますが
・「届くか届かないか不明だったり怪しかったりするmail」と「確実に届くと思われるmail」は、異なるサーバから送信する
などして、ブラックリスト入りの危険性を少し軽減させる、などの方法がありました。
(もうちょっと黒い方法もあるのですが、smapは"撲滅してほしい"と思っている口なので、こちらでは控えておきます)。

以上、何かの参考にでもなれば幸いです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/25 19:00

    貴重なアドバイスをありがとうございます。
    また、しばらく本件から外れる状況であったため、お礼のご挨拶が遅れてしまいました。
    ご親切なコメントへの御礼が遅れましたこと、お詫びいたします。

    キャンセル

  • 2017/06/25 19:09

    こんなところに、SMAP 解散の原因が。。。w

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる