PHPにてメールマガジンを送信しようと考えておりますが、処理が重い場合などはバックグラウンドにて送信するよう、いくつかのサイトで勧められていました。
http://web-terminal.blogspot.jp/2013/04/php.html
そこで、上記サイトにて解説と共にサンプルソースがあったので、現在利用している共有サーバー内に設置し、テスト送信を試みたところ、送信実行後、約15分が経過するとタイムオーバー?なのか、全てのメールが配信できない状態となっております。
※テスト送信ということで、長時間にわたる配信環境をテストしたかったので、sleep関数にて1通ずつ1秒の間隔を開けてテストを行っています。
※サイトでは、for文で繰返し送信していますが、実際はSQLからwhile文にて繰返し送信しようと考えています。
※最大で1万通程度のメール配信を想定。
ここでいくつか質問させて下さい。
1.このタイムアウトを避けるにはどのようにしたら良いのでしょうか?
2.バックグランドにて送信したいと考えていますが、上記サイト以外の方法だと、どのようなものがありますでしょうか?また、それらが詳しく説明の有るサイトがありましたらご紹介頂けますでしょうか?サンプルソースがあると助かります。
3.PHPにPEARなるものがありますが、その中にある PEAR::Mai なるライブラリがありますが、これを使うメリットとはどのようなところになりますでしょうか?(今回のバックグラウンドでは必要ない?PEARなるもの、これまで使ったことがない為の質問です)
4.上記サイトには、ファイル実行時、引数を渡すよう勧められていますが、この引数の利用例、どんなものになりますでしょうか?個人的意見で構いません。ご意見をお聞かせください。
以上ですが、アドバイスのほど頂戴できれば幸いです。
宜しくお願い申し上げます。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
+1
その「タイムアウト」がなんのことなのかもっと具体的に説明しないとわかりません。
PHP の max execution time でのタイムアウトなのなら
set_time_limit
でタイムアウト時間を未設定にするなどで回避できます(もっとも、15分という設定は不自然なので違うと思いますが)。
OP25B で SMTP がタイムアウトしているのであれば、別のサーバにメールをリレーしなければメールは送信できません(もっとも、共用のレンタルサーバでそんな設定を勝手にすることはできないでしょうけど)。
>2
Linux などの Windows 以外の PHP では
mb_send_mail
はメールを送信するのではなく、sendmail
コマンドを実行することで MTA のキューにメールを挿入しているだけです。実際のメール送信は MTA がバックグラウンドで実行します。
つまり
mb_send_mail
を使えばバックグラウンドでメールが送信できます。
もちろん、大量のメールを送信する場合、
sendmail
コマンドの呼び出しだけで相当な時間になったり、ゆっくりと少しずつメールを送りたいこともあります。
そのような場合は、例えばですが、RDBMS 上にメールキューのようなテーブルを作成し、cron で定期的に実行するスクリプトで、そのテーブルから少しずつレコードを取り出してメールを送信するようにする方法が考えられます。
>3
mb_send_mail
のように sendmail
コマンドを呼ぶ、以外に、PHP から直接 SMTP でターゲットのメールサーバにメールを送りつけることができます。
メールマガジンなどで大量にメールを送信するつもりなのなら、自分でどうにかしようなどとは考えず、外部の ASP とかを使うほうが良いです。例えば SendGrid とかです。
共用のレンタルサーバで大量のメールを送信することが許容されるようなものは存在しないと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
checkベストアンサー
0
1.このタイムアウトを避けるにはどのようにしたら良いのでしょうか?共有サーバーのメール送信の制限に引っかかっていませんでしょうか?
自身でメールサーバーを立てる時以外は、基本的に制限があるはずなので、そちらを確認する必要があります。
またメールサーバーを立てたとしても無尽蔵にメール配信できる訳ではありません。
携帯のキャリアなどは同一ドメインから送信間隔を適度に開けずに送信された場合、弾かれる事もあります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
set_time_limit
でPHP実行にかかる時間制限を外すこともできます。ただし、無限ループになっても残り続けるので、その辺りには注意が必要です(関数のマニュアル)。
2. 別スレッドをその場で立ち上げる以外にも、やるべき処理の内容をDBなどに保管しておいて
cron
で定期的に読みだして実行する方法もあります。
3. 添付ファイルやHTMLメールなど、複雑なメールを組み立てる場合にはPear::Mailのような補助ライブラリは便利です。ただ、シンプルなメールで、そういうのがなしに直接
mail
関数を使って送れるなら、もちろんそれで構いません。投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
話がそれますが、「共有サーバー内」では、大量メール送信を禁止している場合があります。
1時間当たり何件、1日当たり何件に制限。と言った具合です。
また、リターンメールの適切な処理などを行わないと、あなたのサイトが収容されているサーバーはスパムメール送信元として扱われてしまうかもしれません。
よって、他社のメール送信専用サービスなどを利用することも検討いただくといいかも知れません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
例えば配信処理を行なう画面を用意して、submitのクリックで、execしてるなら、そのバックグラウンドの処理は、apacheのプロセスの子プロセスになるんで、どんなにphpの処理時間を延長したところで、ブラウザのタイムアウトでプロセスは消えると思います。
あと、debianとかだと、php.iniの設定が、コマンドラインからの実行用のものとhttpリクエストのもので別々だったりするので、変更したつもりがされてないってこともあります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.13%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2015/07/28 01:16
ご親切なアドバイスをありがとうございます。
まず1番ですが、仰られるとおり、15分という値に疑問がありましたが、どうやら単純に配信数の制限にかかっていたためのようです。専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。
また、2番、3番ですが、mb_send_mailの件も含め、勉強になりました。特に3番に関して、イメージできたような気がします。ありがとうございました。
以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。