我启动了应用程序的后端和前端,测试了所有组件,并在应用程序中导航。我把密码重置功能留到最后。当我输入电子邮件地址发送 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