認証の中断
2007-04-17-1 / カテゴリ: [SMTP] / [permlink]

*
を送信する。

RFC2554(日本語訳)より
もしクライアントが認証交換をキャンセルしたいなら、1つの*だけの行を返す。
もしサーバがその答を受けとったなら、501を返してAUTH コマンドを拒否しなければならない。

Postfix 2.1.5 (Debian/GNU Linux @ coLinux)の場合
% telnet 192.168.0.2 smtp
Trying 192.168.0.2...
Connected to 192.168.0.2.
Escape character is '^]'.
220 colinux ESMTP Postfix (Debian/GNU)
ehlo foobar
250-colinux
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
auth cram-md5
334 PDExNzAwMzc0NTMuMjM5MDg3NkBjb2xpbnV4Pg==
*
501 Authentication aborted
quit
221 Bye
Connection closed by foreign host.

認証失敗時はこう
250 8BITMIME
auth cram-md5
334 PDE4ODQ3MDYxMTcuMjM5MDk0OUBjb2xpbnV4Pg==
abc
535 Error: authentication failed
quit

Postfix のログには、認証中断も認証失敗もどっちも
warning: unknown[192.168.0.1]: SASL cram-md5 authentication failed
と出力されて区別つかないけど。

SMTP-AUTH PLAIN認証
2006-02-26-1 / カテゴリ: [SMTP] / [permlink]

以前[2005-07-17-4]調べたときは(どこを調べたんだろう)
username\0username\0password
を Base64 エンコードしたものを使うことになってたけど,Mail::Sender の出力を(パケットキャプチャして)見ると
\0username\0password
のエンコード結果になってる.
/usr/bin/telnet で直接 SMTP しゃべったところ,どちらの書式でも認証可能だ.どっちなんだ.

調べてみると,RFC2595 か?
   message = [authorize-id] NUL authenticate-id NUL password
   authenticate-id = 1*UTF8-SAFE ; MUST accept up to 255 octets
   authorize-id = 1*UTF8-SAFE ; MUST accept up to 255 octets
   password = 1*UTF8-SAFE ; MUST accept up to 255 octets
authorize-id は省略可能みたいだ.
というか,authorize-id と authenticate-id の違いは一体…

SMTP応答のおしまい
2006-02-25-1 / カテゴリ: [MTA][SMTP] / [permlink]

とゆうアレで
メール送信ツール(Perlスクリプト)を改造することになった.「SMTP-AUTH対応にしてくれ」とゆーことだけど,内部で使っている Mail::Sender 自体が SMTP-AUTH を使えるので,大したことない.
Postfix に対して動かすと正常なんだけど,おまけで作った maileater なる MTA として動作するスクリプト(クライアントからのあらゆるコマンドに 200 OK 等を返すのみ.DATAとかはちゃんと<CR><LF>.<CR><LF>まで見るけど)があるんだけど,それを(AUTH対応にして)使うとなぜかタイムアウトしてしまう.なんでだろう.

結論
クライアントへの SMTP 応答は,「次行があるときはコードとキーワードの間にハイフンを付与」「最後の応答の時はコードとキーワードの間にスペースを付与」だ.
↓EHLOの応答
250-mozzarella
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH NTLM LOGIN PLAIN DIGEST-MD5 CRAM-MD5
250 8BITMIME
し,知らなかった…

スクリプトをチェックすると,最後の応答にもハイフンがついていたため,クライアント側が「サーバさん,次の応答まだ〜?」状態だったようだ.

RFC2821(日本語訳)4章から引用
一般に、EHLOへの応答は複数行になるだろう。応答のそれぞれの行はキーワードと、オプションで1つないし複数のパラメータを含んでいる。以下は複数行応答の一般的な構文であり、これらのキーワードは、最終行以外のすべての行ではコード(250)、ハイフンの続きのあとに来、最終行ではコード、スペースに続く。

今みると,1.5年前のスクリプト,きたねーなー…
まだ,リファレンスを知らなかったころの作品みたいだ.サブルーチンに引数を12個も渡してやがる(笑…えねぇ) なんつーか,一貫性がない.

SMTPでNULL(0x00)文字を送信する
2005-08-20-2 / カテゴリ: [programming][perl][SMTP] / [permlink]

MUA(メーラ)や telnet じゃちょっと無理だけど、プログラム書いちゃえば簡単。
Net::SMTP, Mail::Sender, Mail::Sendmail の3つを試したが、どれも送信可能。RFC的にはコントロールコードを含むascii文字を送信して良いと読めるので、MTAは処理しなければならない…と思う。少なくとも、MTA が core 吐いて死んだりとかは NG でしょう。

RFC2821 4.5.2 Transparency より引用
   The mail data may contain any of the 128 ASCII characters. All
   characters are to be delivered to the recipient's mailbox, including
   spaces, vertical and horizontal tabs, and other control characters.

Net::SMTP版
use Net::SMTP;
$smtp = Net::SMTP->new("localhost",
                       Debug => 1) or die;
$smtp->mail('from@mail.example.org');
$smtp->to('to@mail.example.org');
$smtp->data();
$smtp->datasend("\x1\x0\x1");
$smtp->dataend();
$smtp->quit();

Mail::Sender版
use Mail::Sender;
$sender = new Mail::Sender{smtp => 'localhost',
                           from => 'from@mail.example.org'};
$sender->MailMsg({ to => 'to@mail.example.org',
                   msg => "\x1\x0\x1" });

Mail::Sendmail版
use Mail::Sendmail;
$Mail::Sendmail::mailcfg{mime} = 0;
sendmail( To => 'to@mail.example.org',
          From => 'from@mail.example.org',
          Message => "\x1\x0\x1" ) or die $Mail::Sendmail::error;

Mail::Sender は、デフォルトでは(MIME::QuotedPrintが使えれば)quoted-print エンコードして送信するので、mailcfg{mime} を false に設定する。

SMTP-AUTH の実装
2005-07-17-4 / カテゴリ: [メール][SMTP] / [permlink]

メモ程度で実装じゃないけど^^;
CRAM-MD5 認証については、ぺるりめもダイジェスト2 cram-md5認証 (module)Digest-HMAC_MD5参照。

PLAIN 認証は
AUTH PLAIN base64-encoded-username-and-passwd
と、AUTH コマンドの引数に、"PLAIN" と base64 で符号化したユーザ名とパスワードを与える。
符号化の法則は
username\0username\0password
まぁ、こんな感じで。\0 は 0x00 のヌル文字。
% printf 'username\0username\0password' | mmencode

LOGIN 認証はもっと簡単に(<<はリクエスト、>>はレスポンス)
<<AUTH LOGIN
>>334 VXNlcm5hbWU6
<<VXNlcm5hbWU6
>>334 UGFzc3dvcmQ6
<<UGFzc3dvcmQ6
と、POP3 と似たような感じで、ユーザ名とパスワードを単に base64 エンコードしたデータを渡す。
ちなみに、"VXNlcm5hbWU6" は "Username: " を、"UGFzc3dvcmQ6" は "Password: " をエンコードしているだけ。
Referrer (Inside): [2006-02-26-1]

Vodafone のメールがスカイメールにならない条件
2005-07-17-2 / カテゴリ: [SMTP][メール][携帯] / [permlink]

本文文字数が192文字以内以外に、各ヘッダの文字数にも依存するみたい。件名だけはある程度の長さ以上(忘れた)だとスーパーメールになるのは知ってたけど。

http://developers.vodafone.jp/dp/tech_svc/mail/

Vodafone のメールの添付ファイル名の取得方法
2005-07-17-1 / カテゴリ: [SMTP][メール][携帯] / [permlink]

http://developers.vodafone.jp/dp/faq/faq.php#20_11
Q11: パソコンから添付ファイル付きのEメールをボーダフォン携帯電話に送信した場合、ボーダフォン携帯電話側で通知できない添付ファイルがあるのですが?
A11: ボーダフォンの仕様では、「Content-Typeのnameパラメータ」で添付ファイルを判断しています。「Content-Dispositionのnameパラメータ」では添付ファイルを判断していませんので、ご注意下さい。
あ、そうなんだ…。
ところで、Content-Disposition が持つファイル名のパラメタ名は filename だよな^^;

Mail::Sender でポート番号指定
2005-06-26-1 / カテゴリ: [SMTP][メール][programming][perl] / [permlink]

メールを送るのに便利な Mail::Sender だけど、ポートの指定ができない(25/tcp固定)ので、オブジェクトの作成時にポート指定できるようにするパッチ。
--- Sender.pm.org       2005-06-27 10:43:24.000000000 +0900
+++ Sender.pm   2005-06-27 10:43:24.000000000 +0900
@@ -811,7 +811,6 @@
        delete $self->{'_buffer'};
        $self->{'debug'} = 0;
        $self->{'proto'} = (getprotobyname('tcp'))[2];
-       $self->{'port'} = getservbyname('smtp', 'tcp')||25 if not defined $self->{'port'};
 
        $self->{'boundary'} = 'Message-Boundary-by-Mail-Sender-'.time();
        $self->{'multipart'} = 'mixed'; # default is multipart/mixed
@@ -838,6 +837,8 @@
                }
        }
 
+       $self->{'port'} = getservbyname('smtp', 'tcp')||25 if not defined $self->{'port'};
+
        $self->{'fromaddr'} = $self->{'from'};
        $self->{'replyaddr'} = $self->{'reply'};
まぁ、単純に、$self->{'port'} のセット位置を変更するだけなんだけど。

まとめおくり postfix
2005-02-01-1 / カテゴリ: [linux][MTA][SMTP][メール][Postfix] / [permlink]

http://lists.debian.or.jp/debian-users/200112/msg00232.html
同じメールで複数あて先の場合、1smtp session で送信するらしい。
qmail は1メール 1セッション(つーか、1プロセス)

SMTP メールのフォーマット (rfc2822)
2004-12-22-1 / カテゴリ: [unix][network][SMTP][メール] / [permlink]

本文の 1行は CRLF 除いて 998 文字以下(MUST) 78文字以下(SHOULD)
(2.1.1. Line Length Limits)
ヘッダは
ヘッダのフィールド名は printable US-ASCII(33 - 126), コロン
フィールドbodyは CR,LF を除く任意の US-ASCII
フィールドbodyが複数行にまたがる場合(folding)は、white space で始まる
カテゴリ: SMTP

最終更新時間: 2013-05-02 16:12