• ベストアンサー

open MAILでの"|"

open MAIL,"| $sendmail $mailto"; に"|"がありますが、どういう意味でしょうか?

  • peiee
  • お礼率60% (51/84)
  • Perl
  • 回答数5
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • zxcv0000
  • ベストアンサー率56% (111/196)
回答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 に渡すという意味です。

peiee
質問者

お礼

何とか理解できました。"|"はzxcv0000さんがおっしゃっていることに加え、Tacosan(さん)がおっしゃっている通りパイプでなのですね。ありがとうございました。

その他の回答 (4)

  • zxcv0000
  • ベストアンサー率56% (111/196)
回答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 なのと同じ事情です。

peiee
質問者

お礼

解釈1と解釈2は答え方の違いで同じデータなのですね。"Content-type: text/plain; charset=ISO-2022-JP\n"が、sendmailプロセスに送るデータであり、smtpヘッダなのですね。ありがとうございました。

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答No.4

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
peiee
質問者

お礼

cat mail.txtは実行できました。sendmailはrootで実行すれば、コマンドを受け付けました。(rootからでないとcommand not foundとなりました。)ただ、メールの設定をしていないからでしょうか、メッセージが表示されることもなく、ウィンドウを閉じなければ抜けられなくなりました。ありがとうございました。

  • ryu_chan
  • ベストアンサー率37% (69/186)
回答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の入力になると いう仕組みです。

peiee
質問者

補足

パイプのことが理解できました。ありがとうございます。 print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; は、どのようなものを出力しているのでしょうか? "Content-type: text/plain; charset=ISO-2022-JP\n"は引数とかコマンドでいうと何なのでしょうか?

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「open MAIL」で切っちゃだめ. "$sendmail $mailto" というコマンドを実行し, そこにパイプで出力するという意味. 詳しくは see perldoc perlfunc.

peiee
質問者

お礼

Tacosanが正しいです。ありがとうございました。

peiee
質問者

補足

$sendmailは、#sendmailコマンドのパスを代入しています。$mailtoは、送信先メールIDを設定しています。ので、"$sendmail $mailto"はコマンドではありません。open MAILは区切られています。 open MAIL,"| $sendmail $mailto"; print MAIL $message; close MAIL; と記述されています。

関連するQ&A

  • メールを送信しました。と出るのにメールが届きません。

    下記のように設定したのですが、どこがいけないのでしょうか? $SENDMAIL = '/usr/sbin/sendmail'; $MAILTO = '<自分のメールアドレス>'; if($ENV{'REQUEST_METHOD'} eq 'POST') { read(STDIN, $query, $ENV{'CONTENT_LENGTH'}); } else { $query = $ENV{'QUERY_STRING'}; } # フォームデータの復元 foreach $pair (split(/&/, $query)) { ($key, $value) = split(/=/, $pair); # 文字のデコード $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $FORM{$key} = $value; } # MIMEエンコード $mail_to = mimeencode($MAILTO); $mail_from = mimeencode($FORM{'name'}); $mail_subject = mimeencode($FORM{'subject'}); # 文字コードの変換 $body = jcode::jis($FORM{'msg'}); # メールヘッダーの生成 $header = <<END; To: $mail_to From: $mail_from<$FORM{'email'}> Subject: $mail_subject Mime-Version: 1.0 Content-Type: text/html; charset=ISO-2022-JP END # メールの送信 open(MAILTO, "| $SENDMAIL -i -t -f $FORM{'email'}") or die("エラー:sendmailへのパイプが開けません"); print MAIL "$header, $body"; close MAIL; # サーバー出力 print <<END;

    • 締切済み
    • CGI
  • (海外特定サーバ)メールが届かない

    過去の質問にも同じ、質問があったのですが、解決法(-f)を試したところ、うまくいかなかったので、重複しますが質問させていただきます。 sendmailのパスは、あっているのに、メールが届きません。他のサーバでは、うまく動いています。 メール送信のCGI部分は、以下の通りです。 -------------- sub mailsend{ &jcode'convert(*subject, "jis"); $mailhead = "To: $mailto<$mailto>\n"; $mailhead .= "From: $adminname<$mail>\n"; $mailhead .= "Subject: $subject\n"; $mailhead .= "\n"; if (-x $sendmail) { unless (open(OUT, "| $sendmail $mailto > /dev/null")) { &mail_err(); } unless (print OUT &mimeencode($mailhead)) { &mail_err(); } unless (print OUT $mailbody) { &mail_err(); } close(OUT); } else { &mail_err(); &error("$sendmailがありません。"); } } sub mail_err { &error("メールの送信に失敗しました。"); } ----------------------- エラーは、なにも返ってきません。 ちなみに、このサーバは、 1. 同じ断層にファイルをおいても、フルパスをかかなくてはいけない (フルパス例:/home/content/ログイン名の頭文字1/2/3/ログイン名/html/) 2. CGI-BINフォルダではなくCGIにする 3. CGI以下の断層では、image等は、表示されない という注意点があります。

  • sendmailが上手く動かないのかメールが届きません

    こんにちは。 sendmailが上手く動かなくて困っています。特にエラーは出ないのですが、メールが全く届きません。 以下プログラムです。(必要そうな箇所だけ) $sendmail = '/usr/sbin/sendmail'; $mail ='mail@xxx.xx'; $msub = 'メールタイトル'; &mailto if ($sendmail && $mail); sub mailto { $mcom = $FORM{'comment'}; $mcom =~ s/&lt;/</g; $mcom =~ s/&gt;/>/g; # メール本文 $mbody = <<"EOM"; $mcom -------------------------------- ホスト名:$host ブラウザ:$ENV{'HTTP_USER_AGENT'} -------------------------------- EOM if ($msub eq ""){ $msub = NO Subject; } &jcode'convert(*msub,'jis'); &jcode'convert(*mbody,'jis'); open(MAIL,"| $sendmail -t") || &result; print MAIL "To: $mail\n"; print MAIL "From: $mail\n"; print MAIL "Subject: $msub\n"; print MAIL "MIME-Version: 1.0\n"; print MAIL "Content-type: text/plain; charset=ISO-2022-JP\n"; print MAIL "Content-Transfer-Encoding: 7bit\n"; print MAIL "X-Mailer: $ver\n\n"; print MAIL "$mbody\n"; close(MAIL) || &result; } プログラムは一言フォームからコメントを受け取るものです。 jcodeの読み込み、decode等は正常に行われており、openやcloseの前後にprint $mbodyなどしてみても正常に表示されることから、確かだと思います。 他の有名なCGIサイトさんのスクリプトや本等を参考に自作したもので、もちろんそれらのメールフォームは正常に動きます。 ですから、何か小さなミスをしているだけだと思うのですが、それが何なのか見つけることが出来ません。 もし何かお気づきの点がありましたら、教えていただければと思います。

    • ベストアンサー
    • Perl
  • Sendmailで送信すると本文にメールヘッダーが出る

    いつもお世話になります。 PerlでSendmail送信プログラムは何回か作ったことが有るのですが、いつもと同じように作っているつもりにも関わらず、送信されたメール本文の1~2行目に Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP が表示されます。 コードは$mailtoや$mail_from、$mail_subjectなどをMIMEエンコードしてから下記の様なコードでメールヘッダーを作成し $header = <<END; To: $mailto Bcc:$mail From: $mail_from<$mail> Subject: $mail_subject Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP END #メールの本文を下記のように作成 $body = <<END; メール本文 END $mbody=jcode::jis($body); #Sendmailで送信する。 open(MAIL, "| $SENDMAIL -i -t -f $mail") or die("ERROR: exec sendmail."); print MAIL $header, $mbody; close MAIL; というコード-です。 なにが原因かおわかりの方宜しくお願いします。

    • ベストアンサー
    • Perl
  • メールOPENできないや

    私のメールアドレスはOPENできないので、協力してください。暗証番号はなど、ぜんぜん大丈夫ですけど。。。

  • mb_send_mail sendmailについて

    PHPが使える無料レンタルサーバーで会員管理画面を作ろうとしているものです。だいぶ完成してきて、残りは登録した人に会員登録したことをメールで自動送信することができるようになれば完成というところまできました。無料レンタルサーバーの利用についての説明の中ではsendmailは利用可となっています。私はメール送信のプログラムを作ったことがないので、しきりに本を読みながら悪戦苦闘しております。本の中のサンプルを参考に下のようなソースを書いて、テストしていますがダメでした。 $mailto="*****@***.biglobe.ne.jp"; $mailsbj="新規登録"; $mailbody="登録者ができました"; $mailheader="From:****@yahoo.co.jp\nReply-To:*****@***.biglobe.ne.jp\nX-Mailer:phpversion();" mb_language("ja"); if(mb_send_mail($mailto,$mailsbj,$mailbody,$mailheader)){ echo "メールの送信に成功"; } else{ echo "メール送信失敗"; } 利用している無料レンタルサーバ内のsendmailの説明の中には sendmailのパス:/usr/lib/sendmail と記入されています。 web上で色々調べてみましたが、どうも今一よくわかりませんでした。mb_send_mailは使えないと言うことでしょうか? もし、sendmailを使用してメール送信をする場合にはどんなソースを書けばよいのでしょうか。 どなたかご指導宜しくお願いいたします。

    • ベストアンサー
    • PHP
  • sysopenを使用したメール送信の方法について

    perlでメールフォームを作成しています。 メールの送信にはsendmail をopen関数で使用していたのですが openはセキュリティ上の問題があることを知り、対策を調べているうちに sysopenを使用することが有効だという情報にたどり着きました。 しかし、単純にopenをsysopenに書き換え、オープンモードも設定したのですが sysopenに失敗してしまいます。 sendmail以外のテキストファイルのオープンには成功しているので sysopenの使用方法が間違っている sysopenを使用したsendmailの実行方法を教えていただけませんでしょうか? [ソース] use Fcntl; … $sendmail = '/usr/xxx/sendmail -t -io'; … sysopen(MAIL,"$sendmail ", O_WRONLY ) or die "error!!" my $mailstr = &MAILHEADER($to,$subject); my $mailbody = &MAILBODY($fileId); $mailstr .= $mailbody; print MAIL $mailstr; close MAIL; &MAILHEADER()   →To,From,Subjectの設定 &MAILBODY()   →メール本文の設定 ・sysopen部分は今まで以下の記述で、メールの送信をしていました。   open(MAIL,"| $sendmail") or die "error!!"  ・念のため、-fで「/usr/xxx/sendmail」の存在チェックをおこない、   存在していることを確認しました。  ・sysopenの使用方法が間違っているのかと思い、以下のサンプルを作成してみましたが   問題なく動きました。 my $file = 'test1.txt'; sysopen(MSG,$file, O_WRONLY|O_CREAT|O_APPEND ) or die "sysopen error!!" print MSG "sysopen OK"; close MSG; サンプルが動いたことで、ますますsendmailをオープンできないことに 行き詰ってしまいました。 どうぞよろしくお願いいたします。 質問内容でわかららない部分があればご指摘ください。 可能な限りソースも載せます。

    • ベストアンサー
    • Perl
  • メールフォームを作成したい

    お世話になります。 今、とあるイントラネット上で、問い合わせフォームを作成し、メールで内容を送信するページを作成して欲しい、といわれました。 早速フリーのCGIを編集しなおしてテストしてみたのですが、肝心なことにsendmailがないことに気づきました。 ただ、ユーザーが使用するメーラーはoutlookとは限らず、<form>の中で"mailto:..."を宣言するだけではダメなのです。 サーバはOSwin2000、SSIです。perlは以前から必要だったのでインストール済み、後はおそらくsendmailの処理だけなのですが、sendmailをイントラネットサーバに入れることは簡単なのでしょうか。入れるとしたら考慮する点はどんな事でしょうか。もしくは、sendmailを使用しない方法等ご存知の方、教えてください。 現在の仕様はいわゆる一般的なメール送信フォーム、htmlとplで動かすものです。 どうぞよろしくお願いします。 説明が上手く出来なかったので補足が必要であればご指摘お願いいたします。

    • ベストアンサー
    • CGI
  • Mail::Sendmailの使い方

    お世話になっております。 先日よりsendmailの調子がおかしくていろいろ調べているのですが煮詰まってしまったので詳しい方々にご教授頂きたいと思います。 先日よりMovable Type(CMS)でのメール送信のシステムが機能しなくなり、いろいろ調べているとサーバーのsendmailはきちんと機能しているのですが、perlのモジュールMail::Sendmailがうまく作動していないようなのです。 perlでは、 open (SENDMAIL, "/usr/lib/sendmail -t -i"); (中省略) close(SENDMAIL); という原始的な方法ではメールが送信されるのですが、 use Mail::Sendmail;という使い方では、エラーにはなりませんがずっと読み込み中…状態が続いてメールが送信されませんでした。 Movable TypeでもMail::Sendmailが利用されていますのでここが原因かと思いますが、Mail::Sendmailを使用するにあたって注意すべきこと、または設定すべきことはどのようなことがあるでしょうか?さしあたりどこをチェックしてよいのかわからなくて困っています。 よろしくお願いします。 Mail::Sendmailを利用して作成したスクリプトは以下のようなものです。 #!/usr/bin/perl use strict; use warnings; use Mail::Sendmail; use Encode; use utf8; my $subject = "テスト"; my $message = "テストです。ほげほげ。"; $subject = encode("MIME-Header-ISO_2022_JP", $subject); $message = encode("iso-2022-jp", $message); my %mail = ( "Content-Type" => 'text/plain; charset="iso-2022-jp"', To => 'to@example.com', From => 'from@example.com', Subject => $subject, Message => $message, ); sendmail(%mail); exit;

    • ベストアンサー
    • Perl
  • sendmailで複数アドレスに送信するも2件までしか送信出来ない

    会員向けメール通信システムを作成しています。(けしてSPAMではありません。) PerlCGIによりSendMail送信させますが、次のようなコードで(一部省略しています。) # =================================================== $MAILTO="xxx\@xxxx.com;ooo\@oooo.com"; $mail_to = mimeencode($MAILTO); $mail_from = mimeencode($from); $mail_subject = mimeencode($subject); $m_header = <<END; Bcc: $mail_to From: $mail_from<$mail> Subject: $mail_subject Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP END # sendmailで送信 open(MAIL, "| $SENDMAIL -t -f $mail"); print MAIL $m_header, $m_body; close MAIL; # =================================================== で表記のように $MAILTOが2件までなら送信が出来ますが "xxx\@xxxx.com;ooo\@oooo.com"; ではなく "xxx\@xxxx.com;ooo\@oooo.com;aaa@aaa.jp"; の様に3件以上になると送信されません。 なにが原因であるかと、対応策を教えて下さい。

    • ベストアンサー
    • Perl

専門家に質問してみよう