我啟動了應用程式的後端和前端,測試了所有元件,並在應用程式中導航。我把密碼重置功能留到最後。當我輸入電子郵件地址以發送 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 連接,並在發送電子郵件後立即關閉它,以避免逾時。
以下是我為此採取的步驟:
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