はじめに
みなさま、swaksコマンドを活用されていますでしょうか?
メールサーバーの構築・運用をしていると、「実際にSMTP認証を通してメールが送れるか」を素早く確認したい場面がよくあります。
そんなときに便利なのが swaks(Swiss Army Knife for SMTP)です。
読み方は「スワックス」で、メール送信のテストツールです。
telnetでSMTPコマンドを手打ちする必要がなく、1行のコマンドで認証からメール送信までを完結できます。
そんなswaksコマンドについて、紹介させていただきます。
環境
OS : AlmaLinux 9
swaksバージョン : 20240103
使い方
まずはシンプルにメールを送信します。
swaks --server 192.0.2.219:587 \
--auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
--from 'future@example.co.jp' \
--to 'test@example.co.jp' \
--header 'Subject: test mail' \
--body 'test'
各オプションを説明します。
| 接続先の指定 |
| --server 192.0.2.219:587 |
接続先のSMTPサーバーをIPアドレス(またはホスト名)とポート番号で指定します。今回はSubmissionポートである587番を使用しています。
| 認証情報の指定 |
| --auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' |
SMTP認証の方式として PLAIN を指定し、あわせて認証に使うユーザー名とパスワードを指定します。これでSMTP認証に必要な情報の指定は完了です。
| メールデータの指定 |
| --from 'future@example.co.jp' \ --to 'test@example.co.jp' \ --header 'Subject: test mail' \ --body 'test' |
--from : Fromアドレス(SMTPプロトコル上のMAIL FROM)
--to : Toアドレス(SMTPプロトコル上のRCPT TO)
--header : 件名(Subject)などのメールヘッダーを指定
--body : メール本文を指定
これでメールデータの指定も完了です。
| 実行結果 |
実際に実行すると、以下のようにSMTPサーバーとのやり取り(送受信コマンド)がすべて標準出力に表示されるため、どこで詰まっているかを一目で確認できます。
$ swaks --server 192.0.2.219:587 \
> --auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
> --from 'future@example.co.jp' \
> --to 'test@example.co.jp' \
> --header 'Subject: test mail' \
> --body 'test'
=== Trying 192.0.2.219:587...
=== Connected to 192.0.2.219.
<- 220 testmail.example.com ESMTP Postfix
-> EHLO mail.example.co.jp
<- 250-testmail.example.com
<- 250-PIPELINING
<- 250-SIZE 36700160
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH PLAIN LOGIN
<- 250-AUTH=PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 CHUNKING
-> AUTH PLAIN XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<- 235 2.7.0 Authentication successful
-> MAIL FROM:<future@example.co.jp>
<- 250 2.1.0 Ok
-> RCPT TO:<test@example.co.jp>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Sun, 23 Aug 2026 15:58:16 +0900
-> To: test@example.co.jp
-> From: future@example.co.jp
-> Subject: test mail
-> Message-Id: <20260823155816.620992@mail.example.co.jp>
-> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/
->
-> test
->
->
-> .
<- 250 2.0.0 Ok: queued as 930BC10302C97
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
エンベロープFromとヘッダFromで別のアドレスを指定しましょう。
先ほどの例では --from の値がそのままメールの From: ヘッダとしても使われていましたが、本来、両者は別の役割を持つものです。
エンベロープFrom(--from / SMTPのMAIL FROM) : SMTPプロトコル上でやり取りされる送信者情報。バウンスメール(不達通知)の送り先として使われる、いわば「配送用」のアドレス
ヘッダFrom(メール本文中のFrom:) : メールソフトの受信画面などに表示される「差出人」アドレス。人が目にする、いわば「表示用」のアドレス
--header で From: を明示的に指定することで、両者を異なるアドレスに分けて送信できます。
swaks --server 192.0.2.219:587 \
--auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
--from 'future-env@example.co.jp' \
--header 'From: future@example.co.jp' \
--to 'test@example.co.jp' \
--header 'Subject: test mail' \
--body 'test'
| 実行結果 |
$ swaks --server 192.0.2.219:587 \
> --auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
> --from 'future-env@example.co.jp' \
> --header 'From: future@example.co.jp' \
> --to 'test@example.co.jp' \
> --header 'Subject: test mail' \
> --body 'test'
=== Trying 192.0.2.219:587...
=== Connected to 192.0.2.219.
<- 220 testmail.example.com ESMTP Postfix
-> EHLO mail.example.co.jp
<- 250-testmail.example.com
<- 250-PIPELINING
<- 250-SIZE 36700160
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH PLAIN LOGIN
<- 250-AUTH=PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 CHUNKING
-> AUTH PLAIN XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<- 235 2.7.0 Authentication successful
-> MAIL FROM:<future-env@example.co.jp>
<- 250 2.1.0 Ok
-> RCPT TO:<test@example.co.jp>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Sun, 23 Aug 2026 16:17:08 +0900
-> To: test@example.co.jp
-> From: future@example.co.jp
-> Subject: test mail
-> Message-Id: <20260823161708.621948@mail.example.co.jp>
-> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/
->
-> test
->
->
-> .
<- 250 2.0.0 Ok: queued as 3E32510302C88
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
$
添付ファイルを付けて送信してみましょう。
メール送信の実装によっては、添付ファイルが正しくエンコード・送信されるかを確認したいケースもあります。swaksでは --attach オプションでファイルを添付できます。
swaks --server 192.0.2.219:587 \
--auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
--from 'future-env@example.co.jp' \
--header 'From: future@example.co.jp' \
--to 'test@example.co.jp' \
--header 'Subject: test mail' \
--body 'test' --attach /tmp/test.txt
--attach にファイルパスを指定するだけで、swaksが自動的にMIMEタイプを判定し、Base64エンコードした上でmultipartメールとして組み立てて送信してくれます。| 実行結果 |
$
$ swaks --server 192.0.2.219:587 \
> --auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
> --from 'future-env@example.co.jp' \
> --header 'From: future@example.co.jp' \
> --to 'test@example.co.jp' \
> --header 'Subject: test mail' \
> --body 'test' --attach /tmp/test.txt
=== Trying 192.0.2.219:587...
=== Connected to 192.0.2.219.
<- 220 testmail.example.com ESMTP Postfix
-> EHLO mail.example.co.jp
<- 250-testmail.example.com
<- 250-PIPELINING
<- 250-SIZE 36700160
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH PLAIN LOGIN
<- 250-AUTH=PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 CHUNKING
-> AUTH PLAIN XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<- 235 2.7.0 Authentication successful
-> MAIL FROM:<future-env@example.co.jp>
<- 250 2.1.0 Ok
-> RCPT TO:<test@example.co.jp>
<- 250 2.1.5 Ok
-> DATA
<- 354 End data with <CR><LF>.<CR><LF>
-> Date: Sun, 23 Aug 2026 16:23:26 +0900
-> To: test@example.co.jp
-> From: future@example.co.jp
-> Subject: test mail
-> Message-Id: <20260823162326.622259@mail.example.co.jp>
-> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/
-> MIME-Version: 1.0
-> Content-Type: multipart/mixed; boundary="----=_MIME_BOUNDARY_000_622259"
->
-> ------=_MIME_BOUNDARY_000_622259
-> Content-Type: text/plain
->
-> test
-> ------=_MIME_BOUNDARY_000_622259
-> Content-Type: application/octet-stream
-> Content-Disposition: attachment
-> Content-Transfer-Encoding: BASE64
->
-> L3RtcC90ZXN0LnR4dA==
->
-> ------=_MIME_BOUNDARY_000_622259--
->
->
-> .
<- 250 2.0.0 Ok: queued as 2697B10302C88
-> QUIT
<- 221 2.0.0 Bye
=== Connection closed with remote host.
$
TLSによる暗号化通信を確認してみましょう。
これまでの例では認証情報や本文がそのままの形でSMTPサーバーとやり取りされていましたが、実運用では通信経路の暗号化が欠かせません。swaksは --tls オプションを付けるだけで、STARTTLSによる暗号化通信に対応できます。
swaks --server 192.0.2.219:587 \
--auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
--from 'future-env@example.co.jp' \
--header 'From: future@example.co.jp' \
--to 'test@example.co.jp' \
--header 'Subject: test mail' \
--body 'test' --attach /tmp/test.txt --tls
--tls を指定すると、swaksはSMTP接続の途中で STARTTLS コマンドを送信し、以降のやり取り(認証情報・本文・添付ファイルなど)をすべてTLSで暗号化した通信路に切り替えます。これまで紹介してきたPLAIN認証やヘッダ情報、添付ファイルの内容も、暗号化された通信の中でやり取りされるようになります。
| 実行結果 |
$ swaks --server 192.0.2.219:587 \
> --auth PLAIN --auth-user 'future@example.co.jp' --auth-password 'password' \
> --from 'future-env@example.co.jp' \
> --header 'From: future@example.co.jp' \
> --to 'test@example.co.jp' \
> --header 'Subject: test mail' \
> --body 'test' --attach /tmp/test.txt --tls
=== Trying 192.0.2.219:587...
=== Connected to 192.0.2.219.
<- 220 testmail.example.com ESMTP Postfix
-> EHLO mail.example.co.jp
<- 250-testmail.example.com
<- 250-PIPELINING
<- 250-SIZE 36700160
<- 250-ETRN
<- 250-STARTTLS
<- 250-AUTH PLAIN LOGIN
<- 250-AUTH=PLAIN LOGIN
<- 250-ENHANCEDSTATUSCODES
<- 250-8BITMIME
<- 250-DSN
<- 250 CHUNKING
-> STARTTLS
<- 220 2.0.0 Ready to start TLS
=== TLS started with cipher TLSv1.3:TLS_AES_256_GCM_SHA384:256
=== TLS client certificate not requested and not sent
=== TLS no client certificate set
=== TLS peer[0] subject=[/CN=nxtcloud.fsi.ne.jp]
=== commonName=[nxtcloud.fsi.ne.jp], subjectAltName=[DNS:nxtcloud.fsi.ne.jp] notAfter=[2026-11-15T10:53:39Z]
=== TLS peer[1] subject=[/C=US/O=Let's Encrypt/CN=YE2]
=== commonName=[YE2], subjectAltName=[] notAfter=[2028-09-02T23:59:59Z]
=== TLS peer[2] subject=[/C=US/O=ISRG/CN=Root YE]
=== commonName=[Root YE], subjectAltName=[] notAfter=[2032-09-02T23:59:59Z]
=== TLS peer[3] subject=[/C=US/O=Internet Security Research Group/CN=ISRG Root X2]
=== commonName=[ISRG Root X2], subjectAltName=[] notAfter=[2032-09-02T23:59:59Z]
=== TLS peer certificate passed CA verification, failed host verification (using host 192.0.2.219 to verify)
~> EHLO mail.example.co.jp
<~ 250-testmail.example.com
<~ 250-PIPELINING
<~ 250-SIZE 36700160
<~ 250-ETRN
<~ 250-AUTH PLAIN LOGIN
<~ 250-AUTH=PLAIN LOGIN
<~ 250-ENHANCEDSTATUSCODES
<~ 250-8BITMIME
<~ 250-DSN
<~ 250 CHUNKING
~> AUTH PLAIN XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
<~ 235 2.7.0 Authentication successful
~> MAIL FROM:<future-env@example.co.jp>
<~ 250 2.1.0 Ok
~> RCPT TO:<test@example.co.jp>
<~ 250 2.1.5 Ok
~> DATA
<~ 354 End data with <CR><LF>.<CR><LF>
~> Date: Sun, 23 Aug 2026 16:27:17 +0900
~> To: test@example.co.jp
~> From: future@example.co.jp
~> Subject: test mail
~> Message-Id: <20260823162717.622412@mail.example.co.jp>
~> X-Mailer: swaks v20240103.0 jetmore.org/john/code/swaks/
~> MIME-Version: 1.0
~> Content-Type: multipart/mixed; boundary="----=_MIME_BOUNDARY_000_622412"
~>
~> ------=_MIME_BOUNDARY_000_622412
~> Content-Type: text/plain
~>
~> test
~> ------=_MIME_BOUNDARY_000_622412
~> Content-Type: application/octet-stream
~> Content-Disposition: attachment
~> Content-Transfer-Encoding: BASE64
~>
~> L3RtcC90ZXN0LnR4dA==
~>
~> ------=_MIME_BOUNDARY_000_622412--
~>
~>
~> .
<~ 250 2.0.0 Ok: queued as DB17710302C88
~> QUIT
<~ 221 2.0.0 Bye
=== Connection closed with remote host.
$
まとめ
いかがでしたか?
メールサーバーの構築・移行時の疎通確認や、送信元アプリケーションの実装検証など、幅広い場面で活用できます。トラブルシュートの際は、まずswaksで最小構成から段階的にオプションを足していき、SMTPサーバーとのやり取りをログで確認しながら原因を切り分けていくのがおすすめです。
ぜひ、swaks コマンドを活用してみてください。

