- ベストアンサー
open MAILでの"|"
open MAIL,"| $sendmail $mailto"; に"|"がありますが、どういう意味でしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
> 「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 に渡すという意味です。
その他の回答 (4)
- zxcv0000
- ベストアンサー率56% (111/196)
> 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 なのと同じ事情です。
お礼
解釈1と解釈2は答え方の違いで同じデータなのですね。"Content-type: text/plain; charset=ISO-2022-JP\n"が、sendmailプロセスに送るデータであり、smtpヘッダなのですね。ありがとうございました。
- ryu_chan
- ベストアンサー率37% (69/186)
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プロンプトからの想像で書い てますが。
お礼
cat mail.txtは実行できました。sendmailはrootで実行すれば、コマンドを受け付けました。(rootからでないとcommand not foundとなりました。)ただ、メールの設定をしていないからでしょうか、メッセージが表示されることもなく、ウィンドウを閉じなければ抜けられなくなりました。ありがとうございました。
- ryu_chan
- ベストアンサー率37% (69/186)
私は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の入力になると いう仕組みです。
補足
パイプのことが理解できました。ありがとうございます。 print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; は、どのようなものを出力しているのでしょうか? "Content-type: text/plain; charset=ISO-2022-JP\n"は引数とかコマンドでいうと何なのでしょうか?
- Tacosan
- ベストアンサー率23% (3656/15482)
「open MAIL」で切っちゃだめ. "$sendmail $mailto" というコマンドを実行し, そこにパイプで出力するという意味. 詳しくは see perldoc perlfunc.
お礼
Tacosanが正しいです。ありがとうございました。
補足
$sendmailは、#sendmailコマンドのパスを代入しています。$mailtoは、送信先メールIDを設定しています。ので、"$sendmail $mailto"はコマンドではありません。open MAILは区切られています。 open MAIL,"| $sendmail $mailto"; print MAIL $message; close MAIL; と記述されています。
お礼
何とか理解できました。"|"はzxcv0000さんがおっしゃっていることに加え、Tacosan(さん)がおっしゃっている通りパイプでなのですね。ありがとうございました。