フォームをsendmail経由でメールする時の注意点は?

[上に] [前に] [次に]
mura [E-Mail] 1998/02/09(月) 03:00:24
PerlでCGIを書いているんですが、今回自分の掲示板ページにメール送信の機能も
追加したいと思ってます。(掲示板に書き込むと同時に同じ内容のメールを送信)

本文はJISで送ればいいと思うのですが、SubjectやFrom
(いずれも書く人が自由に入れることができます)に漢字が入る時はどう処理するか、
他のヘッダはどう出力すればいいのかというのがいまひとつわかりません。
(SunOS4でsendmailを使うつもりです。)

どこかそのことについて詳しく書いているwwwページ(なるべく日本語)があれば
教えて下さい。
いろいろわかったらまたまとめて書きたいと思います。よろしくお願いします。

hiro-kim 1998/02/10(火) 15:52:53
そのあたりの処理をおこなうスクリプトはすでに誰かが作って公開していそうな気がします。けっこうニーズがありそうですから。

蛇足かも知れませんがその規格に関して,たまたまコピーをとって手元に置いてあった雑誌記事の要点をご紹介します。もっと詳しい内容が必要でしたら,下記に登場するキーワードでWWW検索すればなんらかの情報にはたどり着けるか,と。

■RFC1522:MIME拡張メッセージ・ヘッダ
RFC1468で規定されたISO-2022-JP日本語をインターネットメッセージのヘッダに埋め込む規格。BASE64変換については,RFC1521:MIME拡張メッセージ・ボディで規定されている。

=?ISO-2022-JP?B?【BASE64変換された文字列:4の倍数長】?=

■BASE64変換
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
の64文字を0〜63の変換インデックスとして用いる。
3オクテットのバイナリデータを6bitごとに区切り,4Byteの7bitASCII文字列に変換する。

0xA18302 → 10100001 10000011 00000010 → 101000 011000 001100 000010 → oYMC

変換元のバイナリデータが3Byteに満たないときは,変換後の文字列の末尾に"="をパディングするため,変換後の文字列長は4の倍数になる。

■MIME拡張メッセージ・ヘッダの例
以下は,Netscape Navigator 3.01ja のメール機能が生成したものです。
データは「ABCひさかたのひかりのどけきはるのひにXYZ」です。
JIS X0208で「ABC 0x1B $ B ひさかたのひかりのどけきはるのひに 0x1B ( B XYZ」となります。

Subject: =?iso-2022-jp?B?QUJDGyRCJFIkNSQrJD8kTiRSJCskaiROJEkkMSQtJE8kayROJFIkSxsoSlhZWg==?=

それから,私のメールボックスをチェックしてみたら次のようなヘッダのメールがありました。ヘッダ1行の長さを76文字以内に収めるため,2回に分けてBASE64変換しているようです。

Subject: =?ISO-2022-JP?B?UkU6IFtUUklERU5UXRskQj0kTX0wTU1qISQbKEpIREQbKEo=?=
=?ISO-2022-JP?B?GyRCRyc8MSQsSVQwQkRqGyhK?=

■From: の形式
次の4種類があり,どれでもかまわない。
From: address
From: <address>
From: Full Name <address>
From: address (comment)

hiro-kim 1998/02/10(火) 17:33:45
あ,行頭が From: ではじまる,上記の4行が発言件数としてカウントされています。
この書き込みが7件目の発言になってます。

むらまつ [E-Mail] 1998/02/14(土) 04:32:54
少し遅くなりましたが、hiro-kimさんありがとうございました。

サーチエンジンなどでいろいろ探して、何とかNetNewsのアーカイブの中から
mime_plsというものを見つけてきました。
今見つけたばかりですので、これから動作をチェックしてみます。

Perl関連サイトで漢字Subjectを扱っているところは"Web裏技"などが
ありましたが、SubjectをそのままJISに変換してました。
一応手元のNetscape Mailなどのメーラーでは問題なく復元できますが、
普段受け取っているメールではこのような形のものは見ませんし…。

とほほ 1998/02/15(日) 01:24:07
ふっふっふ、みつけてしまいましたね。> hiro-kimさん。
From: 対応と、BASE64 対応・・・・がんばらねば。

とほほ 1998/02/15(日) 01:27:00
ああぁっ、最後のFrom:行の内容が「最終発言者」として表示されて
しまうっっ。(^o^;) なんとかせねばっ。

たいち [E-Mail] [HomePage] 1998/02/16(月) 13:05:44
I.E4.0でWebを作ったんですが、PC歴4ヶ月のサルなのでPerlやSendMailの意味が分からないので教えて下さい。
それと、オーダーフォームから送信してもらっても、うまく開けないのでどうすればいいのか教えて下さい。宜しくお願いします。
このWebはosanaiさんに教えてもらいました。

とほほ 1998/02/17(火) 00:21:52
perlはプログラミング言語の一種だと思ってください。
詳細は http://www.tohoho-web.com/wwwperl.htm を参照。
sendmailは電子メール送信コマンドの一種です。

あと、オーダーフォームに関しては、「うまく開けない」の個所をもう
少し具体的に(何で何を開こうとしているのか)まとめて、新しい質問
として書込んでください。

たいち 1998/02/21(土) 20:49:33
[[解決]]
オーダーフォームは見れるようになりました。
テキストをプレーンにするだけだったんですね。
とほほさんや、皆さんのご親切のおかげです。
有り難うございました。

むらまつ [E-Mail] [HomePage] 1998/03/11(水) 01:38:24
なんか解決マークがつけられてしまってますが、;-)
やっと動作確認しましたので報告します。(ホームページでの本格稼動は数日後になります)

まずmime_plsというのを手に入れ、wmime.pl(のみ)をCGIディレクトリに入れます。
私が手に入れたのは94年のものだったのでperl5で動作するかどうか気になったんですが、
問題なかったです。
http://www.cc.rim.or.jp/~ikuta/mime_pls/index.html
最新版がここから手に入ります。(私は動作確認してませんが特に大きな変化はないようです)
以下のようにして使います。

・require 'mimew.pl'した後、「print &mimeencode('入力文字列');」で変換+出力できます。
  入力文字列のコードはJIS, SJIS, EUCどれでもOKです。

・引数に渡してMIMEエンコードするのはヘッダ部分(From, Subjectなど)のみです。

・Dateなどはsendmail君が自動で付け加えるので書き込む必要はありません。
  (日本から送るなら時間が日本時間になっているかチェックする必要あり)

・本文はJISで送ります。(JIS変換はjcode.plなどを使用)

・ピリオドのみの行が入っているとsendmailはそこで読み終えてメールを送信して
  しまうので、それを防ぎます。私はピリオドの後ろに半角空白を入れました。
  この処理は本文に対して行います。(ヘッダはFrom:などを固定で入れる限りは不要)

・MIME-Version, Content-Type, Content-Transfer-Encodingの各ヘッダを入れます
  (MIME-Versionはなくても構わない?)。値は以下の例に書いた通りです。
  mime_plsの中にもヒントがあります。

というわけで例を書いておきます。$FORMに差出人の名前から本文まで
いろんな値を入れておき、さらに固定のファイルに書いた文章を後ろにつけると
いうことをやってます。
(ファイル名や変数名などは元のソースから若干アレンジしました)
ちょっと見にくくてすみません。SunOS4のperl5です。

# 差出人名前: name(漢字可)
# 差出人E-Mailアドレス: mailfrom
# 送り先E-Mailアドレス: mailto, cc, bcc
# エラー時の送り先: 私のメールアドレス(固定値)
# サブジェクト: subject(漢字可)
# メール本文・追伸: message, postscript(いずれも漢字可)
# メールの最後に入れる文章: thelast.txt(JISファイル)

require 'jcode.pl';
require 'mimew.pl';

# (このへん初期処理)

$footer = "thelast.txt";
$mailbody = "$FORM{'message'}\n$FORM{'postscript'}\n";
$mailbody =~ s/\r/\n/g;
$mailbody =~ s/\n\.\n/\n. \n/g;
&jcode'convert(*value,'jis');
if (!open(SENDMAIL,"|/usr/lib/sendmail $FORM{'mailto'}")) { &error(bad_mail); }
print SENDMAIL &mimeencode("From: \"$FORM{'name'}\" <$FORM{'mailfrom'}>\nTo: $FORM{'mailto'}\n";
print SENDMAIL &mimeencode("Cc: $FORM{'cc'}\nBcc: $FORM{'bcc'}\n";
print SENDMAIL &mimeencode("Errors-To: mura\@cools.com\nSubject: $FORM{'subject'}\n";
print SENDMAIL "MIME-Version: 1.0\nContent-Type: text/plain; charset=\"ISO-2022-JP\"\n";
print SENDMAIL "Content-Transfer-Encoding: 7bit\n\n";
print SENDMAIL $mailbody;
if (open(FOOTER,"$footer")) {
print SENDMAIL <FOOTER>;
close(FOOTER);
}
close(SENDMAIL);

B-Cus 1998/03/11(水) 01:45:23
> ・ピリオドのみの行が入っているとsendmailはそこで読み終えてメールを送信して
> しまうので、それを防ぎます。私はピリオドの後ろに半角空白を入れました。
> この処理は本文に対して行います。(ヘッダはFrom:などを固定で入れる限りは不要)

あんまり自信はないのですが、.のみの行は..とするのが定番らしいです。

# 根拠は、たまにへぼいメーラーが .から始まる行(.のみの行ではなく)の先頭を
# ..に変換してしまい、MLなどで話が通じなくなっているのを見たからです。
# ある人には 「.cshrc」と見え、ある人には 「..cshrc」と見えてしまう。

これはRFCなどで明文化された規格なのか、あるいはデファクトスタンダード
なのかは知りません。


B-Cus 1998/03/11(水) 02:12:34
実験してみました。

..のみの行はMTA(sendmailとかqmailなど)によって、配達先のスプールに
入る時点で . に置き換えられました。ですからやはり .のみの行は .. と
するのがよろしいかと。

mura [E-Mail] 1998/04/11(土) 00:27:41
ピリオド2つつけるってのをやってみましたが、スプールのメールを直に見ると
そのままピリオド2つ、/usr/bin/mailで見てもピリオド2つのままになってます。
というわけで「ピリオド+空白」という案ができたのです。(^^;)
理想はピリオド2つですので、最初はピリオド2つでやってみて下さい、って
ことでいいですね。
以上、返答がだいぶ遅くなりました。m(..)m

B-Cus 1998/04/11(土) 00:40:42
あれ? おかしいな〜と思って、もう一度やってみたらうまくいかない。
思い起こすと、たしかあの時は

% telnet localhost smtp

として、直でお話ししたところ、.. が . に変換されていた記憶があります。
一方、sendmail経由だと、確かに .. だとそのままになってしまいます。
ちょっと調べてみよっと。

satoshi [E-Mail] 1998/05/23(土) 14:14:02
f (!open(SENDMAIL,"|/usr/lib/sendmail $FORM{'mailto'}")) { &error(bad_mail); }

これは難があります。

f (!open(SENDMAIL,"|/usr/lib/sendmail -n -t")) { &error(bad_mail); }

としないと、CC:やBCC:が解釈されませんし、sendmailなどコマン
ドにユーザーが入力した値を直接食わせるのは極めて危険です。

satoshi [E-Mail] [HomePage] 1998/05/23(土) 22:50:19
Perlによるメ・踉札訌^「離廛蹈哀薀爐魄貭未蟷箸┐襪發里忙摘苳糸げた
のをここに寄付したいのですけど、どう瘢雹しましょう瘢雹 >とほほさん

いまは暫定的にhttp://www.cup.com/negi/temp/webmail.zipに置い
ておきます。

satoshi [E-Mail] [HomePage] 1998/05/24(日) 01:21:39
また化けていますね。今度はIE 4.0から。

Perlによるメール送信スクリプトを一通り使えるものにしたのでそれ
をここに寄付したい、という話です。>とほほさん

とほほ 1998/05/25(月) 01:31:42
すみません。wwwmail.zip をダウンロードしたのですが、どうも、
うまくいきません。文字化けもするし・・・何故、何故?

satoshi [E-Mail] [HomePage] 1998/05/25(月) 09:59:21
|すみません。wwwmail.zip をダウンロードしたのですが、どうも、
|うまくいきません。

ファイル名を間違えていました。申し訳ないです。(それでエラーで
リダイレクトされた。)

satoshi [E-Mail] 1998/05/26(火) 00:59:42
度々スミマセン。正常にダウンロードできなかった方は

http://www.cup.com/negi/temp/sendmail.zip
を試してみてください。

ところで、今回面白いことがありました。最初ファイル名(URL)を
間違えて教えてしまったため、File Not Foundエラーでエラー画面
(実際にはトップページへのリダイレクト)が表示される状態でした。
そこでサーバー側のファイル名を変更して、同じURLで公開し直しま
した。しかし、先にエラーを経験していた人は、同じブラウザーを
使った場合、次の2つの現象のうちのどちらかを経験した人が多かっ
たのではないでしょうか。

(1) ファイルはダウンロードできたがZIPファイルは壊れていた。
(2) 再びトップページが表示された(リダイレクトされた)。

これはブラウザーによって違ってくるのでしょう。(1)の仕組みは、
先にエラー画面が表示されたときのエラー画面のMIMEタイプがブ
ラウザーのキャッシュに残っていて、本来binaryとして扱われるべ
きzipファイルがtext/htmlとして扱われてしまい壊れたのだと思い
ます。(2)の仕組みは「今度はちゃんとファイルがある」ことが
サーバーからブラウザーにうまく伝わらなかったのだと思います。
これも「強力な」キャッシュが絡んでいるのでしょう。詳しくは双
方のヘッダーを見てみないと分らないのでこれ以上の詮索は止めます。

教訓を引き出せば、誤って間違ったURLを人に教えてしまった場合は
サーバー上のファイル名/ディレクトリー名の方を直して間違った方
に合せるより、正しいURLを伝え直したよいことがある、ということ
でしょう。特にmimeタイプが違う場合には要注意でしょう。

とほほ 1998/05/26(火) 19:15:15
うーん、なるへそぉ。奥が深い。

mura [E-Mail] 1998/05/30(土) 23:19:36
satoshiさんありがとうございました。速攻で直してきました。
上記sendmail.zipもチェックしておきます。

[上に] [前に] [次に]