プロが教える店舗&オフィスのセキュリティ対策術

PHPを勉強し始めまして、メールの送信はできるようになったのですが、「指定時刻に」送信する方法が分かりません。

shellスクリプトというもので時間指定ができると聞きまして、調べたのですが、Linuxのスクリプトとのことで、使えないようです。

(1)PHPのみで
あるいは
(2)PHPと他の言語をあわせてwindowsサーバー上で

動作する「指定時刻に送信する」スクリプトを教えていただけますでしょうか。

方向性、概念だけでも結構です。

宜しくお願い致します。

A 回答 (4件)

まず


phpだけではできません。
また、内部のメールサーバー(MTA)がなにかによっても違います。
独自でドメインを持っていて、mx(メールエクチェンジャ)を持っている場合は携帯への電送は比較的楽です。
もし、プロバイダ経由で送る場合、smtp(25)がブロックされていますので、送れません。
この場合はsmtpauthを使います。
(私はsendmailやexim4でのsmtpauthが面倒だったので、postfixをつかってますが。)

必要なもの
ntpdate若しくはxntpd
nkf
mhn
そしてShellスクリプト
あとはcrontabに記述してcronデーモンに
kill -HUP [cronのpid]
とすれば再度設定ファイルを読み込みます。

流れ
phpでなにか文章を書く。
cronがShellスクリプトを呼び出す。
自身のメールサーバー(MTA)が配送する。
認証が必要な場合はMTAを設定する。

参考スクリプト
------------------cu hear------------------------------
#!/bin/sh

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin:/usr/local/mh:/usr/local/netpbm:/usr/local/sbin

#秒までいらなければ%Sを外す。日付がいらなければ%Y%m%dも外す。
#DATE=`date +'%Y%m%d%H%M%S'`
DATE=`date +'%H%M'`
if [ $DATE = $1 ]; then
umask 077
(
echo "From: local@local"
echo "To: mobile@mobile"
echo "Subject: 件名ですよ"
echo "--------"
echo " "
echo "おくりまーす。"
) | /usr/bin/nkf -j > /tmp/sendfile

echo 'send' | comp -use -editor /usr/local/bin/mhn -file /tmp/sendfile >/dev/null
fi
------------------cu hear------------------------------

このファイルを/home/hagahoge/MOB.shなどと作成して、chmod +x /home/hagahoge/MOB.sh
とする。
crontabには
* * * * * hagahoge /home/hagahoge/MOB.sh "1500" > /dev/null 2>&1

Shellスクリプトにある$1は引数の一番め 1500が代入される。
dateコマンドはManpage of DATEで検索してみてください。

あと注意としてマシンの日付は必ず同期をとってください。
    • good
    • 0
この回答へのお礼

ありがとうございます。

詳しく回答していただきまして、大変参考になりました。
本当に有難く思っております。

説明のなさり方も、概要と必要なもの、流れと具体的なスクリプトと、非常に分かりやすく、感服いたしました。

早速、ご教授いただきました通りに取り組んでみたいと思います。

ありがとうございました。

お礼日時:2007/08/26 11:36

ちょっと邪道かもしれませんが、以前居た会社で実際に行っていた方法を書いてみます。



方法1.Windows のスケジュールを使ってスクリプトを実行する

方法2.Cygwin をインストールし、cron を Windows サービスとして登録し、cron で時間指定を行う
    • good
    • 0

一般的にはOSに付属している時間起動ツールを使います。


Windowsの場合は、「すべてのプログラム→アクセサリ→システムツール→タスク」で登録します。
Linuxの場合は、cronという機能を使い、crontabコマンドで登録します。

こういうツールを使わない場合は、こんな感じですが、
while(true) {
 time=getdate();
 if(timeが指定時刻か?) {
  処理の実行;
 }
 sleep(60);
}
60秒待ってしまうと微妙にずれていくので工夫が必要でしょう。
    • good
    • 0
この回答へのお礼

ありがとうございます。

実は、
 if(timeが指定時刻か?) {
の部分の、まさにこの括弧内をどう表現すればよいのか、表現すれば実行されるのか、という部分が疑問でした。

また、仰るようにタイムアウトなどの問題もありますよね。

まだまだ勉強しなくてはいけないと、改めて思いました。
ありがとうございます。

お礼日時:2007/08/26 11:30

タスクスケジューラでバッチで実行すればよいでしょう。



http://www.atmarkit.co.jp/fwin2k/win2ktips/335ta …

メールを送るのはmail関数などになるかと。

http://www.php.net/manual/ja/ref.mail.php
    • good
    • 0
この回答へのお礼

ありがとうございます。

ウィンドウズのクスクスケジューラとPHPを組み合わせるということですね。
ただ、それですと、phpを使う必要もない気がします。
メーラーと組み合わせたほうが効率的ではないかと。

(質問の仕方がまずかったですね…。
phpを使うのは、web上での機能としてという意味でした。)

お礼日時:2007/08/26 11:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!