CGI-BBS > 基礎 > その他 > 指定した時間にメールを送りたい


カレッヂ
カレッヂ


質問者 やまさん  投稿日 2/24(土) 02:04:48
最近携帯電話へメールすることが増えてきて
困っているのが、パソコンへのメールはいつでも送れますが
(パソコンへも本当は常識的な時間に送信するべきでしょうが・・・)
携帯電話は受信者が電源を入れてると夜中でも着信音がなって
受信者に迷惑がかかってしまうので、あらかじめ
作成したメールを指定した時間に送る(夜メールを作って昼に送信する)
ようなものは無いのでしょうか、どなたか教えて下さい
回答者 まさ  [削除]  投稿日 2/24(土) 19:36:21
これにはcron(クーロン)が使えると思います。

cronとは、指定した日時、曜日に特定のプログラムを起動するUNIXのデーモンです。

Windowsにもタスクスケジューラ(名前ははっきりわかりません)か何かが付いていますよね。
あれのUNIX版だと思って頂ければいいでしょう。

しかし日本のプロバイダーの多くはcronを使えません。アメリカのレンタルサーバーなら
使えるところも多いのですが。

まず最初に、cronのデーモン「crond」が起動されているかを調べます。
shellで入って、

% ps ax|grep cron
123 ?          S         0:00 crond
12345 pts/0    S         0:00 grep cron

これでcrondと出てくれば使えます。
出れこなければ、管理者にcronを使いたい旨の連絡をすれば入れてくれるかもしれません。

cronはcrontabと言う設定ファイルを使いますが、詳しくは

man 5 crontab

を見てください。
cronが使えるのであれば、また教えて下さい。設定方法も教えます。
質問者 やまさん  [削除]  投稿日 2/26(月) 09:37:07
丁寧な回答ありがとうございます。
基礎的なことかもしれませんが
shellにはいってという意味が分からないのです
ただ、自分のサーバーはドットCOMのアメリカの
レンタルサーバーのはずなので、是非トライしてみようと
思っていますので、申し訳ありませんが、教えてくれますでしょうか
よろしくおねがいします。m(__)m
回答者 まさ  [削除]  投稿日 2/26(月) 18:20:35
アメリカのサーバーなら使えるかもしれませんね。

shellと言うのは、telnetの事です。
アメリカのサーバーなら恐らくtelnetも使えると思います。
telnetでログインしてUNIXのshellに入って下さい。
そして上記のコマンドを実行して使えるか確認してみて下さい。

質問者 やまさん  [削除]  投稿日 3/2(金) 22:26:46
やっとログイン出来入力しましたが
command not found
とばかり出てしまいます
これはだめって言うことでしょうか
がんばってやってみたのですがとほほ・・(TT)
いろいろありがとうございました。
でも今回TELNETの勉強になりました。
回答者 まさ  [削除]  投稿日 3/3(土) 21:10:14
もしかして頭に%付けていませんか?
わたしが書いた頭の%はshellのプロンプトです。
UNIXは(DOSでもそうですが)プロンプトを好きなようにカスタマイズすることができます。
ですから一般的な環境を表すのに%を使うのは流儀です。

実際に入力するのはそれ以降です。



質問者 やまさん  [削除]  投稿日 3/4(日) 00:30:08
本当にご親切にありがとうございます。
まずman 5 crontab

といれるとこんな風に出ました
CRONTAB(5)                                             CRONTAB(5)

NAME
       crontab - tables for driving cron

DESCRIPTION
       A crontab file contains instructions to the cron(8) daemon
       of the general form: ``run this command at  this  time  on
       this  date''.   Each  user has their own crontab, and com-
       mands in any given crontab will be executed  as  the  user
       who  owns  the  crontab.   Uucp and News will usually have
       their own crontabs, eliminating the  need  for  explicitly
       running su(1) as part of a cron command.

       Blank  lines  and  leading  spaces  and  tabs are ignored.
       Lines whose first non-space character is a pound-sign  (#)
       are comments, and are ignored.  Note that comments are not
       allowed on the same line as cron commands, since they will
       be  taken  to be part of the command.  Similarly, comments
       are not allowed on the same line as  environment  variable

ps ax|grep cron
123 ?          S         0:00 crond
12345 pts/0    S         0:00 grep cron

といれると

ps ax|grep cron
  886  ?  S    0:00 perl /usr/cbin/crond_check
14027  ?  S    0:00 /usr/sbin/crond
18036  p0 S    0:00 grep cron
ninja:/usr/home/q-car$ 123 ?          S         0:00 crond
bash: 123: command not found
ninja:/usr/home/q-car$ 12345 pts/0    S         0:00 grep cron
bash: 12345: command not found

と出ます。
果たしてOKなのでしょうか、簡単にできるかなと思っていましたが
すごく難しそうです。でもせっかくやり始めたのでがんばってやろうと思います
のでよろしくお願いします。

回答者 まさ  [削除]  投稿日 3/4(日) 19:58:47
cronが使えるようですね。
それでは設定してみましょう。
設定はcrontabで行います。
ここにいつ何時に何を実行するか記述します。
crontabにはいろいろなオプションスイッチがありますがここでは省略します。

現在のcron設定を編集する。設定内容がない場合は新規作成する。これは以下を実行します。
% crontab -e

crontab の中身は以下のような書式です。
* * * * * [コマンド]
意味は省略します。

例えば毎日朝4時30分に、あるCGIを実行したければ
30 4 * * * /usr/local/bin/perl /foo/public_html/cgi-bin/foo.cgi

これで4:30にfoo.cgiが実行されます。perlとfoo.cgiは絶対パスで記述して下さい。
同じく13:15に実行したければ、
15 13 * * * /usr/local/bin/perl /foo/public_html/cgi-bin/foo.cgi
です。最初が分、次が時間です。次が日、月、週を表します。

質問者 やまさん  [削除]  投稿日 3/9(金) 02:21:10
いつも親切にありがとうございます。
この設定は、shellで入って設定するのでしょうか

まず最初に基礎的なことだと思うのですが
15 13 * * * /usr/local/bin/perl /foo/public_html/cgi-bin/foo.cgi
としたこの文はどこに置くのでしょうか/usr/local/bin/perl これはよく
cgiの頭に付けています。
基本的な考えとしてfoo.cgiと言うメールを送るcgiを作って
サーバーに置いておいて、それを上記パスで実行するということで良いのでしょうか

あと絶対パスはいわゆる自分がいつもftpでアップロードしているディレクトリ
(foo.cgiを置く場所)でいいのでしょうか

最後に15 13 * * *の所で15 13 10 3 *なら3月10日の15時30分
となるのだと思うのですが最後の週になるところは年間通しての週(年52週)
で書くのでしょうかそれとも書かなくてもいいのでしょうか、または3月の1週目と考える
のがいいのでしょうか・・・。

なんかちんぷんかんぷんな無いようですが少しつかめてきました、これに懲りず
また教えて下さい。m(__)m よろしくお願いします。

回答者 まさ  [削除]  投稿日 3/9(金) 18:09:54
> いつも親切にありがとうございます。
> この設定は、shellで入って設定するのでしょうか

そうです。shellで作業を行います。

> まず最初に基礎的なことだと思うのですが
> 15 13 * * * /usr/local/bin/perl /foo/public_html/cgi-bin/foo.cgi
> としたこの文はどこに置くのでしょうか/usr/local/bin/perl これはよく
> cgiの頭に付けています。
> 基本的な考えとしてfoo.cgiと言うメールを送るcgiを作って
> サーバーに置いておいて、それを上記パスで実行するということで良いのでしょうか

これはshell上で
% crontab -e
とすればエディターが立ち上がるのでそこに直接
15 13 * * * /usr/local/bin/perl /foo/public_html/cgi-bin/foo.cgi
と打ち込みます。

crontabが存在すれば既にあるものが出てきます。なければ自動的に新規作成されます。

この例ではおっしゃるように指定された時間にfoo.cgiがperlスクリプトとして実行されます。
それがメールを送るものなら自動的にメールを送ることなります。

> あと絶対パスはいわゆる自分がいつもftpでアップロードしているディレクトリ
> (foo.cgiを置く場所)でいいのでしょうか

これはそのプロバイダーによりますので一概には言えませんが、大体そうですね。

> 最後に15 13 * * *の所で15 13 10 3 *なら3月10日の15時30分
> となるのだと思うのですが最後の週になるところは年間通しての週(年52週)
> で書くのでしょうかそれとも書かなくてもいいのでしょうか、または3月の1週目と考える
> のがいいのでしょうか・・・。

最後の週は0〜7の数字で表します。
0が日曜日、1が月曜日……、7がまた日曜日です。
ですから3月10日と限定してしまうと週は書かなくてもいいです。
これは普通一週間のある曜日だけ実行させたい場合に使います。
例えば
* * * * 1 [コマンド]
と書けば毎週月曜日に実行します。

最後にcrontabの例です。

#0分ごとに実行する
0 * * * * [コマンド]

#5分おきに実行する
*/5 * * * * [コマンド]

#1日1回,0時0分に実行する
0 0 * * * [コマンド]

#0時から23時までの2時間おきに,毎23分ごとに実行する
23 * 0-23/2 * * [コマンド]

#1月と12月それぞれの1〜20日,23時0分に実行する
* 23 1-20 1,12 * [コマンド]

#月曜日から土曜日まで1分おきに実行する
*/1 * * * 0-6 [コマンド]

ちなみに#で始まるものはコメントとして扱われます。
質問者 やまさん  [削除]  投稿日 3/15(木) 02:02:35
いつもいつもお世話になっています。
いろいろトライしていますが
crontab ーeと打つと画面に~記号が縦にずらりと並び
一番最後に"/tmp/crontab.20315" 1 line, 1 char
と言う文字が反転状態で書かれていてなにも打てなくなります。
いろいろやっているうちに -l をつけるとリストが出てくることが分かり
no corntab何とかとでて、なにも設定されていませんよ・・・みたいな
メッセージが出てくるので、入力は間違っていないはずですが
もしかしたらこれがエディットの画面なのでしょうか?

ただいま同時進行でメールを送るcgiを作っています。
こちらはうまくできつつあるので、だんだん詰めの作業になってきているのかなと
思っていますが、はたしてこれでよいのでしょうか、手間をかけてしまいますが
また教えて下さい。
回答者 まさ  [削除]  投稿日 3/15(木) 08:43:28
>crontab ーeと打つと画面に~記号が縦にずらりと並び
>一番最後に"/tmp/crontab.20315" 1 line, 1 char

そのエディターはviですね。viはUNIXではEmacsと並んでメジャーなエディターです。
しかし慣れないと文字を入力することすらできません。メニューもツールバーも何もないです
からね。しかしこれを使いこなすと既存のエディターには戻れないほどいい使用感があります。
わたしも慣れるまでは1ヶ月ほどかかりました。まあ、viのことについはここまでにしといて。

一番最後の行に表示されている/tmp/crontab.20315これがcrontabのファイル本体です。
ここでは気にしなくてもいいです。

viでは何もしなければ、それはコマンド入力状態です。文字入力状態ではないです。
1行何か既に入っているようなのでそれは削除しましょう。
カーソルが1行目に来ていると思いますので、「dd」と打ちます。そうするとその行が消えます。
次に入力モードに切り替えます。これには「i」を打ち込みます。何も変化はないですが、これで
viはユーザーがタイプしたもの全て画面に表示されます。
cronのコマンドを打ち込んで下さい。決して間違えないで下さい。viの編集はややこしいので
ここではしません。もし間違えたらエスケープを押して、「dd」と打って「i」と打ってもう
一度最初からやり直して下さい。

入力が終わったら、保存しましょう。説明はしませんが次を行って下さい。
エスケープを押す。「:wq」と打つ。

これでviが終了し、crontabが出来ました。
あとはそのperlスクリプトを指定した場所に置けば、自動的にメールを送ります。

回答者 まさ  [削除]  投稿日 3/16(金) 21:11:25
補足しますが、現在すでにcrontabが設定されていてそれを編集するのが嫌ならばいっそ
crontabを削除して新規に作成するほうがいいと思います。

% crontab -l

これで現在のcronの設定が見れますので、必要ないなら

% crontab -r

これで削除して下さい。そして

% crontab -e

で新規に作成するほうが楽ですね。

質問者 やまさん  [削除]  投稿日 3/24(土) 02:29:31
少々間が空いてしまいましたが、CGIがうまくできず、とりあえず
自分のアドレスに送るような簡単な物を作ってやってみました。
なんと動いたんです・・・当たり前なのかもしれませんがうれしいですね
後は一括送信のできるCGIをきっちりと完成させないといけないのですが
サーバー管理者からあまり負荷のかかる物は勘弁を・・・ということなので
少々頭を悩ませています。が何とかなると思ってます。
長々とお付き合い下さいまして本当に本当にありがとうございました
コンピュターはこれからもっともっと進化して便利になって行くのでしょうが
便利になればなるほど、こういったプログラムという物は難しくなるんでしょう・・
今回、何回知恵熱出そうに(出た)なったことか・・・でもやりがいは有りますね
自分の仕事はこういったPCとは全く関係のない仕事をしていますが、PCを
生かして仕事をやっていく上で自分でできるならやってみようと日夜格闘しています
どこのどなたか分からないのに、いろいろ親切にしていただきまして本当に感謝しています
ありがとうございました。
岡山市在住
山本 久司

回答者 クロックメール  [削除]  投稿日 4/12(金) 13:12:56
こんにちは。

こういうサービスを用意してあるのでよかったら使ってみてください。
http://clockmail.ath.cx/
非常にシンプルで保証もありませんが、
意外と便利です。

失礼します。

返信(回答)する


Web裏技