それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

curl でSMTP経由のメール送信

curlsmtp 経由でメールを送信する。

curl -v --url 'smtp://192.168.1.1:2525' \
  --upload-file sample-mail.txt \
  --mail-from takuya@example.com \
  --mail-rcpt takuya@example.com

curl で送信できるわこれ。

smtpTELNETで接続してメール送信テストしなくて済む。 ポート解放をしておけば、あとあと困らないでメール送信ができますね。

curl って万能ですね。

ELHO ホスト名を指定する場合

Postfixをポートフォワーディングで使っていて、 Helo command rejected: need fully-qualified hostname となる場合

curl -v --url 'smtp://192.168.1.1:2525/smtp.example.com' \
  --mail-from takuya@example.com \

このように、スラッシュのあとに、EHLOのホスト名を追記すればいい。

curl で smtps で gmail 経由する場合

メールのログインとパスワードを追記したら SMTP-AUTH を経由してSMTPSでメールが送信できる。

curl --url "smtps://smtp.gmail.com:465" \
\ 
 --ssl-reqd --mail-from "sender@gmail.com"  \
 --user "sender@gmail.com:senderGmailPassword" \
\
 --mail-rcpt "example@gmail.com"\
 --upload-file /var/scripts/mail.txt \

GMAILのメール送信もcurl で1行でできるので、google の 「 less scure app ( 安全性の低いアプリ)」が1ヶ月未使用ならオフにされちゃうので定期的にログインしておくのに良さそう

postfix 相手にSMTPS (SSL / starttls ) で、オレオレ証明書

Postfixオレオレ証明書を使っていて、Submissionポート 587 を通して接続する場合

startls は内部がSMTPなので、smtp:// を使う。smtps ではない。ただし、starttls でSSLを使うので --ssl をつける。さらに、証明書がオレオレ証明書なので -k / --insecure をつける。

curl -v --url 'smtp://10.185.93.22:587/mailcow.example.com' --ssl -k

さらに、それが、SMTP Auth を経由する場合

curl -v --url 'smtp://10.185.93.22:587/mailcow.example.com'  --user "takuya@example.com:PASSWORD" --ssl 

なんかオプションが増えて大変だけど、ちゃんと送信できる。

TO / FROM を正確に記述する

curl は to(recpt) / from をSMTPプロトコルにつかうので、メールの本文のFROM/TOは書き換えは行われない。当然であるが。

メールのボディを指定して、FROM/TOとSubjectを正確に記載すると普通のメールとして送信が可能。SMTPの動作チェックであればなくても構わないので上記まででは省略してた。

echo 'To: takuya@example.com
From: takuya@mydomain.tld
Subject: this is a test from 465

this is a test
using smtps
' \
| curl -v --ssl --url 'smtps://mailcow.mydomain.tld:465' \
   --mail-from service@mydomain.tld \
   --mail-rcpt takuya@example.com \
   --user "account@mydomain.tld:XXX_PASS_XXX" \
   -T -

ここでは、--mail-from と、ボディの From: と、--user は、敢えてすべて異なるようにしている。SMTPではこれらを一致させる必要はなく、実際にこれで送れてしまうのだ。

一般のメールだと、拒否されるかもしれないが、smtp replay に直接投げ込みできると送信が可能なのである。

そして、From:が受信者のメーラーで表示されるはずだ。 ---mail-fromsmtp プロトコルだし、--userSMTP Auth用である。ややこしいですがそういうものなんでしょうね。

curl はほとんどの環境で使える。

curlWindows に添付された ( C:/Windows/System32/curl.exe ) ので、すべての環境で使えるコマンドになった。

curl未インストールは、 alpine や debian 軽量版など、特殊状況に限られるようになった。

curl だけでメールは送れるし、コマンド呼び出しで使えるのである。

メールプログラムを書く、ライブラリをインストールするなど、車輪の再発明するくらいならcurl でいいのである。

2022-03-15 追記

EHLOについて追記。

SMTP + start TLS について追記。

2022-03-16 追記

メールボディ指定、FROM / mail-fromについて追記。

参考資料

https://stackoverflow.com/questions/10523147/what-are-the-curl-smtp-command-line-arguments-to-support-gmail-tls-starttls-v

16 Command Examples to Send Email From The Linux Command Line

Sending email - Everything curl