アプリのバックエンドとフロントエンドを起動し、すべてのコンポーネントをテストし、アプリ内を移動しました。パスワードリセット機能は最後まで残しました。 OTP を送信するために電子メール アドレスを入力すると、Web ブラウザーに次のエラーが警告として表示されました:
書き込み tcp 192.168.48.210:43244->103.103.197.223:587: 書き込み: 壊れたパイプ
OTP を送信しようとするたびにバグが再現される可能性がありました。
ChatGPT といくつかの調査の助けを借りて、私は次のことを理解しました:
アプリのサーバーが TCP 接続に書き込もうとしています。サーバーは、私のマシンのポート 43244 (プライベート IP アドレス 192.168.48.210) から ZohoMail の SMTP サーバー (IP アドレス 103.103.197.223、ポート番号 587) に (メールを) 書き込もうとしています。すでに閉じられている TCP 接続に書き込もうとしたため、書き込みが失敗しました (書き込み:壊れたパイプ)。
SMTP サーバーのアイドル状態が長すぎると、TCP 接続がすべて閉じられることがわかりました。
前にやってたこと -
config/smtpConnection.go の関数 SMTPConnect() は、SMTP サーバーへの TCP 接続上でダイヤルアップと認証をすべて実行します。サーバーアプリの初期化中にこの関数を呼び出しました。
何が起こったかというと、初期化後に SMTPClient を使用しているときに、アプリが起動時に作成された TCP 接続に書き込もうとしていました。この TCP 接続は、送信するものが何もないときにアイドル状態になったためタイムアウトになり、エラーが発生しました。
私がしなければならなかった事 -
アプリの初期化時にすぐに SMTPConnect() 関数を呼び出すのではなく、タイムアウトを避けるために、電子メールを送信する前に毎回 TCP 接続を開き、直後に閉じる必要があります。
これを行うために私が行った手順は次のとおりです:
func init() { godotenv.Load() config.DBConnect() config.RedisConnect() }
変更後の SendOTP 関数の最終コードは次のとおりです:
func SendOTP(otp string, recipient string) error { // connecting here because connection tends to time out config.SMTPConnect() sender := os.Getenv("SMTP_EMAIL") client := config.SMTPClient // setting the sender err := client.Mail(sender) if err != nil { return err } // set recipient err = client.Rcpt(recipient) if err != nil { return err } // start writing email writeCloser, err := client.Data() if err != nil { return err } // contents of the email msg := fmt.Sprintf(emailTemplate, recipient, otp) // write the email _, err = writeCloser.Write([]byte(msg)) if err != nil { return err } // close and send email err = writeCloser.Close() if err != nil { return err } // close smtp connection err = client.Close() if err != nil { return err } return nil }
現在、バグは修正され、メールは正常に送信されるようになりました。
この機能は完了しました。読んでいただきありがとうございます。
アプリはここの Render にデプロイされています
ソースコードは GitHub リポジトリにあります
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3