WwwMailを作成しました。感想は?

[上に] [前に] [次に]
とほほ 1999/08/29(日) 12:18:49
メール送信フォーム設置法のツールをまとめて、フリーソフトっぽく
仕上げてみました。
 http://www.tohoho-web.com/soft/wmail.htm
もし、よければ、改善点や感想などいただけると嬉しいのですが・・・
(次はカウンターにとりかかる予定です。)

B-Cus 1999/08/30(月) 00:10:05
> # "." のみの行は ". " に変換する。
> # 2回繰り返さないと、2行連続で "." のみの行に対応できない
> # "." を ".." に変換する処理が一般的だそうだが、あえて、
> # "." を ". " に変換する。
これはなぜ ".." にされないんでしょうか。また、
"." のみの行だけでなく、"." で始まる行を ".." に変換する
方がよいと思います。なぜなら、一般的なPOPクライアントは、
".." のみの行を "." に戻すのではなく、行頭の ".." を "." に
戻すからです。

とほほ 1999/08/30(月) 23:40:26
この部分のコードは、ある方から教示していただいたのを流用している
ため、ちょっとでもつっこまれると、ほにゃららら〜になってしまうの
ですが・・・(ごめんなさい。)
ここらへんの、sendmail(SMTP? POP?)における、ドットの取り扱い
について説明されたドキュメントってご存知ですか?

B-Cus 1999/08/31(火) 01:36:58
RFC821(SMTP) と RFC1939(POP) です。「.」→「.(スペース)」だと、
最終的には「.」がスペースに置き換わってしまうと思います。

http://www2.umin.u-tokyo.ac.jp/internet/rfc/rfc821.txt
 4.5.2.  TRANSPARENCY
 Without some provision for data transparency the character
 sequence "<CRLF>.<CRLF>" ends the mail text and cannot be sent
 by the user.  In general, users are not aware of such
 "forbidden" sequences.  To allow all user composed text to be
 transmitted transparently the following procedures are used.

  1. Before sending a line of mail text the sender-SMTP checks
  the first character of the line.  If it is a period, one
  additional period is inserted at the beginning of the line.

  2. When a line of mail text is received by the receiver-SMTP
  it checks the line.  If the line is composed of a single
  period it is the end of mail.  If the first character is a
  period and there are other characters on the line, the first
  character is deleted.

http://doobie.iq.nanzan-u.ac.jp/goto-classes/comm-grad/rfc1939-jp.txt
 3. 基本的な操作

 あるコマンドに対する応答は, 複数行にわたる時もある. これらの以下には
 っきり示すような場合において, 応答の 1 行目と CRLF を送った後, いく
 つかの追加の行が送られる. それぞれの行は CRLF の組で終了している. 応
 答のすべての行が送られる時, 最終 octet(termination octet) を表す終端
 文字(十進数のコードで 046 である ".")と CRLF の組で構成されている最終
 行が送られる.複数行の応答の中で, その行が "." ではじまっているならば,
 "byte-stuffed"(バイトで埋めること)により, "." を前もって後回しにする
 操作を行なう. 従って, 複数行の応答は "CRLF.CRLF"の 5 オクテットで終了
 する. 複数行の応答を調べる時, クライアントはその行が "."ではじまって
 いるかをチェックする. もしそうであり, CRLF があとに続かなければ,その
 行の最初の"."を取り除く.もしそうであり CRLF が"." に続いているならば,
 POP3 サーバからの応答は終わり, ".CRLF" を含んでいる行は複数行の応答
 の一部分とみなされない.

とほほ 1999/09/01(水) 00:19:43
 B-Cusさん、ありがとうございます。(RFCくらい自分で探すべきでした(反省))
ドットの処理については早速修正したいと思います。

 その他、どのプロバイダに設置できたとか、説明文のここがわかりに
くかったなど、改善点があれば、どしどしお願いいたします。>皆さん

 今は、Macの初心者の人が、改行コードの変換をちゃんとできるのか
などが心配だったりします。「Macを使用している場合は、Jeditなど
の改行コード変換機能をもったエディタで編集してください。」などの
1文を入れた方がよいでしょうか・・・

B-Cus 1999/09/01(水) 00:53:41
>  RFCくらい自分で探すべきでした
僕もRFCを読んだはいいけど、どこにその記述があるのか
見つけ出せなかったので、人に聞いたんですけどね(^^;

あと、細かいことを言わせていただくと、jcode.plの最新バージョンは
2.8です。特に理由がないなら2.8を付けておくとよろしいかと。
 ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/
それから wwwmail.cgi で
> # EMAILが正常なメールあどれすかどうか判断する
s/あどれす/アドレス/


ところで前々から思っているのですが、全てのパッケージに
 #!/bin/sh
 echo "Content-type: text/plain"
 echo
 echo exec ./$@
 PATH=/bin:/usr/bin
 ./`basename $@` 2>&1
などという tohoho-test.cgi なるファイルを入れておき
 「設置や改造がうまくいかなかったら
   /~user/cgi-bin/tohoho-test.cgi?wwwmail.cgi
   /~user/cgi-bin/tohoho-test.cgi?wwwlng.cgi
  を実行し、その結果を知らせること」
などという文章をドキュメントに入れておくのはどうでしょうか。

目的は「Internal Server Errorがでます」という何とも回答しにくい
質問を減らすためです。この結果を書いてもらえると
 ・perlのパスが違う
 ・"〜"中に"をエスケープせず書いちゃった
 ・"〜"中に@をエスケープせず書いちゃった
 ・requireするファイルが壊れてる、@INCがおかしい
などのFAQがさくさく解決します。

ただ、
 ・.htaccess の設定をしていないので、tohoho-test.cgi も動かない。
 ・chmod +x していないので、tohoho-test.cgi も動かない。
 ・asciiモードで転送していないので、改行コードが 0x0D 0x0A
 ・/bin/sh がないマシンではどうするの?
ということもあり、中途半端なのがアレなんですが。

# このshスクリプト、セキュリティ的にまずいかな…?

/../ 1999/09/01(水) 00:56:42
ここは見てるだけにしようと思ってけど…
> # "." のみの行は ". " に変換する。
> # 2回繰り返さないと、2行連続で "." のみの行に対応できない
> # "." を ".." に変換する処理が一般的だそうだが、あえて、
> # "." を ". " に変換する。
"."のみの行を".."に書き換える必要が有るのはSMTPでお話するプログラムだけ、
sendmail起動して渡しているなら(-bsつけてSMTPでお話するのは除く)
sendmailが全部やってくれるんで書き換えの必要無し。
RFC822, 2045,2047に違反しないメッセージ作れば良い。

個人的にはサブジェクトの生JISは止めて欲しいが…
# 読む前にエンコーディングが決定してないと面倒なのよ。
# cookieに非ASCII入れるとか…

B-Cus 1999/09/01(水) 01:08:28
> "."のみの行を".."に書き換える必要が有るのはSMTPでお話するプログラムだけ、
むむ、FreeBSD2.2.7+sendmail8.8.8では、以下のスクリプトを実行すると
「body1」までしか送信されませんでしたが…。
 $text =<<END;
 To: my@mail.address
 From: hoge
 Subject: fuga
 
 body1
 .
 body2
 .
 END
 open(SENDMAIL,"|/usr/sbin/sendmail -t");
 print SENDMAIL $text;
 close(SENDMAIL);

> 個人的にはサブジェクトの生JISは止めて欲しいが…
最新版では mimew.pl でMIMEエンコードするようになってます。

ふじ 1999/09/01(水) 02:01:35
本筋とは関係ないですが(^^;

>jcode.plの最新バージョンは2.8です。
>特に理由がないなら2.8を付けておくとよろしいかと。
2.10ですね。

/../ 1999/09/01(水) 02:16:15
> > "."のみの行を".."に書き換える必要が有るのはSMTPでお話するプログラムだけ、
> むむ、FreeBSD2.2.7+sendmail8.8.8では、以下のスクリプトを実行すると
> 「body1」までしか送信されませんでしたが…。
ごめん、寝ぼけてた。検証しないで書くとろくな事が無い…

とほほ 1999/09/02(木) 01:21:19
会社のSVR4系のUNIXで試したら、body1までしか送信されませんでした。

でもLinux 2.0.34(www.wakusei.ne.jp)で試したら、body2 . まで送
信されました。/usr/lib/sendmail は /var/qmail/bin/sendmail の
シンボリックリンクなのですが、これはもしかしてニセsendmail?

それとも、ドット(.)を終端と見なすものと、ドット(.)を無視してEOF
まで読むものと、いろいろある???

WwwMailでは、ドット処理フラグとかをサポートしなくちゃいけないの
かなぁ・・・

B-Cus 1999/09/02(木) 02:51:29
うげ〜、すっごい勘違いしてた。申し訳ない。

> RFC821(SMTP) と RFC1939(POP) です
これは /../ さんが指摘されたように、あくまでSMTPの話であって、
コマンドラインから sendmailでメール送信する際の dot の扱いとは
全く関係ないものでした。たまたま sendmail が dot を EOF と
見なしている、というだけで。

で、さらに dot から始まる行も dot dot にしなければならない
というのも嘘でした。これもあくまでSMTP/POPの話であって、
sendmailをコマンドラインから実行したときは関係ありません。
dot から始まる行は そのまま書き出せばいいです。気をつけ
なければいけないのは dot のみの行だけです。

また、とほほさんが試されたように、qmailに付属する sendmail や
メール送信プログラム qmail-injectでは、dot のみの行では終わり
ません。EOFまで読みにいきます。

で、dot のみの行を送信できるようにしようと、 s/^\.$/../ という
処理をしてしまうと、結果的に dot が余分に付きます。sendmail が
dot を1つ削除してくれたりはしません。

というわけで、コマンドラインから sendmail を実行して dot のみの
行を送りたい場合は、sendmail に -i オプションを付けるしかない
ような気がしますが…あってるかなぁ。

> WwwMailでは、ドット処理フラグとかをサポートしなくちゃ
> いけないのかなぁ・・・
MTAごとに処理を切り分けるか、SMTPを喋るか、になりますね。

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