GitHub Codespacesで始めるSendGrid
この記事は、Twilio Advent Calendar 2022の3日目の記事です。
構造計画研究所のキクタローです。メール送信サービスの「Twilio SendGrid」のサポートエンジニアとして働いてます。
ユーザの皆さんからのお問い合わせを毎日みていると、SMTPやWeb APIでメールを送信するようなチュートリアルレベルの内容であっても、ちょっとした環境の違いや不備によってつまづいてしまう事例をみかけます。私自身も最初の頃によくありました。
エンジニアと一言でいってもスキルの幅や深さは異なるので、例えばtelnetを使ったことがない方やcurlでAPIを叩いたことがない方など様々いらっしゃいます。そのため、チュートリアルは皆が同じ環境、同じツールを使えるといいのになぁ、と思うこともしばしば。
そんな中、少し前にGitHub Codespacesが全ユーザに提供というニュースがあって、これを使えばSMTPやWeb APIの呼び出しを簡単にできるよな〜と思いました。いや、それGitPodとかでもできるで、というのは置いておいて;
そんなわけで、GitHub CodespacesでSendGridのSMTPとWeb APIを簡単に実行できるリポジトリを作ってみました。
使い方
まずはGitHubのリポジトリの「Code」から「Create Codespace on main」を選択します。
しばらくするとVSCode Onlineが開きます。send.shとcurl.shの2つのシェルがあるのでメールの送信方法に合わせてシェルの中身を少し書き換えます。
SMTP
send.shの"SG.xxxxx"の部分をSendGridのAPIキーに置き換えます。
pass=$(echo -n "SG.xxxxx" | openssl base64 -A)
続いて宛先を自分のメールアドレスにします。
to=to@example.com
必要に応じてfromも変更してください。あとはシェルを実行するだけです。
./send.sh
send.shの中身は次のとおりです。
#!/bin/sh
host=smtp.sendgrid.net
port=587
user=YXBpa2V5
pass=$(echo -n "SG.xxxxx" | openssl base64 -A)
to=to@example.com
from=from@example.com
BODY=$(cat << EOS
To: $to
From: Sender <from@example.com>
Subject: Hello, World!
Content-Type: text/plain; charset=utf-8;
Hello, World!
.
EOS
)
mail_input () {
echo "EHLO localhost"
sleep 1
echo "auth login"
echo "$user"
echo "$pass"
echo "mail from: $from"
echo "rcpt to: $to"
echo "data"
echo "$BODY"
echo "quit"
}
# send
mail_input | nc $host $port
Web API
curl.shの"SG.xxxxx"の部分をSendGridのAPIキーに置き換えます。
--header 'Authorization: Bearer SG.xxxxx' \
宛先を自分のメールアドレスにします。
"email": "to@example.com"
SMTP同様、必要に応じてfromも変更してください。あとはシェルを実行するだけです。
./curl.sh
curl.shの中身は次のとおりです。単純にcurlコマンドを叩いているだけです。
#!/bin/bash
curl --request POST \
--url https://api.sendgrid.com/v3/mail/send \
--header 'Authorization: Bearer SG.xxxxx' \
--header 'Content-Type: application/json' \
--data @- << EOS
{
"personalizations": [
{
"to": [
{
"email": "to@example.com"
}
]
}
],
"from": {
"email": "from@example.com"
},
"subject": "Hello, World!",
"content": [
{
"type": "text/plain",
"value": "Hello, World!"
}
]
}
EOS
これで、いつでも誰でも同じ環境でSMTP、Web APIが実行できます。手元でうまく動かない、という方はぜひ上記の環境をお試しください。
(おまけ)仕組み
環境はMicrosoftが提供するdevcontainerを利用して設定しています。
Discussion
ローカルの環境に依存せず使えるのいいですね!
細かいですが記事内のsend.sh、ヘッダとボディの間に空行が必要そうです(GitHubの方は大丈夫です)
ご指摘ありがとうございます!空行を追加しました。コピペしたときに崩れてしまったようです。
チュートリアルとかにシェル埋め込めると一番いいんだけどねw