🌟

sendgridのSMTPでメールを送る方法(nc/go)

2023/06/10に公開

背景

クラウドのSMTPサーバで遊ぶ夢は各社のVMからのOP25Bで儚く潰えたため、SendGridを使うことにした。APIでは添付ファイルサイズの制限(20MB)があるが、SMTPで送るには設定上の制限はないとのこと(ただし、大きなサイズのファイルを送らないよう強く推奨)なので、こちらを試すことにする。

Sendgridコントロールパネルからの設定

sender verification

Settings->Sender Verification

spamに使われないよう、登録時にも用途などの人力確認などありました。アカウントが作成されたらコンソールにログイン(英語のみ)

送信元のアドレスとして使えるようにするにはドメイン単位かアドレス単位かの指定がありどちらでもよいですが実行しておきます。ドメインの方がSPF/DKIMなども対応してくれるようなのでよいかと思います。アドレス単位の送信元にフリーメールアドレスを入力すると、「推奨しない」と言われてしまいます。これはフリーメールのドメイン自体にSPF/DKIMを設定できないからでしょう。

設定完了するとこんな感じになります。SMTPのfromでこのアドレスを指定します(envelope fromも)

APIKeyの作成

Settings->API Keys

Create API Keyをクリックして、作成します。

Restricted AccessのMail Sendだけ権限あればとりあえずOK

Keyが作成されるので、こちらの文字列を保存。この画面でしか表示されません。

これで準備完了

SMTPで送信してみる

SMTPAUTHには以下の情報を使います。

  • ID:apikey
  • pw:上で作成したキー文字列

SMTPAUTHに必要な情報を用意しておきます。

> echo -n 'apikey' | openssl base64
> echo -n '<apikey>' | openssl base64

つなぎます

> nc smtp.sendgrid.com 587
EHLO test
250-smtp.sendgrid.net
250-8BITMIME
250-PIPELINING
250-SIZE 31457280
250-STARTTLS
250-AUTH PLAIN LOGIN
250 AUTH=PLAIN LOGIN
AUTH LOGIN
334 VXNlcm5hbWU6
YXBpa2V5
334 UGFzc3dvcmQ6
<apikeyのデコード文字列>
235 Authentication successful
MAIL From:*<sender verificationしたアドレス>*
250 Sender address accepted
RCPT To:*john.doe@gmail.com*
250 Recipient address accepted
DATA
354 Continue
From: *<sender verificationしたアドレス>*
To: *john.doe@gmail.com*
Subject: test

testmail
.
250 Ok: queued as 

メールヘッダのfrom,to,subjectがないとエラーになるっぽいです。

goの実装

こちらです。
環境変数にするid/pwは平文で設定してください

https://gist.github.com/hitoshiichikawa/fa10ac6540cb97c3ef5d65451afd64e3

Discussion