「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > パスワード リセット機能: SMTP デバッグ

パスワード リセット機能: SMTP デバッグ

2024 年 11 月 3 日に公開
ブラウズ:246

Password Reset Feature: SMTP Debugging

バグ

アプリのバックエンドとフロントエンドを起動し、すべてのコンポーネントをテストし、アプリ内を移動しました。パスワードリセット機能は最後まで残しました。 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 接続を開き、直後に閉じる必要があります。

これを行うために私が行った手順は次のとおりです:

  1. main.go の init() 関数から SMTPConnect() 関数の呼び出しを削除します。 init() 関数は次のようになります。
func init() {
    godotenv.Load()

    config.DBConnect()
    config.RedisConnect()
}
  1. SendOTP 関数の開始時に SMTPConnect() 関数を呼び出して、電子メールを送信する必要があるたびに SMTP 接続が初期化されるようにします。
  2. 電子メールの作成が完了したら、SMTPClient で close() を呼び出して SMTP 接続を閉じます。

変更後の 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 リポジトリにあります

リリースステートメント この記事は次の場所に転載されています: https://dev.to/bitorsic/password-reset-feature-smtp-debugging-2pla?1 侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3