- PR -

Perl の CGI から sendmail でメール送信

投稿者投稿内容
Marionette
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 70
投稿日時: 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あたりでしょうか。もしかしたらアップデートされて番号が変わっているかも知れません。

asp
会議室デビュー日: 2003/05/29
投稿数: 8
投稿日時: 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 ]
Marionette
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 70
投稿日時: 2003-09-05 12:10
引用:
ほむらさんの書き込み (2003-09-05 11:18) より:
それと本文の最後に "n.n"も必要ですね。。。
僕の使用していた環境だと.を入れた瞬間sendmailは終わってしまう感じでしたので


いらないと思いますけど。SMTP接続と混同してるってことはありませんか?


ほむら
ぬし
会議室デビュー日: 2003/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 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/06/28
投稿数: 219
投稿日時: 2003-09-05 12:46
引用:

ほむらさんの書き込み (2003-09-05 11:18) より:
ども。ほむらです。
Perlという単語に反応してしまいました。(笑


お、ほむらさんもperl出身ですか(笑)。
本来、MIME::Base64 を使うのが王道でしょう。以前フリーCGI配布しているとき
何故か使えない環境があったので、その時探しまわったような記憶があります。
どこにあったかポインターを示せない^^;・・・その他の方法としては手でコリコリ
書く、というのもありですが。
Marionette
ベテラン
会議室デビュー日: 2003/08/08
投稿数: 70
投稿日時: 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/02/28
投稿数: 583
お住まい・勤務地: 東京都
投稿日時: 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 ]
asp
会議室デビュー日: 2003/05/29
投稿数: 8
投稿日時: 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 から戻すときに失敗した、
という事ですね。

スキルアップ/キャリアアップ(JOB@IT)