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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

3回答

3644閲覧

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

chapp

総合スコア233

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/06/01 16:29

お世話になります。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.送信スピードを上げるにはどうしたよろしいのでしょうか?

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/02 00:22 編集

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

2017/06/02 11:52

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

回答3

0

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

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

投稿2017/06/02 01:00

yambejp

総合スコア114769

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2017/06/02 01:06

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

2017/06/02 01:07 編集

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

2017/06/02 11:55

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

0

ベストアンサー

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

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

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

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

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

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

投稿2017/06/02 00:44

m.ts10806

総合スコア80850

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2017/06/02 11:55

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

2017/06/03 20:15

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

2017/06/25 10:02

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

0

がると申します。

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

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

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

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

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

投稿2017/06/03 14:05

gallu

総合スコア506

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chapp

2017/06/25 10:00

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

退会済みユーザー

2017/06/25 10:09

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問