BlatJ.exeのようなsendmailのようなメール送信するCLIコマンド sendmail.net.exe

---
### アーキテクチャ

[System.Net.Mail.SmtpClient](https://msdn.microsoft.com/ja-jp/library/system.net.mail.smtpclient(v=vs.110).aspx)を使った mail クライアントです。

---
### 使い方(ダウンロードとインストール)

[Microsoft .NET Framework2.0/4.0 で作った BlatJ.exe(sendmailコマンド)](http://rocketeer.dip.jp/sanaki/free/free133.htm) からsendmail.net.lzhをダウンロードして、ZoneIDを削除して、解凍すれば、使える。

- .NET2.0でコンパイルしたのが、sendmail.net2.exe
- .NET4.0でコンパイルしたのが、sendmail.net4.exe

なので、

- .NET Framework2.0 ランタイムで動作するのが sendmail.net2.exe
- .NET Framework4.0 ランタイムで動作するのが sendmail.net4.exe
- .NET Framework4.5 ランタイムで動作するのが sendmail.net4.exe

となる。

---
### usage

<pre>C:\&gt;sendmail.net4.exe
sendmail.net4.exe ver 2.1.0.0
                            created by active@window.goukaku.com

usage : sendmail.net4.exe &lt;&lt;option&gt;&gt;
 Mail Body is Standard Input.

 OPTIONS
   -SmtpServer &lt;&lt;SMTP Server Address&gt;&gt; (must)
   -SmtpServerPort &lt;&lt;SMTP Server Port&gt;&gt; (Default:25)
   -Subject &lt;&lt;Subject&gt;&gt; (must)
   -Fromaddress &lt;&lt;From Mail Address&gt;&gt; (must)
   -ToAddress   &lt;&lt;To Mail Address&gt;&gt;
   -CcAddress   &lt;&lt;Cc Mail Address&gt;&gt;
   -BccAddress  &lt;&lt;Bcc Mail Address&gt;&gt;
   -ReplyToAddress  &lt;&lt;ReplyTo Mail Address&gt;&gt;
   -ToList  &lt;&lt;To Mail Address List File&gt;&gt;
   -CcList  &lt;&lt;Cc Mail Address List File&gt;&gt;
   -BccList &lt;&lt;Bcc Mail Address List File&gt;&gt;
   -AttachFile &lt;&lt;Attach File&gt;&gt;
   -CharSet &lt;&lt;Character Set&gt;&gt;
   -User &lt;&lt;username&gt;&gt;
   -Pass &lt;&lt;password&gt;&gt;
   -SSL
   -CheckCert
   -OldMode {only .NET4.5 ... Old MailFormat (if set charset this option need)}
Error: No Set MailServer</pre>

---
### 必須オプション

メール本文は、標準入力から与える。

必要なオプションは、以下

- -SmtpServer → メール配送を委ねる SMTP サーバ
- -Subject →題名
- -Fromaddress → 送信元
- -ToAddress or -ToList →あて先

---
### SSL

-SSL オプションで、STARTTLS対応する。

System.Net.Mail.SmtpClientの制限で、SMTP over SSL ではなくて、STARTTLSだけのようだ。

SMTP over SSL に対応したい場合は、stoneとかsTunnel などを経路上に挟めばいいでしょう。
または、StreamRealy.jar でも StreamRelay.Net.exe でもSSLクライアントになれるよ。

↓のあたりを参照のこと

- [stone/stunnel の代替としての StreamRelay.NET.exe (SSLクライアント編)](https://qiita.com/tomoki0sanaki/items/8af1a134865491558050)
- [stone/stunnel の代替としての StreamRelay.jar (SSLクライアント編)](https://qiita.com/tomoki0sanaki/items/1c6060688f80ac9d52a6)


---
### サーバ側のSSL証明書の確認

基本的に検証しないが、-CheckCert オプションで検証させることができる(検証不備でエラーが発生する)。

「デフォルトセキュア」ではないけど、まぁ、いいでしょ。

---
### クライアント側のSSL証明書

検証環境はないけど、プロパティがあるので、「-CertFile」と「-CertPassword」で対応した(ver2.2.0.0)

---
### 認証

SMTP認証には、-User と -Passを与えればよいが、System.Net.Mail.SmtpClientの制限で、AUTH LOGINのみに対応しているようだ。

---
### 文字コード(既定)

- .NET2.0 → ISO-2022-JP
- .NET4.0 → ISO-2022-JP
- .NET4.5 → UTF-8

---
### 文字コード(古きよき伝統的スタイル)

基本的に、古きよき伝統的なスタイルで送信する。(.NET2.0/.NET4.0)

ただし、.NET4.5で動作している時は、既定はUTF-8な8bitなメールとしたので、古きよき伝統的スタイルで送信したい場合は「-CharSet iso-2022-jp -OldMode」とすると、7bitな古きよき伝統的スタイルのメールを送信する。

---
### .NET Framework 4.5 での仕様変更への追随

.NET Framework 4.5 以降では、4.0 とは古きよき伝統的スタイルでの仕様変更があったようで、4.5未満と4.5以降で、処理を分けるようにしている。

---
### StreamRelay.NET.exe(mailtoスキーム)

機能的には劣るけどStreamRelay.NET.exeもURIなパスに対応してみた。

[curl のような wget のようなウェブクライアントの代替としてのStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/9dbde2699ff1d8aa5395)

---
### StreamRelay.NET.exe(代理認証)

[SMTP認証を代替するStreamRelay.NET.exe](https://qiita.com/tomoki0sanaki/items/57a0cdd2c448770f73d4)