」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 密碼重設功能:SMTP 調試

密碼重設功能:SMTP 調試

發佈於2024-11-03
瀏覽:352

Password Reset Feature: SMTP Debugging

我啟動了應用程式的後端和前端,測試了所有元件,並在應用程式中導航。我把密碼重置功能留到最後。當我輸入電子郵件地址以發送 OTP 時,我在網頁瀏覽器中收到以下錯誤警報:

寫入 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