Puse en marcha el backend y el frontend de la aplicación, probé todos los componentes y navegué por la aplicación. Dejé la función de restablecimiento de contraseña para el final. Cuando ingresé mi dirección de correo electrónico para enviar la OTP, recibí el siguiente error como alerta en el navegador web:
escribir tcp 192.168.48.210:43244->103.103.197.223:587: escribir: tubería rota
El error se podía reproducir cada vez que intentaba enviar una OTP.
Con la ayuda de ChatGPT y algunas investigaciones, entendí lo siguiente:
El servidor de mi aplicación está intentando escribir en una conexión TCP. El servidor está intentando escribir (correo electrónico) desde el puerto 43244 de mi máquina (dirección IP privada 192.168.48.210) al servidor SMTP de ZohoMail (dirección IP 103.103.197.223, puerto número 587). La escritura falló (escritura: tubería rota), porque estaba intentando escribir en una conexión TCP que ya se había cerrado.
Descubrí que el servidor SMTP cerrará cualquier conexión TCP si está inactivo durante demasiado tiempo.
Lo que estaba haciendo antes-
La función SMTPConnect() de config/smtpConnection.go realiza el marcado y la autenticación, todo en una conexión tcp al servidor SMTP. Llamé a esta función mientras inicializaba la aplicación del servidor.
Lo que sucedió es que, cuando estaba usando SMTPClient después de la inicialización, la aplicación intentaba escribir en la conexión TCP que se creó cuando se inició la aplicación. Esta conexión TCP se agotó porque estaba inactiva cuando no había nada que enviar, por lo que me dio el error.
Lo que necesitaba hacer-
En lugar de llamar a la función SMTPConnect() justo al inicio cuando se inicializa la aplicación, necesito abrir una conexión TCP cada vez antes de enviar un correo electrónico y cerrarla inmediatamente después, para evitar que se agote el tiempo de espera.
Estos son los pasos que tomé para hacer esto:
func init() { godotenv.Load() config.DBConnect() config.RedisConnect() }
Aquí está el código final para la función SendOTP después de realizar los cambios:
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 }
Ahora, el error se ha solucionado y los correos electrónicos se envían como deberían.
La función ya está completa. Gracias por leer.
La aplicación está implementada en Render, aquí
El código fuente está en el repositorio de GitHub
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3