curl で smtp 経由でメールを送信する。
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 で送信できるわこれ。
smtp をTELNETで接続してメール送信テストしなくて済む。 ポート解放をしておけば、あとあと困らないでメール送信ができますね。
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-from
は smtp プロトコルだし、--user
はSMTP Auth用である。ややこしいですがそういうものなんでしょうね。
curl はほとんどの環境で使える。
curl はWindows に添付された ( C:/Windows/System32/curl.exe ) ので、すべての環境で使えるコマンドになった。
curl未インストールは、 alpine や debian 軽量版など、特殊状況に限られるようになった。
curl だけでメールは送れるし、コマンド呼び出しで使えるのである。
メールプログラムを書く、ライブラリをインストールするなど、車輪の再発明するくらいならcurl でいいのである。
2022-03-15 追記
EHLOについて追記。
2022-03-16 追記
メールボディ指定、FROM / mail-fromについて追記。
参考資料
16 Command Examples to Send Email From The Linux Command Line