- - PR -
sendmailコマンド
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-06 16:00
1.Linuxでコマンドラインからmailコマンドでメールを送信すると
すぐに復帰してプロンプトに戻って来るのですが、 sendmailコマンドでメールを送信すると30秒ほどプロンプトに 復帰しません。 sendmailのオプションか何かで、即時復帰できますでしょうか? それとも、sendmailの設定でしょうか? (&をつけてバックグラウンドで実行すると即時復帰しますが、 /usr/sbin/sendmailが起動した分psでみえます) ps -ef | grep sendmail usr 29795 1 0 15:10 pts/28 00:00:00 /usr/sbin/sendmail -t usr 29842 1 0 15:10 pts/28 00:00:00 /usr/sbin/sendmail -t usr 29928 1 0 15:11 pts/28 00:00:00 /usr/sbin/sendmail -t MTA はsendmailです。) 2.数百から数千のメールを、mailコマンドかsendmailコマンド で送ろうと思っていますが、どちらが適当でしょうか? mailコマンドで、1000件の送信は確認できましたが、 Fromの指定の仕方がわからず、sendmailにしようか検討中です。 | ||||||||||||
|
投稿日時: 2005-04-06 23:46
mailコマンドは実際にメール送信を行うわけでなくてMTAに引き渡すだけですが、 sendmailは自身がMTAで、送信までやってしまいますので... 送信に時間がかかれば、返ってくるまで時間がかかることになります。
いっぺんに数千も送ろうとすると相手からハネられたりしそうなので、 そのへんを避ける手間を考えるとmailコマンドを使ったほうが楽じゃないかな、 と思います。
ユーザIDによってfromが決まっていると思います。 mailコマンドの実装によるかもしれませんが。 あと、「エンベロープfromのほうは構わなくてヘッダfromだけ指定 できればいい」という条件であれば、送信するメールにFrom:フィールドを あらかじめ書いておけばO.K.です。 | ||||||||||||
|
投稿日時: 2005-04-08 21:58
お返事ありがとう御座います
>あと、「エンベロープfromのほうは構わなくてヘッダfromだけ指定 >できればいい」という条件であれば、送信するメールにFrom:フィールドを >あらかじめ書いておけばO.K.です。 ↑これ、どうやるんでしょうか? sendmailは ============================ echo "Mime-Version: 1.0" > message.$$ echo "Content-Type: Text/Plain; charset=iso-2022-jp" >> message.$$ echo "Content-Transfer-Encoding: 7bit" >> message.$$ echo "To: aaa@co.jp >> message.$$ echo "From: bbb@co.jp >> message.$$ echo "Subject: テストメール" | nkf -M >> message.$$ echo "X-Mailer: Test driver for xxx mail system" >> message.$$ echo "" >> message.$$ echo "本文 てすと body部" | nkf -j >> message.$$ cat message.$$ | /usr/sbin/sendmail -t ============================ で、いけたのですが mailコマンドでできませんでした。 | ||||||||||||
|
投稿日時: 2005-04-09 08:24
ちょっとつっこみですが、エンベロープfrom (envelope-from) は、
メールヘッダとしての from とは別物です。 この言い方が適切かどうか自信は無いのですが、 ・ヘッダの from:送信元アドレスを、メール受信者に示すため ・envelope-from:送信エラー時のエラーメールの宛先を、サーバに示すため という使い方がなされます。 ちなみに、両方とも送信者の自己申告制です。 ※envelope-fromは、メールサーバによって Received ヘッダに記録されていくのが普通です。 sendmailコマンドであれば、-f オプションで envelope-from を指定できますが、 mailコマンドでは該当するオプションが見つけられませんでした。 コマンド実行ユーザ名から自動生成されるのでは無かったかと記憶しております。 --- すいません、後から訂正です。※の行にあるヘッダ名は、Received では間違いで、Return-Path が正しいです。失礼いたしました。 [ メッセージ編集済み 編集者: angel 編集日時 2005-04-09 09:34 ] | ||||||||||||
|
投稿日時: 2005-04-09 08:49
あーっと、ダメでしたか、すみません。
となると、setuidシステムコールを使ってユーザIDを設定するか、 sendmailをそのまま使うか、あるいはsendmailにひきわたすプログラムを 作ってしまうか、ですね。 それから、いまの問題に対する答えはないですが参考になるかも。 http://www.adl.nii.ac.jp/~moro/unix-programmer/faq-j_6.html#SEC71 | ||||||||||||
|
投稿日時: 2005-04-09 08:57
おまけ。 同時に -F オプションも指定しておいたほうが無難です。 指定しないと、こちらが意図しない形でsendmailがRFC822形式の コメントを加えることがありますので。 | ||||||||||||
|
投稿日時: 2005-04-09 16:13
どもです、がるです。
んっと、…突っ込みます(笑
ちょいと異なりますね。 長くなりますが、SMTPの正しい挙動をざっくりと。 まず、メールを送信したいMTA(sendmailとか)は、メールを送りたい 相手のドメインに対して、smtp portでのTCP/IP接続を試みます。 接続したら、まずは HELO 自分のドメイン名 若しくは EHLO 自分のドメイン名 で、ご挨拶をします。 挨拶を受け入れていただいたら、次はメールの送り主を MAIL FROM:<アドレス> という形式で、先方に伝えます。 次に、メールの送り先を RCPT TO:<アドレス> という形式で、先方に伝えます。 しかる後にメール本文を渡しますが。まずは DATA とだけ入れて、「これからデータ送るんでよろしく」って 依頼をかけます。 DATAコマンドでOKが帰ってきたら、あとはメールの本文を 一気に羅列します。 で、最後は「行頭で」.<CR><LF>を入れて「メール本文の送信が 終了したよ」って伝えてあげます。 これが、SMTPの大まかな動きです(メアド確認とか細かいのは省略)。 さて。上記に出てくる「メール本文」とは、例えば以下のような 物を指します。 [メール本文] From: foo@foo.com To: hokeke@hogehoge.com Subject: test メールのBody部分。まぁ実際にはISO-2022jpであるはず なのですが。 [/メール本文] さて。「本文」と呼ばれるものの中に、通常「ヘッダ」と呼ばれる ものが混じってるので違和感を感じる方もいらっしゃるかと思うのですが。 これが実態です。 んで。 ポイントは「RCPT TOコマンドとかMAIL FROMコマンドで用いられる アドレスってどこから取ってくるの?」って話になります。 sendmailコマンドの場合、「-tがパラメタに指定されている場合、 メール本文からゲット」です。 無論、「メール本文からではなく、コマンドラインから取得」する ことも十二分に可能です(ってかこっちが本来の動作)。 したがって、正確には ・ヘッダの from:ただのお飾り ・envelope-from:SMTP通信でちゃんと用いられるべきアドレス ってことになります。toも一緒ですね。 ちょろっとだけ(ってわりには長いですが)突っ込みでした。 …っと、わき道にそれまくっても恐縮なので、本題にも少しだけ。 数千のオーダーでMail送信するなら、この辺のMailの仕組みは きちんと把握してたほうがよいと思います。 | ||||||||||||
|
投稿日時: 2005-04-09 16:45
脱線ですが。
ヘッダfromは飾りだ、といえばそうなんですが、実際問題として Senderフィールドが用いられることはほとんど無くなっているし、 実際の送信者とFromフィールドの内容が違っているのを spoofing であるとみなす考え方が勢力を増している(特に企業で)こと などからして、結構ビミョーになってきてるなあと思います。 「Fromフィールドの内容に信憑性は無いし、本来は送信者のアドレスを 記入する必要もないのだけれど、このごろでは送信者のアドレスを 書け、という主張が出てきている」といったところでしょうか。 エンベロープfromを何に使うかといえば Return-Path の生成なわけで、 Return-Path を何に使うかといえば DSN の送信先なわけで。 エンベロープfromはエラー通知先として使われる、といってもいいんじゃ ないかなあ、と思いまふ。 # てゆーか、RFC2821ではDSNの送り先をエンベロープfromと規定 # しています。 |