No.2ベストアンサー
- 回答日時:
> 「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 に渡すという意味です。
何とか理解できました。"|"はzxcv0000さんがおっしゃっていることに加え、Tacosan(さん)がおっしゃっている通りパイプでなのですね。ありがとうございました。
No.5
- 回答日時:
> 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ヘッダなのですね。ありがとうございました。
No.4
- 回答日時:
print文で出力した文字列を何と呼ぶかは分からないです。
sendmailコマンドに対する入力でいいのではないでしょうか。
UNIXを使ったことがないのでsendmailの具体的な使い方は知りませんが、
下記サイトにsendmailの使い方が載っています。
UNIXの部屋 コマンド検索:sendmail (*BSD/Linux)
http://x68000.q-e-d.net/~68user/unix/pickup?send …
コマンドラインより
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?send …
cat mail.txtは実行できました。sendmailはrootで実行すれば、コマンドを受け付けました。(rootからでないとcommand not foundとなりました。)ただ、メールの設定をしていないからでしょうか、メッセージが表示されることもなく、ウィンドウを閉じなければ抜けられなくなりました。ありがとうございました。
No.3
- 回答日時:
私は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"は引数とかコマンドでいうと何なのでしょうか?
No.1
- 回答日時:
「open MAIL」で切っちゃだめ.
"$sendmail $mailto" というコマンドを実行し, そこにパイプで出力するという意味. 詳しくは see perldoc perlfunc.
この回答への補足
$sendmailは、#sendmailコマンドのパスを代入しています。$mailtoは、送信先メールIDを設定しています。ので、"$sendmail $mailto"はコマンドではありません。open MAILは区切られています。
open MAIL,"| $sendmail $mailto";
print MAIL $message;
close MAIL; と記述されています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP phpのメールフォームの完了画面でメール受信のコードを書いています。 1 2023/05/31 11:39
- PHP php 完了画面の送信メールのコードを書いているのですが・・・ 2 2023/06/02 12:01
- 英語 in the head の意味 4 2023/07/15 07:52
- 消費者問題・詐欺 詐欺 5 2022/08/31 10:00
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- Gmail mail. 1 2023/04/26 18:00
- 英語 この"e-mail"が複数形でもなく、無冠詞なのはなぜですか? 「表現のための実践ロイヤル英文法」に 1 2022/07/10 16:12
- Excel(エクセル) excelvbaのenableeventsについて 3 2022/08/30 11:20
- Perl perlのflock関数でロックをかけたままopen関数で何度もファイルを開きなおすことはできますか 3 2023/05/01 22:25
- その他(プログラミング・Web制作) laravel 本番環境でメールが送れません。 1 2023/02/17 17:57
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Perlの処理待ちコマンド
-
標準モジュールを削除したい。(...
-
Excel VBAでリンク切れをチェッ...
-
'Range'メソッドは失敗しました
-
Sub Workbook_Open()でユーザー...
-
LCD ディスプレイを Raspberry ...
-
VBでグローバル変数を宣言するには
-
モジュールの最大数はいくつな...
-
Friend は標準モジュールじゃ宣...
-
マクロで「モジュールの開放」...
-
別シートに罫線がひけない
-
現在アクティブなフォーム名を...
-
モジュール関連図・モジュール...
-
モジュールとは何ですか
-
複数のフォーム間での変数宣言
-
SWI-Prologでのエラーに関して
-
本当にPublicな変数(配列で)
-
Postfixでメールを受信したらPe...
-
モジュールからフォームのボタ...
-
Excelで時刻になったら知らせて...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
open MAILでの"|"
-
AIX6でファイルのタイムスタン...
-
Perlの処理待ちコマンド
-
LinuxにおいてのPerlのプログラ...
-
Active Directoryでグループに...
-
Perlでexitコードを取得する方法
-
実行中のcpan processを終了さ...
-
時間がかかり過ぎたプロセスを...
-
`ls`標準出力はどこにいった?
-
マルチスレッドとマルチプロセ...
-
HELOコマンドが失敗する。
-
Parallel::ForkManagerについて
-
system関数とqx演算子の違いに...
-
Perlで日本語から始まり記号で...
-
flockの挙動がおかしい。。。
-
perl から unix コマンドを入...
-
my $pid = open PIPE, "-|";の...
-
標準入出力先の検知
-
Perl はOSによって動作が違った...
-
macでperl perldocについての...
おすすめ情報