- - PR -
Perl の CGI から sendmail でメール送信
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2003-09-05 11:52
Mime-typeの指定がありませんので、ヒデさんのサンプルを参考に追加して試したらどうでしょう。
> それと、Base64エンコーディングですが、自分はmimew.plを使っています。 へぇ〜、ライブラリもあったんですか。知りませんでした。 RFCによると、改行は「From:」だけでなくヘッダー、本文すべて "\r\n"が正しいですが、sendmail側で処理するのではないでしょうか。 最初のレスに書いた通り SMTP接続する場合は、"\r\n"とする必要があります。 RFCを参照されることをおすすめします。 http://www5d.biglobe.ne.jp/~stssk/rfcjlist.html RFC561, 821, 822, 1468, 2045〜2047, 2049あたりでしょうか。もしかしたらアップデートされて番号が変わっているかも知れません。 | ||||
|
投稿日時: 2003-09-05 11:59
本当にありがとうございます。
メール本文は、以下のようになります。 *koumoku1 これはJISの文です。 *koumoku2 これはJISの文です。 *koumoku3 これはJISの文です。 *koumoku4 これはJISの文です。 Mime-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" X-wakwak: 10383 To: メールアドレス Content-Transfer-Encoding: quoted-printable Date: Wed, 3 Sep 2003 08:09:07 +0900 From: メールアドレス *koumoku5 $B$3$l$O(JJIS$B$NJ8$G$9!#(J *koumoku6 $B$3$l$O(JJIS$B$NJ8$G$9!#(J *koumoku7 $B$3$l$O(JJIS$B$NJ8$G$9!#(J *koumoku8 $B$3$l$O(JJIS$B$NJ8$G$9!#(J 文字化けが始まる位置は、毎回異なります。 時間が取れ次第、ご指摘のヘッダ追加の部分を修正してみます。 結果をまたここで報告させて頂きます。 [ メッセージ編集済み 編集者: asp 編集日時 2003-09-05 12:33 ] | ||||
|
投稿日時: 2003-09-05 12:10
いらないと思いますけど。SMTP接続と混同してるってことはありませんか? | ||||
|
投稿日時: 2003-09-05 12:35
ども、ほむらです。
Marionette氏へ >いらないと思いますけど。SMTP接続と混同してるってことはありませんか? sendmailのマニュアルにはEOFまたは.で終わることって書いてあったので 最初、このサンプル同様close()するだけだったのですが、それだと届かなかったんです。 で、.で終了するようにしたら届くようになってでも、close()があるとなぜか届かなくて asp氏の場合にはclose()で届いているようなので.で終わる必要はないですね 蛇足でした。。。 蛇足ついでに、インターネットメッセージに関するRFCは今ならRFC2822だったと思います。 あと、\nはsendmailで処理しているというよりもテキストモードだから Perl的に\r\nと同様になっている気が。。。。 #Base64に関するライブラリがあるなんて僕も始めて知りました。 #まぁふつうにMIME::Base64でも使い方は簡単ですけど^^;;;;; asp氏へ JISがうまく変換できていないだけみたいですね。 文字化けではないようです。(charsetのせいかな?) | ||||
|
投稿日時: 2003-09-05 12:46
お、ほむらさんもperl出身ですか(笑)。 本来、MIME::Base64 を使うのが王道でしょう。以前フリーCGI配布しているとき 何故か使えない環境があったので、その時探しまわったような記憶があります。 どこにあったかポインターを示せない^^;・・・その他の方法としては手でコリコリ 書く、というのもありですが。 ![]() | ||||
|
投稿日時: 2003-09-05 12:59
メールってやっぱり難しいですね。
> sendmailのマニュアルにはEOFまたは.で終わることって書いてあったので > 最初、このサンプル同様close()するだけだったのですが、それだと届かなかったんです。 > で、.で終了するようにしたら届くようになってでも、close()があるとなぜか届かなくて そういうこともあるんですねぇ。覚えておきます。 > あと、\nはsendmailで処理しているというよりもテキストモードだから > Perl的にrnと同様になっている気が。。。。 私はPHPですが(SMTPとsendmail使用の両機能を持たせてます)、SMTP接続の場合は \r\nに変換しないと送れない(というより相手が受信してくれない)ところがあったのに sendmailだと \nのままでちゃんと送信できました。それでてっきりsendmailが、、、と。もちろん同じ送信先でのことです。 > JISがうまく変換できていないだけみたいですね。 > 文字化けではないようです。(charsetのせいかな?) そう思うんですけどねぇ。 [ メッセージ編集済み 編集者: Marionette 編集日時 2003-09-05 13:07 ] | ||||
|
投稿日時: 2003-09-05 14:15
ども、ほむらです。
Perl出身というよりも他のCGI用スクリプト言語知りません。 Perlは正規表現が強力なので愛用しています。^^ ---------------- 件のプロバイダはすでに契約をきってしまったので 実験することは出来ないのですが僕の想像があっていればおそらく。 open(MAIL,)で開いたパイプに対してbinmode(MAIL,":raw"); とかしてバイナリモードにしてあげればsendmailでも \r\nとしてあげなければだめなのではないかと。。。 SMTPってソケットですよね。。 デフォルトはバイナリになっているのではないでしょうか? sendmailとは逆にソケットの転送モードをテキストに設定してあげれば\nでも 行くんじゃないかなともおもっています。 メール。。。SMTP経由は何度やってもダメだったので プロバイダの制約ということにしてやめちゃいました(笑 メールって難しいです。。。。 SMTPが扱えれば もっといろいろなことが出来たんでしょうけど。。。 以下追記: あれ?よく見たら僕が使っていたときとオプションが違う。。。。 僕の場合の障害って、もしかしてこのせい? open(MAIL, "| /usr/sbin/sendmail -t") || die "can't use SendMail"; Local($_); ・・・・ [ メッセージ編集済み 編集者: ほむら 編集日時 2003-09-05 14:23 ] | ||||
|
投稿日時: 2003-09-06 14:47
ありがとうございます。
無事、送信の部分を↓のように変更した結果、 おかしなヘッダが現れなくなりました。 open (MAIL, "|$sendmail $trans"); print MAIL "To: $trans\n"; print MAIL "From: $smail ($sname)\n"; print MAIL "Subject: $ftitle\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 "\n"; きちんと charset や Encoding を指定してやらないと、 sendmail が勝手に↓のように変換してしまうんですね。 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable 途中で、文字化けがおきるのは、 メールソフトが quoted-printable から戻すときに失敗した、 という事ですね。 |