Go言語でメール送信ができない件

こんにちは。KOUKIです。

とある企業でGo言語の開発を行っているのですが、最近メール送信機能を担当しました。

Go言語って、メール送信できるんだっけ?」と思って調べてみたら「smtp」パッケージというものがありました。

これでメールが送れる!と思って以下のプログラムを実行したところ、「Username and Password not accepted」エラーが発生しました。

このエラーについて回避策を2つほど検討したので、その内容を記事にしています。

前提

SMTPサーバーに「Gmail」を指定したプログラムでエラーを確認しています。
hostname := “smtp.gmail.com”

回避策1: Gmailのセキュリティを下げる

先ほどのエラーの原因は、Gmailのセキュリティが堅牢すぎてGmailアプリ以外からのアクセスをブロックしてしまうことにあります

そのため、セキュリティ的には問題ありますが、Googleアカウントの「安全性の低いアプリのアクセス」を「オン」にすることで回避します。

決して推奨される方法ではありませんので、自己責任でお願いします。

Gmailにアクセス

Gmailにアクセスしましょう。

Googleアカウントにアクセス

Gmailの「Googleアプリ」からアカウントを選択します。

セキュリティ -> 安全性の低いアプリのアクセス

「セキュリティ」を選択して、ページをスクロールすると「安全性の低いアプリのアクセス」があるはずです。

この設定を「オン」にすることで、メールが飛ぶようになりました。ただ、何度も言うようにセキュリティ的には問題あるので、実験が終わったら元に戻しておくことをおすすめします。

回避策2: そもそもGmailを使わない

ローカルでメール送信機能を試したいというだけならば、Gmailを使う必要がないことに気がつきました。

Dockerイメージのmailhogを使うとSMTPサーバーを簡単に立ち上げられるので、サクッと作ってしまいましょう。

ワークスペースの作成

最初にワークスペースを作成します。

Dockerfileの作成

Dockerfileを作成します。

docker-compose.ymlの作成

次にdocker-compose.ymlを作成します。

メール送信アプリを作成

Go言語で簡単に書きます。

動作確認

docker-compose upでコンテナを立ち上げるとメールが飛ぶようになっています。

terminal上の出力からメール送信に成功したことがわかります。

送信されたメールを確認してみましょう。「http://localhost:8025」をブラウザで開いてみてください。

見ての通り、メールボックスになっていて、ここでメールを確認することができます。

おわりに

Go言語は、メールも飛ばせていいですよね。

しかも、DockerとのコンボでSMTPサーバーを自前で用意できるので、メール機能の実装の練習にはもってこいです。

goroutineと組み合わせて、メール送信を連続で送りつけてみるとかして遊んでみたいと思います。

それでは、また!

Go記事まとめ

おすすめ書籍

コメントを残す