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

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

ただいまの
回答率

89.55%

メールマガジンをバックグラウンドにて送信するためには?

解決済

回答 5

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 3,338

chapp

score 203

お世話になっております。
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 5

+1

>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 とかです。

共用のレンタルサーバで大量のメールを送信することが許容されるようなものは存在しないと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/28 01:16

    ngyukiさん

    ご親切なアドバイスをありがとうございます。
    まず1番ですが、仰られるとおり、15分という値に疑問がありましたが、どうやら単純に配信数の制限にかかっていたためのようです。専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。

    また、2番、3番ですが、mb_send_mailの件も含め、勉強になりました。特に3番に関して、イメージできたような気がします。ありがとうございました。

    以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。

    キャンセル

checkベストアンサー

0

1.このタイムアウトを避けるにはどのようにしたら良いのでしょうか? 
共有サーバーのメール送信の制限に引っかかっていませんでしょうか?
自身でメールサーバーを立てる時以外は、基本的に制限があるはずなので、そちらを確認する必要があります。
またメールサーバーを立てたとしても無尽蔵にメール配信できる訳ではありません。
携帯のキャリアなどは同一ドメインから送信間隔を適度に開けずに送信された場合、弾かれる事もあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/28 01:11

    chiku_さん

    ご親切なアドバイスをありがとうございます。
    専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。おっしゃられるとおり、メールの配信制限数に引っかかっていたのかもしれません。

    以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。

    キャンセル

  • 2015/07/28 01:28

    皆さん、どれも貴重なご意見ばかりで勉強になり、とてもベストアンサーを選べる状況ではありませんが、専用サーバーを試す切っ掛けを与えてくれた、chiku_さんにベストアンサーといたします。
    回答いただいた皆様に感謝するとともに、この判断(ベストアンサーを選択)をご了承ください。

    キャンセル

0

1. set_time_limitでPHP実行にかかる時間制限を外すこともできます。ただし、無限ループになっても残り続けるので、その辺りには注意が必要です(関数のマニュアル)。

2. 別スレッドをその場で立ち上げる以外にも、やるべき処理の内容をDBなどに保管しておいてcronで定期的に読みだして実行する方法もあります。

3. 添付ファイルやHTMLメールなど、複雑なメールを組み立てる場合にはPear::Mailのような補助ライブラリは便利です。ただ、シンプルなメールで、そういうのがなしに直接mail関数を使って送れるなら、もちろんそれで構いません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/28 01:09

    maisumakunさん

    ご親切なアドバイスをありがとうございます。
    まず1番、2番に関してですが、専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。どうやらメールの配信制限数に引っかかっていたのかもしれません。DBに保存して配信する方法も検討しています。

    また、3番ですが、Pear::Mailの件、ありがとうございます。安心いたしました。

    以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。

    キャンセル

0

タイムアウトを避けるには、phpプロセス起動時間がその時間制限内で終わるように作成し、CRONでこま切れに処理を続けるのがいいと思います。set_time_limitやmax_execution_timeで設定変更することも一つの方法ですが、プロセスが無限ループに陥った場合の終了時間も伸びてしまいます。

話がそれますが、「共有サーバー内」では、大量メール送信を禁止している場合があります。
1時間当たり何件、1日当たり何件に制限。と言った具合です。
また、リターンメールの適切な処理などを行わないと、あなたのサイトが収容されているサーバーはスパムメール送信元として扱われてしまうかもしれません。
よって、他社のメール送信専用サービスなどを利用することも検討いただくといいかも知れません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/28 01:19

    rikさん

    ご親切なアドバイスをありがとうございます。
    専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。どうやらメールの配信制限数に引っかかっていたのかもしれません。

    無限ループに陥った場合の状況などお教えいただき、ありがとうございます。
    色々と想定し対策を講じる必要があるんですね。

    以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。

    キャンセル

0

コマンドラインから実行する場合と、WEB上で実行する場合とで、若干挙動変わりますんので注意必要です。

例えば配信処理を行なう画面を用意して、submitのクリックで、execしてるなら、そのバックグラウンドの処理は、apacheのプロセスの子プロセスになるんで、どんなにphpの処理時間を延長したところで、ブラウザのタイムアウトでプロセスは消えると思います。

あと、debianとかだと、php.iniの設定が、コマンドラインからの実行用のものとhttpリクエストのもので別々だったりするので、変更したつもりがされてないってこともあります。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/07/28 01:23

    kzyplusさん

    ご親切なアドバイスをありがとうございます。
    apacheの件など、日頃、動作状況をイメージするまでに至りませんが、このような解説も含めてアドバイスいただけると、ありがたく思います。

    ちなみに、今回の件、あれから専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。どうやらメールの配信制限数に引っかかっていたようです。

    以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。

    キャンセル

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

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

同じタグがついた質問を見る