Swaksをメール送信のテストで使う

# TL;DL
Oracle Cloudの[Email Delivery](https://docs.oracle.com/ja-jp/iaas/Content/Email/home.htm)でメール送信をテストしたくて、
[オンラインドキュメントにあった**Swaks**](https://docs.oracle.com/ja-jp/iaas/Content/Email/Reference/swaks.htm)っていうメール・クライアントを試した。

ドキュメントみて「簡単そう」と思ったんですが、
実際に設定してみると **少々** 躓いてしまったｗ
自嘲のついでに、自分の環境で成功したときのメモを公開してしまうという試み。

# Swaksでメール送信
## 前提
- [Email Deliveryの設定](https://qiita.com/viva1000/private/000eb8f7295519d40493)が終わっていること ← **これが今回のSTMPサーバ**
- Swaksは、Oracle Linux 7.9 にインストールして使う
## Swaksインストール
### 失敗 orz
- こちらの[ドキュメント](https://docs.oracle.com/ja-jp/iaas/Content/Email/Reference/swaks.htm)のとおりにインストールします。
  `sudo yum install swaks -y`
  > No package swaks available.
  > Error: Nothing to do

　　え？何？これ。どういうこと？
　　パッケージが存在しないと？ yum一発でインストールできない？
### 仕切り直し
ということで、[Swaksの公式サイト](http://www.jetmore.org/john/code/swaks/installation.html)を見ながらインストールします。
#### コマンド本体
```
sudo su -
curl "https://jetmore.org/john/code/swaks/files/swaks-20201014.0/swaks" > /usr/local/bin/swaks 
chmod 755 /usr/local/bin/swaks
```
入れてみてわかったんですが、いわゆるPerlのスクリプトでした。
yumで入ってたら、中身を見る機会はなかったかも
#### 依存モジュール（Perl）
スクリプトだけだと、やりたいことのひとつ（TLS接続）ができない...
Net::SSLeayという、perlモジュールが必要そう。と、いうことで。
```
sudo su -
yum install perl-Net-SSLeay perl-CPAN -y
cpan install Net::SSLeay
```
cpanコマンドの実行中に、いろいろ聞かれましたが、全部デフォルト（Enter連打）で。

## 送信テスト
ワンラーナーです。長いけど。
```
swaks -tls --pipeline --server 'smtp.email.ap-tokyo-1.oci.oraclecloud.com' --port 587 \
  --auth-user 'ocid1.user.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa@ocid1.tenancy.oc1..aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.wm.com' \
  --auth-password 'XXXXXXXXXXXXXXXXXXXX' \
  --from 'no-reply@sub.hogegegege.net' \
  --to   '宛先のメアド' \
  --header 'Subject: =?UTF-8?B?44CQ44OG44K544OI44CR?= from OCI(Email Delivery)!' \
  --body 'email message... TEST\nqwerty\n\n.'
```
- --serverは、名前のとおりSMTPサーバのアドレス。
  [ここ](https://docs.oracle.com/ja-jp/iaas/Content/Email/Concepts/overview.htm#SMTP_Authentication_and_Connection_Endpoints)で公開されてる。Email Deliveryを設定したリージョンを選ぶ。今回は東京。

以下の2つは、[SMTP資格証明](https://oracle-japan.github.io/ocitutorials/intermediates/sending-emails-1/#2-smtp資格証明の生成)で作成したものを指定します
- --auth-user に、`SMTPユーザー名`
- --auth-passwordは、`SMTPユーザーのパスワード`

他は、こんな感じ
- --fromに設定するのは、
  Email Deliveryの[承認済み送信者](https://oracle-japan.github.io/ocitutorials/intermediates/sending-emails-1/#3-承認済み送信者の作成)で設定したアカウト（メアド）
- --headerにメール表題を指定できる。
  例は「【テスト】 from OCI(Email Delivery)!」をエンコードしたもの
- --bodyは、メール本文をACSIIで。改行は `\n`で。
  (日本語のメール本文の指定方法がわからない...)

### プロトコル・ログのサンプル
<details><summary>送信成功時のサンプル</summary>

```
=== Trying smtp.email.ap-tokyo-1.oci.oraclecloud.com:587...
=== Connected to smtp.email.ap-tokyo-1.oci.oraclecloud.com.
<-  220 smtp.email.ap-tokyo-1.oci.oraclecloud.com ESMTP smtp-in
 -> EHLO **Linuxサーバ名**
<-  250-smtp.email.ap-tokyo-1.oci.oraclecloud.com
<-  250-STARTTLS
<-  250 Ok
 -> STARTTLS
<-  220 Ready to start TLS
=== TLS started with cipher TLSv1.2:DHE-RSA-AES256-SHA256:256
=== TLS no local certificate set
=== TLS peer DN="/C=US/ST=California/L=Redwood City/O=Oracle Corporation/CN=smtp.email.ap-tokyo-1.oci.oraclecloud.com"
 ~> EHLO **Linuxサーバ名**
<~  250-smtp.email.ap-tokyo-1.oci.oraclecloud.com
<~  250-PIPELINING
<~  250-8BITMIME
<~  250-AUTH PLAIN
<~  250 Ok
 ~> AUTH PLAIN AG9reg(中略)KEr8F4= ※ユーザ名とパスワードをBASE64エンコードしたもの
<~  235 Authentication successful.
 ~> MAIL FROM:<no-reply@sub.hogegegege.net>
 ~> RCPT TO:<**宛先のメアド**>
 ~> DATA
<~  250 Ok
<~  250 Ok
<~  354 End data with <CR><LF>.<CR><LF>
 ~> Date: Thu, 09 Jun 2022 07:21:04 +0000
 ~> To: **宛先のメアド**
 ~> From: no-reply@sub.hogegegege.net
 ~> Subject: =?UTF-8?B?44CQ44OG44K544OI44CR?= from OCI(Email Delivery)!
 ~> Message-Id: <20220609072104.024869@**Linuxサーバ名**>
 ~> X-Mailer: swaks v20201014.0 jetmore.org/john/code/swaks/
 ~>
 ~> email message... TEST
 ~> qwerty
 ~>
 ~> .
<~  250 Ok
 ~> QUIT
<~  221 Bye <id: 0A000402L46OXWGN>
=== Connection closed with remote host.
```
</details>

### 送信できない場合
プロトコル・ログから、エラー（SMTP応答コード）の内容を確認して対応しましょう。

::: note
  私の場合「535 authorization failed」ってエラーに遭遇して、
  認証？ユーザー名もパスワードも無問題ですよ？はて？となったんですが、
  どうやら、SMTP認証じゃなくOCIの[ポリシーで引っかかていた](https://qiita.com/viva1000/private/000eb8f7295519d40493#設定ociリソースdnsレコード追加:~:text=C%3A%5CUsers%5Cxxxxxxxx>-,ポリシー,-アイデンティティとセキュリティ)ようで、
  `Allow any-user to use email-family in compartment コンパートメント名`って
  ポリシーを追加設定して送信できるようになりました...
:::

結局は、気合です。

# RFCとか、SMTP応答コードとか
このあたりがとても参考になりました。感謝。
- [RFC5321](https://www.rfc-editor.org/rfc/rfc5321#section-4.2.1)
- [RFC5321翻訳](https://tex2e.github.io/rfc-translater/html/rfc5321.html#:~:text=4.2.1.%20Reply%20Code)
- [SMTPコマンドと応答コード](https://www.asahi-net.or.jp/~ax2s-kmtn/ref/smtp.html)
- [メールのエラーコードと、メールサーバのmaillog解析方法](https://oxynotes.com/?p=9810)
- [とほほさん：SMTP-AUTH](https://www.tohoho-web.com/ex/draft/smtp-auth.htm)