System.Net.Mail.SmtpClient の認証機能が PLAINぐらいしか対応していなかったので、StreamRelay.NET.exe の Proxy 機能として実装してみた。
-RemoteProxy オプション
-RemoteProxy オプションのスキームに mailauth を新設した。
例えば、-RemoteProxy mailauth://user:password@mail.example.com/DIGEST-MD5?cNonce=AAAAAAAAAAAA
として、メール送信経路上に挟めば、Mailクライアントが対応していないSMTP認証を通してメール送信ができる
認証は、StreamRelay.NET.exeが肩代わりするのだから、Mailクライアントは認証無しで起動する必要があるよ。
mailauth スキーム
仕様はこんな感じ
mailauth://ユーザ名:パスワード@ホスト名:ポート/認証方法?オプション&オプション....
ユーザ名:パスワード
SMTP認証に使うユーザ名とパスワード
ホスト名:ポート
SMTP の EHLO ホスト
コマンドのホスト
または、
POPbeforeSMTP の対象POPサーバホスト名とポート
または、
APOPbeforeSMTP の対象POPサーバホスト名とポート
に使う
認証方法
以下に対応
- PLAIN
- LOGIN
- CRAM-MD5
- DIGEST-MD5
- POP3BS (POP3 before SMTP)
- APOP
- POP3
- SMTP-AUTO
APOP と POP3 は SMTP ではなくて、POP。POPクライアントで認証機能がぶっ壊れている。って事はないと思うので、使う場面はないと思う。
まぁ、POP3 しか対応していないPOPクライアントをこのツールでAPOPに対応させる。って事はできなくなはないけど、その場合、POP認証用のパケットがでちゃうので、(サーバとしてはAPOPで認証したのに、POP認証パケット来たけど、これは何?状態)あまりよろしくないだろう。
SMTP-AUTO は、SMTP認証の DIGEST-MD5/CRAM-MD5/LOGIN/PLAIN から、さらにサーバから提示された方法の中からテキトーな認証方法が選択される
オプション
基本的には、名前=値&名前=値....
という形式
- Encoding=文字コード (既定はUTF-8)
- CNonce=Base64文字列(固定値) (DIGEST-MD5 で使用する)
- CNonceHex=Base16値(固定値) (DIGEST-MD5 で使用する)
- CNoceRand=num%2cアルゴリズム名 (アルゴリズム名で指定したアルゴリズムを使用してnum長の乱数バイト列) (DIGEST-MD5 で使用する)
- CNoceRand=min-max%2cアルゴリズム名 (アルゴリズム名で指定したアルゴリズムを使用してmin-max長の乱数バイト列) (DIGEST-MD5 で使用する)
- NC (既定値は 000000) (DIGEST-MD5 で使用する)
- UserName2nd=文字列 (PLAINでの認証IDというやつ。既定はユーザ名と同じだけと異なる値を指定したい場合)
- URI=文字列 (既定は smtp/local) (DIGEST-MD5 で使用する) この値とレルム値で URI が形成される
StartTLS も兼用する
STARTTLS ゲートウェイとしての StreamRelay.NET.exe → STARTTLSクライアントにもなる
sendmail.net.exe
高機能かどうか分からんが、mail 専用のコマンドを作った。
BlatJ.exeのようなsendmailのようなメール送信するCLIコマンド sendmail.net.exe