解決済みの質問
> 「open MAIL」で切っちゃだめ.
賛成。 「open MAILでの"|"」というタイトルでは、open MAIL という名前のソフトウェアかライブラリの話題かと思います。
open MAIL,○×△ と言うのは、「MAILという勝手に付けた名前のファイルハンドルをオープンする」と言う記述です。
> "$sendmail $mailto"はコマンドではありません。
いや、コマンドですよ。 「コマンド」という用語の意味を誤解されているのでは無いでしょうか。
きっと、「コマンドは open であって MAIL と "$sendmail $mailto" は引数だと思われてるんですね?
・ open は、コマンドでは無く関数です。
・ MAIL と "| $sendmail $mailto" は open の引数です。
・ "| $sendmail $mailto" の内部の、 $sendmail $mailto は外部コマンドと言う物です。 Perlの子プロセスとして OSに実行されます。
=======================================================
ここまで説明して、やっと最初の質問の回答が可能になりました。
「|」は、続く $sendmail $mailto が外部コマンドであることを宣言すると同時に、Perlスクリプトが MAIL に書き込んだ内容を、外部コマンドプロセスの STDIN に渡すという意味です。
投稿日時 - 2009-10-07 16:15:58
お礼
何とか理解できました。"|"はzxcv0000さんがおっしゃっていることに加え、Tacosan(さん)がおっしゃっている通りパイプでなのですね。ありがとうございました。
投稿日時 - 2009-10-07 17:15:13
0人が「このQ&Aが役に立った」と投票しています
ベストアンサー以外の回答(4件中 1~4件目)
> print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
> は、どのようなものを出力しているのでしょうか?
観点によって、答えが変りますね。
解釈1 sendmail プロセスに送るデータ
パイプで送るんだから、当然ですね。
解釈2 smtpヘッダ(の一部)
sendmailコマンドは、基本的にはメール送信コマンドです。 入力データをメールメッセージとしてメール配送サーバーに送ります。
このとき、sendmailは入力データのうち最初の空行までをメールヘッダ、以降を本文として送ります。
恐らく、print MAIL "Content-type:...."; の後で空行を出力しているでしょう?
Content-type と言うヘッダは HTTP でも定義されていますが、ここでは sendmail に送っているので SMTPヘッダです。
# SMTP というのは、メール配送プロトコルの名前です。 Web閲覧プロトコルが HTTP なのと同じ事情です。
投稿日時 - 2009-10-08 16:27:58
お礼
解釈1と解釈2は答え方の違いで同じデータなのですね。"Content-type: text/plain; charset=ISO-2022-JP\n"が、sendmailプロセスに送るデータであり、smtpヘッダなのですね。ありがとうございました。
投稿日時 - 2009-10-09 00:09:42
print文で出力した文字列を何と呼ぶかは分からないです。
sendmailコマンドに対する入力でいいのではないでしょうか。
UNIXを使ったことがないのでsendmailの具体的な使い方は知りませんが、
下記サイトにsendmailの使い方が載っています。
UNIXの部屋 コマンド検索:sendmail (*BSD/Linux)
http://x68000.q-e-d.net/~68user/unix/pickup?sendmail
コマンドラインより
sendmail foo@example.com[Enter]
と打ち込むと、実際にメールに流す文字を要求してくるようです。
このメールに流す実際の文字列をprint文で書いていることになると思います。
例えば、パイプを使って、
cat mail.txt | sendmail foo@example.com
と打ち込むと、catコマンドはファイルの内容を表示するコマンドなので、ファイ
ルの内容が出力されて、それがパイプを通って、sendmailの入力となるので、結局、
ファイルの内容をメール送信することになります。
ただこの場合、上記サイトにも書いてあるようにパイプでなくリダイレクトを使う
ほうが簡潔です。
sendmail foo@example.com < mail.txt
UNIX(やLinux)を使ったことがないので、あくまでDOSプロンプトからの想像で書い
てますが。
参考URL:http://x68000.q-e-d.net/~68user/unix/pickup?sendmail
投稿日時 - 2009-10-07 21:23:50
お礼
cat mail.txtは実行できました。sendmailはrootで実行すれば、コマンドを受け付けました。(rootからでないとcommand not foundとなりました。)ただ、メールの設定をしていないからでしょうか、メッセージが表示されることもなく、ウィンドウを閉じなければ抜けられなくなりました。ありがとうございました。
投稿日時 - 2009-10-08 23:52:50
私はWindowsでちまちまと趣味プログラムを書くだけなのでパイプはあまり使
いませんが、UNIX系の人はよく使うと思います。
DOSプロンプトで、たくさんのファイルがある場合、
C:\>dir | more
とかしますよね。
dirコマンドの出力(この場合、ファイルの列挙)を、moreコマンドの入力に
しています。
パイプ(記号:|)は、あるコマンドの出力を次のコマンドの入力にします。
質問の件ですが、
"| $sendmail $mailto"
は、$sendmail(実体は、おそらく/usr/lib/sendmailというようなコマンド名
だと思いますが)という外部コマンドが$mailtoという引数を伴って実行されます。
そして、先述したように、パイプ(記号:|)の前の出力を入力として実行さ
れます。
ところが、パイプ(記号:|)の前にコマンドがないので、何が入力されるのか
わかりませんよね。
実は、
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
と、print文で書いた文字が、パイプ(記号:|)の前の出力に相当するのです。
なのでパイプの機能の通り、その出力が次のコマンド$sendmailの入力になると
いう仕組みです。
投稿日時 - 2009-10-07 17:30:52
補足
パイプのことが理解できました。ありがとうございます。
print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n";
は、どのようなものを出力しているのでしょうか?
"Content-type: text/plain; charset=ISO-2022-JP\n"は引数とかコマンドでいうと何なのでしょうか?
投稿日時 - 2009-10-07 20:01:31
「open MAIL」で切っちゃだめ.
"$sendmail $mailto" というコマンドを実行し, そこにパイプで出力するという意味. 詳しくは see perldoc perlfunc.
投稿日時 - 2009-10-07 14:54:59
補足
$sendmailは、#sendmailコマンドのパスを代入しています。$mailtoは、送信先メールIDを設定しています。ので、"$sendmail $mailto"はコマンドではありません。open MAILは区切られています。
open MAIL,"| $sendmail $mailto";
print MAIL $message;
close MAIL; と記述されています。
投稿日時 - 2009-10-07 15:42:20
お礼
Tacosanが正しいです。ありがとうございました。
投稿日時 - 2009-10-07 17:17:04