"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Función de restablecimiento de contraseña: depuración SMTP

Función de restablecimiento de contraseña: depuración SMTP

Publicado el 2024-11-03
Navegar:817

Password Reset Feature: SMTP Debugging

El error

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.

Depuración

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:

  1. Elimine la llamada a la función SMTPConnect() de la función init() en main.go. Ahora la función init() es:
func init() {
    godotenv.Load()

    config.DBConnect()
    config.RedisConnect()
}
  1. Llame a la función SMTPConnect() al inicio de la función SendOTP, para que la conexión SMTP se inicialice cada vez que se deba enviar un correo electrónico
  2. Una vez que el correo electrónico haya terminado de escribirse, cierre la conexión SMTP llamando a close() en SMTPClient.

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

Declaración de liberación Este artículo se reproduce en: https://dev.to/bitorsic/password-reset-feature-smtp-debugging-2pla?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

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