SSブログ

golangからGmailにメールできなかった。(→やっぱできた) [プログラミング]

GolangはGoogleが作った言語なんだけど、smtpパッケージで簡単なメールを送れるようになっている。送れるんだけどもGmail側で、しょぼいクライアントは拒否してしまうようになっているようだ。

まず特殊な環境で直接GmailのSMTPサーバじゃなくてリレーサーバを指定しないといけないところに無理があったのかもしれない。こんな風にsmtp.SendMail()で送れると思うでしょ?

https://blog.smtps.jp/entry/2019/07/10/163813

その環境はユーザー名とパスワードが要らないので、smtp.PlainAuth()で作る変数はnilに変えればよかった。適当なポートを指定して送れはしたんだけど、いつに経っても届きやしない。エラーは出ていないし、ポート番号を間違うとエラーになるので、手続き的に間違っているわけでもない。


ググって探し回っていると答えがあった。

https://blog.web-apps.tech/go-smtp-sendmail-without-mailserver/

上に書いてあるようにtelnetでつないで、エラーも出ず送れてはいるんだけど、実際には届いていない。何が悪いのかわからんかったけど、しょぼいクライアントからメールを出していると拒否されてしまうようだ。

https://qiita.com/Esfahan/items/6fa613069b13eb7daa17
googleが信頼性の低いアプリからのメールを受け付けない

自分はこれが問題であるようだった。だけど管理者ではないので自分ではその設定は変えられない。それまでLinuxのSendMailコマンドを使って送れていたので、それをGolang側からコマンドを呼び出すぐらいしか考えられない。すべてGolangでやろうとすると厳しそうだ。というか君、Google謹製言語のGolangだよね? なんでメールくらい送れないの? というか標準パッケージの操作を行ってもダメって厳しいよねw。


普通にGoogleのSMTPサーバを使えば自分の設定にできると思うので問題ないのだろうが、そういう環境ばかりではないと思うので、一応他のページで書いてあるように送れはするのだろうけど、とりあえず下のリンクでしょぼいクライアントでも受付するようにできるみたい。

https://myaccount.google.com/lesssecureapps

自分は環境により設定できませんでした。まぁ仕事だとできないこともある。


TLS関連でできないのかなと思ってもいたけれど、このソースではうまくいかず。つなぐところからこけていた気がした。
https://qiita.com/tamago0224/items/bdbc41432c43f0b569d3




と思っていたんだけど、あるサンプルコードを動かしたらGmailでメールを送れた。「googleが信頼性の低いアプリからのメールを受け付けない」というのは、この場合間違いであった。すいません m(_ _)m

https://gist.github.com/jim3ma/b5c9edeac77ac92157f8f8affa290f45

このソースを自分の状況に合わせて動かしたらすんなりメールが送れた。内容的な違いといえば、smtp.SendMail()を使わずに、プロトコルを一段一段実行しているところなんだけど、SendMail()に何か問題があるのだろうか?

ここにSendMail()内でやっている事のログを出せるみたい。結局パッケージ中で起こっていることはわからないから無理やり引っ張り出すしかないよな。

https://qiita.com/Neetless/items/6c802dddc52fa09aaede

なんにしても手続き的に順次やったらできて、一つの関数でできないということは、まとめ方が悪いとしか言いようがない。とりあえず、Gmailに送れてしまったので、SendMail()がやっている事を確かめるのは時間ができてからにしたい。どっちにせよ、どこかで失敗しているんだろうな。とりあえず考えられるのは、StartTLS()を使っているけど、エラーでプログラムを落とさずそのまま突き進んでいることだ。log.fatal()とかlog.panic()するとそこで終わっちゃうしね。その他のソースだとエラーを見て落とすようになっている。これではTLSを使っていない場合は続かなくはなる。

気になっているのは、StartTLSで落ちているんじゃないかということと、Mail()、Rcpt()ではname@hoge.comみたいな普通のメールアドレスを指定してあげるんだけど、Data()では<name@hoge.com>みたいに大なり小なりで括っているんだよね、たぶん。それがきちんとSendMail()で行っているのかというのが気がかり。

今は書かないけど、原因を突き止めて書きたいな。たぶんやったらここに続けて書くだろう。SendMail()で送れるよという記事も多いんだけれども、依然として一つ一つ手続き的にプロトコルを実行しているソースも多いので、たぶんSendMail()が完全ではないのかもしれない。





《後記》
SendMail()の詳細ログを出してみました。
https://qiita.com/Neetless/items/6c802dddc52fa09aaede
ここのまんまの事をやりました。実はこれをするのにかなり苦労して、自前のパッケージを入れるのがかなり苦労をしました。やたらgithubから取ってくるやり方を書いているんだけど、それはやったことあるので自分が書くパッケージを取り入れたいんじゃとイラつく。

GOPATHのsrcのところにおけばよさそうな感じなんだけど、今はそうなっていないようで、go mod initをやらないといけないらしい。上の$GOPATH/src/sandspace/smtp_test/smtp/ で行くとsandspaceディレクトリでgo mod init sandspaceを打って、go.modができた。そこからgo mod tidyを打てと言われたのでやったけど、
package sandspace/smtp_test/smtp is not in GOROOT(Goの標準パッケージのフォルダ)

みたいに出てうまく行かなかった。全然$GOPATHの中のディレクトリを見てくれない。

なんかGOPATHのディレクトリの中でやらないとできないのかなとか思ったけど、結局下のサイトのようにやったらできた。

https://qiita.com/tkj06/items/a5f79417935100045650

実際はコンパイルしたいファイルがあるディレクトリにsmtpフォルダだけを置いて、そのディレクトリのままで
go mod init test
go mod tidy

をして、
import "test/smtp"

すればよかった。なんかGOPATH全然関係ないじゃん。確かにGitHubから落としてくるときには、GOPATHの中に入っていたと思ったんだけどな。でも結局、できる事しかできると言えないよな。

たぶん昔はGOPATHの中に入れとけば使えたのかもしれないけど、今はできていないみたい。でも、そのままできるみたいなサイトが垢のように残ってしまっているのが、Google検索の敗北ですね。特に技術関係はすぐに使えなくなる確率が高いから、昔からのリンクが検索を邪魔をするってことが多いよな。

コンピュータ言語関係は基本的な文法とかは変わらないことが多いんだけれど、それ以外の環境関係が全然変わってしまうことも多いから、情報がすぐにゴミレベルのものになってしまう。動かない誤った情報は、障害にしかならんしね。そういうところはGoogle検索はうまく機能していない。文系的な固定的な情報ならいいのかもしれないけど、知見がころころ変わる分野には適していないんだよね。

とにかく、オレオレsmtpパッケージを使うことができたんだけど、普通に通信して普通に終わっていた。処理的にもsmtpパッケージの単体的な手続きと同じ事をしているっぽい。ログをここに出したい気もするのだが、出したところで誰かに助言してくれるでもないので、情報は出さないことにします。環境的に色々隠さないといけないし、それによって問題が隠れてしまうかもしれないし。


とりあえず、smtp.SendMail()が正常に動いているように見えて、実際にはメールが着信しないところまでは確かめた。smtpパッケージを段階的に個別にプロトコルを動かしているのにしたって、大して細かい事をしているわけじゃないんだよね。でも、SendMail()では送れないことは確かなのだ。

こうなったらステップ実行でもしたいところだけど、Golangでのデバッガってどうなっているんだろう。VSCodeでステップ実行とかできそうな気もするけど、正直VSCodeはオレオレツールが多すぎて確かな品質のものが少なかったりする。どうしようかな。もうメールは遅れているから、SendMail()に固執する必要はないんだけど。

コメント(0) 
共通テーマ:パソコン・インターネット

コメント 0