PHPでメルマガなどを送る方法についての質問です。

数千件のメルマガをmb_send_mail()関数で送信する際にどのようにするのがよいのでしょうか?
一気に送信しようとすると途中で出来なくなってしまいます。
一応、set_time_limit(0)の状態でやっているのですが、サーバー側で何らかの処理がされえいる模様です。
サーバーは、専用サーバーを使っています。

いろいろ調べた結果、いくつかに分けて送るのが良いとのことですが、具体的な内容はありませんでした。
sleep()関数などで休み休み送信するということなのでしょうか?
それとも送信データの件数を一定に定めて数回に分けて送信したほうが良いのでしょうか?
一定の場合は、どの位の件数がベストなのでしょうか?

上記の内容だけだと情報不足だとは思いますが、とりあえず何を説明すればいよいのかわからない状況なのですいません。
こんな感じですけど、どなたか教えてください。

回答の条件
  • 1人50回まで
  • 登録:2008/01/17 01:09:51
  • 終了:2008/01/21 02:21:38

ベストアンサー

id:amber-jack No.6

amber-jack回答回数3ベストアンサー獲得回数12008/01/17 10:29:06

ポイント75pt

多分、現状がウェブ上で、

1.配信するメールの内容を記述

2.送信ボタンを押す

3.配信プログラムに渡されて、正式に終了すれば終了メッセージが表示(現在はエラー表示?)

という流れでしょうか。

配信数が増えれば増えるほど、配信プログラムが動いている時間は長くなりますので、

その間、ブラウザも開いたまま終了を待つ流れになると思いますが、これは危険だと思います。

ベストの方法は

1.配信するメールの内容を記述

2.送信ボタンを押す

3.データベースに登録(テキストデータでも良いです)

4.cronで配信するデータがあれば配信する

5.登録されたデータを削除、もしくは終了フラグを立てる

という流れだと思います。

どうしてもリアルタイムで配信したいのであれば、

1~2は同じ流れで3の時点で配信用のPHPをバックグラウンドで非同期で実行させます。

ちょっとこちらを説明すると長くなるので、詳しい説明は省きますので、ググってみて下さい。


で、どちらにしても、配信用のプログラムはコマンドラインからPHPを動作させる必要があるので、

サーバの状況をお聞きしたのですが、マイティサーバーという所のサイトを見たのですが、

PHPの事を詳しく記載してあるページが無さそうでしたので、手順を説明します。

SSH、シリアルコンソールでのログインが出来るようですので、

どちらでも結構ですのでログインして下さい。

(SSHを利用した事があるようですので、SSHでOKです)

ログイン出来れば、コマンドで

which php

と入力して下さい。多分、

/usr/local/bin/php

とPHPのパスが帰ってくると思うのですが(パスは違うかもしれないです)、帰ってくればOKです。

コマンドラインでPHPを利用する場合、PHPスクリプトの1行目にこのパスを指定して

#!/usr/local/bin/php

echo "hoge";

?>

のような記述が必要になります。

PerlのCGIを利用された事があれば、イメージは掴みやすいと思うんですが…

これでプログラムの記述が出来れば、サーバにアップして実行権を与えるために

このファイルのパーミッション(属性)を755にして下さい。

後は、SSHからコマンドでそのファイルを指定すればプログラムが動作します。

FTPでアップされるディレクトリのパスが分からないですけど、

/home/www/hoge/hoge.php

のような感じです。

最初はいきなり配信するのではなく、とりあえず配信する内容を表示するなりでテストして下さい。

コマンド上で上手く配信できれば、cronに登録してある時間がくれば配信するようにするか、

バックグラウンドで実行すればOKだと思います。

id:black_kenchan

凄く勉強になりました。

SSHの事も教えて頂いて分かったような気がします。

色々考えているのですが、amber-jackの仰る通りcronを使って配信しようかなぁって感じになってきました。

ホントに有難う御座いました!!

2008/01/18 03:24:57

その他の回答(7件)

id:yoneto164 No.1

ヨネちゃん回答回数813ベストアンサー獲得回数942008/01/17 01:36:34

ポイント10pt

PHPは通常30秒間でタイムアウトされてしまうのがデフォルトの設定です。

set_time_limit()で延ばせる可能性もあるのですが、

一度に送信する数を300までに留めて、

自動的に作った(コピーのような)別のPHPファイルで続きを送信していけばOKだと思います。

id:amber-jack No.2

amber-jack回答回数3ベストアンサー獲得回数12008/01/17 03:10:07

ポイント10pt

詳しく書かれてないので推測ですが、ウエブページ上からメールマガジンの配信プログラムを動かしてます?

多数の配信になってくるとウエブからでも出来なくないですが、

専用サーバを使われているのであれば、コマンドライン上から操作するほうが良いと思います。

環境によって出来る・出来ないがありますが…

もう少し詳しくサーバの状況、現在の状況(どういう流れでメールを配信してるか)

を記入して頂けると詳しくアドバイス出来ると思います。

id:black_kenchan

現在のサーバーの状況とは?

なのですが、どういう風に答えれば良いかわかりません。

すいません…

こういう場合は、何を説明すればよいですか?

2008/01/17 03:14:46
id:amber-jack No.3

amber-jack回答回数3ベストアンサー獲得回数12008/01/17 03:58:47

ポイント10pt

サーバの状況ですが、PHPがコマンドラインから使用出来るかどうか?がまず知りたいですね。

専用サーバというのは、レンタルのサーバでしょうか?

SSH、TELNETなどでログインは可能ですか?

cronの設定などは行った事があるでしょうか?

id:black_kenchan

PHPがコマンドラインから使用出来るか?⇒ コマンドラインが分からないので使用できるか分かりません…すいません…

どこのレンタルサーバー? ⇒ マイティーサーバーです。

SSH、TELNETなどえログイン可能か? ⇒ 一応出来ますが、余り詳しくないです…

CRONの設定などの使用経験 ⇒ あります。

上記のような状況です。宜しくお願いします。

2008/01/17 04:28:11
id:b-wind No.4

b-wind回答回数3344ベストアンサー獲得回数4402008/01/17 09:14:30

ポイント10pt

最近は spam 対策のため、同時(または一定時間内)の送信数を制限しているところも多く出ているようです。

Mail_Queue のクラス概要

対策というわけではないですが、数千件の処理というのも含めるといったんキューに入れて別スクリプトから

順次送信していく形の方が望ましいと思います。

id:black_kenchan

キューですか、検索してるときに何回かみた言葉なのですが、意味が分からず自分には関係ないと思いスルーしてました。

勉強してみます。

有難う御座いました!

2008/01/18 03:28:15
id:vector_xenon No.5

vector回答回数113ベストアンサー獲得回数42008/01/17 09:55:05

ポイント10pt

メルマガのシステムを作った時の送信間隔は1秒に1通でした。

# つまりsleep(1);

この理由は、相手が携帯でしたのでキャリアのサーバにspamと判定されないようにする為でした。

# spam認定はサーバの設定によって違っているので、1秒空ければまず大丈夫だろうという憶測です。


WEB上での送信の場合、PHPの実行時間が設定されていますので20秒ほどでリダイレクトするしかありません。

簡単に言えば

while (送信完了まで) {
    送信;
    if (20秒経過) {
        リダイレクト;
    }
}

と言った感じです。


コマンドライン(SSH上での操作もしくはcronによる操作)の場合、タイムアウトはありませんのでリダイレクトを行う必要はありません。

id:black_kenchan

参考になりました!!

1秒に1通っって…大変なんですね。メルマガも。

ちょっと、甘く見てました。

上記で教えてくださったWhile文のリダイレクトというのが、分からないのですが具体的にどんな感じなのですか?

2008/01/18 03:20:02
id:amber-jack No.6

amber-jack回答回数3ベストアンサー獲得回数12008/01/17 10:29:06ここでベストアンサー

ポイント75pt

多分、現状がウェブ上で、

1.配信するメールの内容を記述

2.送信ボタンを押す

3.配信プログラムに渡されて、正式に終了すれば終了メッセージが表示(現在はエラー表示?)

という流れでしょうか。

配信数が増えれば増えるほど、配信プログラムが動いている時間は長くなりますので、

その間、ブラウザも開いたまま終了を待つ流れになると思いますが、これは危険だと思います。

ベストの方法は

1.配信するメールの内容を記述

2.送信ボタンを押す

3.データベースに登録(テキストデータでも良いです)

4.cronで配信するデータがあれば配信する

5.登録されたデータを削除、もしくは終了フラグを立てる

という流れだと思います。

どうしてもリアルタイムで配信したいのであれば、

1~2は同じ流れで3の時点で配信用のPHPをバックグラウンドで非同期で実行させます。

ちょっとこちらを説明すると長くなるので、詳しい説明は省きますので、ググってみて下さい。


で、どちらにしても、配信用のプログラムはコマンドラインからPHPを動作させる必要があるので、

サーバの状況をお聞きしたのですが、マイティサーバーという所のサイトを見たのですが、

PHPの事を詳しく記載してあるページが無さそうでしたので、手順を説明します。

SSH、シリアルコンソールでのログインが出来るようですので、

どちらでも結構ですのでログインして下さい。

(SSHを利用した事があるようですので、SSHでOKです)

ログイン出来れば、コマンドで

which php

と入力して下さい。多分、

/usr/local/bin/php

とPHPのパスが帰ってくると思うのですが(パスは違うかもしれないです)、帰ってくればOKです。

コマンドラインでPHPを利用する場合、PHPスクリプトの1行目にこのパスを指定して

#!/usr/local/bin/php

echo "hoge";

?>

のような記述が必要になります。

PerlのCGIを利用された事があれば、イメージは掴みやすいと思うんですが…

これでプログラムの記述が出来れば、サーバにアップして実行権を与えるために

このファイルのパーミッション(属性)を755にして下さい。

後は、SSHからコマンドでそのファイルを指定すればプログラムが動作します。

FTPでアップされるディレクトリのパスが分からないですけど、

/home/www/hoge/hoge.php

のような感じです。

最初はいきなり配信するのではなく、とりあえず配信する内容を表示するなりでテストして下さい。

コマンド上で上手く配信できれば、cronに登録してある時間がくれば配信するようにするか、

バックグラウンドで実行すればOKだと思います。

id:black_kenchan

凄く勉強になりました。

SSHの事も教えて頂いて分かったような気がします。

色々考えているのですが、amber-jackの仰る通りcronを使って配信しようかなぁって感じになってきました。

ホントに有難う御座いました!!

2008/01/18 03:24:57
id:shotets No.7

shotets回答回数42ベストアンサー獲得回数22008/01/17 17:36:42

ポイント25pt

仮にphpで送信できたとしても、いくつか問題があります。

・携帯のメールアドレスに送信する場合、一度に何百、何千通と送信すると迷惑メール業者扱いされる場合があります。

http://q.hatena.ne.jp/1094394827

・PCにおいても、最近ではYahooメールなどブラウザで使える無料メールが、存在しないメールアドレス(エラーメール)の割合が多い場合に迷惑メール扱いになります。

これを回避するためにメール配信を生業にしている業者は以下のような対策をとっています。

・エラーメールの判定をし、次回から送らないなどの設定を施す。

・複数のサーバ(複数のIPアドレス)から分散してメールを送る。(サーバあたりの配信数が少なくなる)

どうしても業者を使わないでレンタルサーバで配信したい場合は

以下のような対策が必要です。

・空メール経由、仮登録経由での登録をしてもらうことによって、確実に届くメールアドレスのみを取得する。

・メールアドレスの変更フォームを用意する。

id:black_kenchan

なるほど!もの凄く勉強になりました!!

エラーメールの判定って、どういう風に識別するんですか?

もし、知っていましたら簡単で結構なので教えて下さい。

2008/01/18 03:17:01
id:shotets No.8

shotets回答回数42ベストアンサー獲得回数22008/01/18 11:48:22

ポイント50pt

メール受信をトリガにしてエラーを解析するプログラムに渡せばいいと思います。

自分の環境に合わせて使ってください。

http://www.club.kyutech.ac.jp/support/manual/procmail.html

http://moyolab.blog57.fc2.com/blog-entry-48.html

http://server.typepad.jp/dragonfly/2006/05/qmailphp_cli_bc81.htm...

エラーメールの識別については

http://labs.unoh.net/2007/09/post_99.html

http://net.joetsu.ne.jp/manual/email/error/daemon.php

エラーメールは数百種類あるそうなので、エラーの種類を登録できるようにプログラムを組んだほうがいいと思います。

id:black_kenchan

回答して下さって有難う御座います。

ちょっと難しそうですが何とか出来そうなので頑張ってみます。

本当に有難う御座いました。

2008/01/21 02:18:43

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません