認証の中断
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]調べたときは(どこを調べたんだろう)
/usr/bin/telnet で直接 SMTP しゃべったところ,どちらの書式でも認証可能だ.どっちなんだ.
調べてみると,RFC2595 か?
というか,authorize-id と authenticate-id の違いは一体…
username\0username\0passwordを Base64 エンコードしたものを使うことになってたけど,Mail::Sender の出力を(パケットキャプチャして)見ると
\0username\0passwordのエンコード結果になってる.
/usr/bin/telnet で直接 SMTP しゃべったところ,どちらの書式でも認証可能だ.どっちなんだ.
調べてみると,RFC2595 か?
message = [authorize-id] NUL authenticate-id NUL passwordauthorize-id は省略可能みたいだ.
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 と 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の応答
スクリプトをチェックすると,最後の応答にもハイフンがついていたため,クライアント側が「サーバさん,次の応答まだ〜?」状態だったようだ.
RFC2821(日本語訳)4章から引用
今みると,1.5年前のスクリプト,きたねーなー…
まだ,リファレンスを知らなかったころの作品みたいだ.サブルーチンに引数を12個も渡してやがる(笑…えねぇ) なんつーか,一貫性がない.
メール送信ツール(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 より引用
Net::SMTP版
Mail::Sender版
Mail::Sendmail版
Mail::Sender は、デフォルトでは(MIME::QuotedPrintが使えれば)quoted-print エンコードして送信するので、mailcfg{mime} を false に設定する。
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 認証は
符号化の法則は
LOGIN 認証はもっと簡単に(<<はリクエスト、>>はレスポンス)
ちなみに、"VXNlcm5hbWU6" は "Username: " を、"UGFzc3dvcmQ6" は "Password: " をエンコードしているだけ。
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/
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
ところで、Content-Disposition が持つファイル名のパラメタ名は filename だよな^^;
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プロセス)
同じメールで複数あて先の場合、1smtp session で送信するらしい。
qmail は1メール 1セッション(つーか、1プロセス)
最終更新時間: 2013-05-02 16:12