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

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

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

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

Q&A

解決済

5回答

5508閲覧

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

chapp

総合スコア233

PHP

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

0グッド

1クリップ

投稿2015/07/27 06:28

編集2015/07/27 06:33

お世話になっております。
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.上記サイトには、ファイル実行時、引数を渡すよう勧められていますが、この引数の利用例、どんなものになりますでしょうか?個人的意見で構いません。ご意見をお聞かせください。

以上ですが、アドバイスのほど頂戴できれば幸いです。
宜しくお願い申し上げます。

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

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

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

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

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

guest

回答5

0

その「タイムアウト」がなんのことなのかもっと具体的に説明しないとわかりません。

PHP の max execution time でのタイムアウトなのなら set_time_limit でタイムアウト時間を未設定にするなどで回避できます(もっとも、15分という設定は不自然なので違うと思いますが)。

OP25B で SMTP がタイムアウトしているのであれば、別のサーバにメールをリレーしなければメールは送信できません(もっとも、共用のレンタルサーバでそんな設定を勝手にすることはできないでしょうけど)。

Linux などの Windows 以外の PHP では mb_send_mail はメールを送信するのではなく、sendmail コマンドを実行することで MTA のキューにメールを挿入しているだけです。実際のメール送信は MTA がバックグラウンドで実行します。

つまり mb_send_mail を使えばバックグラウンドでメールが送信できます。

もちろん、大量のメールを送信する場合、sendmail コマンドの呼び出しだけで相当な時間になったり、ゆっくりと少しずつメールを送りたいこともあります。

そのような場合は、例えばですが、RDBMS 上にメールキューのようなテーブルを作成し、cron で定期的に実行するスクリプトで、そのテーブルから少しずつレコードを取り出してメールを送信するようにする方法が考えられます。

mb_send_mail のように sendmail コマンドを呼ぶ、以外に、PHP から直接 SMTP でターゲットのメールサーバにメールを送りつけることができます。


メールマガジンなどで大量にメールを送信するつもりなのなら、自分でどうにかしようなどとは考えず、外部の ASP とかを使うほうが良いです。例えば SendGrid とかです。

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

投稿2015/07/27 06:50

ngyuki

総合スコア4514

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

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

chapp

2015/07/27 16:16

ngyukiさん ご親切なアドバイスをありがとうございます。 まず1番ですが、仰られるとおり、15分という値に疑問がありましたが、どうやら単純に配信数の制限にかかっていたためのようです。専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。 また、2番、3番ですが、mb_send_mailの件も含め、勉強になりました。特に3番に関して、イメージできたような気がします。ありがとうございました。 以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。
guest

0

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

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

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

投稿2015/07/27 08:00

kzyplus

総合スコア62

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

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

chapp

2015/07/27 16:23

kzyplusさん ご親切なアドバイスをありがとうございます。 apacheの件など、日頃、動作状況をイメージするまでに至りませんが、このような解説も含めてアドバイスいただけると、ありがたく思います。 ちなみに、今回の件、あれから専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。どうやらメールの配信制限数に引っかかっていたようです。 以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。
guest

0

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

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

投稿2015/07/27 07:01

rik

総合スコア1151

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

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

chapp

2015/07/27 16:19

rikさん ご親切なアドバイスをありがとうございます。 専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。どうやらメールの配信制限数に引っかかっていたのかもしれません。 無限ループに陥った場合の状況などお教えいただき、ありがとうございます。 色々と想定し対策を講じる必要があるんですね。 以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。
guest

0

ベストアンサー

1.このタイムアウトを避けるにはどのようにしたら良いのでしょうか?

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

投稿2015/07/27 06:46

chiku_

総合スコア1464

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

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

chapp

2015/07/27 16:11

chiku_さん ご親切なアドバイスをありがとうございます。 専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。おっしゃられるとおり、メールの配信制限数に引っかかっていたのかもしれません。 以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。
chapp

2015/07/27 16:28

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

0

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

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

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

投稿2015/07/27 06:36

maisumakun

総合スコア145183

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

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

chapp

2015/07/27 16:09

maisumakunさん ご親切なアドバイスをありがとうございます。 まず1番、2番に関してですが、専用サーバーで試したところ、いまのところ正常に配信されるまで確認いたしました。どうやらメールの配信制限数に引っかかっていたのかもしれません。DBに保存して配信する方法も検討しています。 また、3番ですが、Pear::Mailの件、ありがとうございます。安心いたしました。 以上、簡単な返事ではありますが、ご親切な回答に感謝しています。ありがとう御座いました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問