- ベストアンサー
指定した時間にPHPプログラムを実施
以下、メール送信のプログラムがあるのですが、 ATコマンドのようなものを使用して、指定された時間にPHPのメール送信プログラムが動作するようにしたいと考えています。無理でしょうか。 ## `at -t $seireki$tuki$niti$jikan` とかで可能?? 指定した時間にPHPプログラムを実施する良い方法があれば、ご教示頂けければと思います。ぼやけた質問で申し訳ありません。 <? ## PHP Version5のため、変数の事前定義。 $email = $_POST{'email'}; $word1 = $_POST{'word1'}; $word2 = $_POST{'word2'}; $word3 = $_POST{'word3'}; $seireki = $_POST{'seireki'}; $tuki = $_POST{'tuki'}; $niti = $_POST{'niti'}; $jikan = $_POST{'jikan'}; ## 以下、メール送信 $mail_to = "$email"; $mail_from = "test@test.co.jp"; $mail_bcc = "test@test.co.jp"; $mail_from_title = mb_encode_mimeheader("TEST___")."<".$mail_from.">"; $mail_xmailer = "PHP-" . phpversion(); $mail_subject = mb_encode_mimeheader("TEST"); $mail_body = $mail_body . "\n"; $mail_body = $mail_body . "\n"; $mail_body = $mail_body . "\n"; $mail_encode = "EUC-JP"; $mail_body = mb_convert_encoding($mail_body, $mail_encode); $mail_header_array["X-Mailer"] = $mail_xmailer; $mail_header_array["From"] = $mail_from_title; $mail_header_array["Bcc"] = $mail_bcc; foreach($mail_header_array as $key => $value){ $mail_header .= $key . ": " . $value . "\r\n"; } $mail_result = @mb_send_mail($mail_to, $mail_subject, $mail_body, $mail_header, "-f" . $mail_from); if(!$mail_result){ die("メールを送信できません\n"); } ?>
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 送信時間をHTMLより変数で渡そうと思っておりますが、それをCRONの設定ファイルに反映させるのって、無理っぽいですね。。 恐らく、とても面倒ですね(笑。 #2さんの言っている事をもう一度見直してみましょう。良くない用途という言葉にはこだわらないように(笑。悪い事に使わないと言う事ですので、もう少し具体的にしますか。 指定時間を分単位で設定するならば、cronを毎分設定します。PHPでプログラミングする事を前提とすれば、例えばcron.phpをいうプログラムを作成し、wget等でアクセスすれば良いでしょう。 すなわち、crontab -eで * * * * * wget http://localhost/cron.php のようにwebアクセスすれば良いです。コマンドのwgetの部分はフルパスでないと動かない可能性もあります。 同様に、10分間隔で設定したい場合は、 */10 * * * * wget http://localhost/cron.php とするだけですね。詳しくはcrontabで調べてみて下さい。 cron.php指定時間の時だけ、指定されたプログラムを動かすようになっています。指定時間以外はまったく無駄に(笑)起動しています。 例えば、メール送信関数を mySendMail()とでもしておき、外部ファイル"at.txt"に指定時刻 Y-m-d H:i 形式で書いておいて、 $now = date("Y-m-d H:i"); $atfile = "at.txt"; $atarr = file($atfile); if(count($atarr)>0){ foreach($atarr as $at){ if($at == $now) mySendMail(); } } と言うようなスクリプトが書けます。外部ファイルではなくMySQL等に格納されたデータの方が簡単かもしれませんね。 参考まで。
その他の回答 (4)
- wp_
- ベストアンサー率54% (132/242)
この辺まで来るともはや設計の話になってきますな。 私だったらDB使いますね。 file名はどうするか(何を一意にするか)、fileが増えたときの対処は、mail送るごとにunlinkするのはHDDに環境に地球に優しくないし、permissionは、fileの形式はcsvなのかiniなのか などと考えることが多いので避けます。 送信時間と本文、To、CC、BCCと一意のキーとしてuniqueな数字を入れるcolumnがあれば十分ですね。 あとcron起動はwgetを用いてわざわざhttpを介すよりも * * * * * php /home/hoge/lib/mySendmail.php としたほうが効率いいですよ。 その場合は相対パスだと動かないことに注意です。 必ず絶対パスを書くようにしましょう。
お礼
どうもご回答ありがとうございます。 DB使ったやり方もよいですね。 日時の変数もDB管理した場合、指定時間にプログラムを動かす仕組みがちょっと思いつかないですね。 参考になる回答を2つ頂いているので、ちょっと検討してみることにします。どうもありがとうございます。
- wp_
- ベストアンサー率54% (132/242)
悪いこと、と言ってもSPAM業者はphp介した送信なんてしないと思う という突っ込みはだめですか(;> 通常業務でメルマガ発行の仕事だってありますし。 とりあえず私もcronを薦めておきます。 WindowsServerならbatファイルを書いてタスクに突っ込んでおけばよいかと。 関係ないのですがmailはeuc-jpだと(大半のクライアントアプリは)文字化けすると思いますよ。
お礼
記載ありがとうございます。 > 関係ないのですがmailはeuc-jpだと(大半のクライアントアプリは)文字化けすると思いますよ。 変更します。どうもありがとうございます。 OSはCentOSですので、CRONを利用した方法を検討してみます。 CRONだと一度変数を含めた文章をテキストに落として、メール送信のような形になるんでしょうか。 送信時間をHTMLより変数で渡そうと思っておりますが、それをCRONの設定ファイルに反映させるのって、無理っぽいですね。。
- fake-tang
- ベストアンサー率24% (186/772)
なんかあまりよくない用途にも使えそうなので、ヒントだけ。 ・一定間隔で読み込みなおす。 ・現在の時間を取得する関数。
お礼
記載ありがとうございます。 決して怪しい用途ではありません。 。。この回答が怪しいですね。 > 現在の時間を取得する関数 調べてみます、どうもありがとうございます。 ATコマンド的な使い方は難しいかもしれませんね。
- potkurin
- ベストアンサー率24% (33/134)
Linuxがサーバであれば、cron機能を利用してシェルを記述しておけばいいかと思います。
お礼
記載ありがとうございます。 メール送信を考えてますので、利用者の実施時間の希望がことなるので、ATコマンドで実現できないかと考えておりました。
お礼
ご回答いただきましてありがとうございます。 なるほど、そういうやり方もあるわけですね。 勉強になります。 記載されたやり方のイメージとしては、 1) HTMLページから、日時の値を"at.txt"ファイルに追加していく。 2) "at.txt"ファイルを読み、時間が一致すると、mySendMail();で送信予約する。 3) CRONTABで定期的にメール送信プログラムを動作させる。 こんなイメージでよいでしょうか。 送信するメールの値も一意ではないため、少し検討が必要になりますが、大変参考になるご意見どうもありがとうございました。