"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Fonction de réinitialisation du mot de passe : débogage SMTP

Fonction de réinitialisation du mot de passe : débogage SMTP

Publié le 2024-11-03
Parcourir:246

Password Reset Feature: SMTP Debugging

Le bug

J'ai lancé le backend et le frontend de l'application, testé tous les composants et parcouru l'application. J'ai laissé la fonction de réinitialisation du mot de passe pour la fin. Lorsque j'ai saisi mon adresse e-mail pour envoyer l'OTP, j'ai reçu l'erreur suivante sous forme d'alerte dans le navigateur Web :

écrire tcp 192.168.48.210:43244->103.103.197.223:587 : écrire : tuyau cassé

Le bug pouvait être reproduit à chaque fois que j'essayais d'envoyer un OTP.

Débogage

Avec l'aide de ChatGPT et quelques recherches, j'ai compris ce qui suit :

Le serveur de mon application essaie d'écrire sur une connexion TCP. Le serveur essaie d'écrire (e-mail) depuis le port 43244 de ma machine (adresse IP privée 192.168.48.210) vers le serveur SMTP de ZohoMail (adresse IP 103.103.197.223, port n° 587). L'écriture a échoué (écriture : tuyau cassé), car elle essayait d'écrire sur une connexion TCP déjà fermée.

J'ai découvert que le serveur SMTP ferme toutes les connexions TCP s'il reste inactif trop longtemps.

Ce que je faisais avant-

La fonction SMTPConnect() de config/smtpConnection.go effectue la numérotation et l'authentification sur une connexion TCP au serveur SMTP. J'ai appelé cette fonction lors de l'initialisation de l'application serveur.

Ce qui s'est passé, c'est que lorsque j'utilisais SMTPClient après l'initialisation, l'application essayait d'écrire sur la connexion TCP créée au démarrage de l'application. Cette connexion TCP a expiré car elle était inactive alors qu'il n'y avait rien à envoyer dessus, ce qui m'a donné l'erreur.

Ce que je devais faire-

Au lieu d'appeler la fonction SMTPConnect() dès le début lors de l'initialisation de l'application, je dois ouvrir une connexion TCP à chaque fois avant d'envoyer un email, et la fermer juste après, afin d'éviter son expiration.

Voici les étapes que j'ai suivies pour ce faire :

  1. Supprimez l'appel à la fonction SMTPConnect() de la fonction init() dans main.go. Maintenant, la fonction init() est :
func init() {
    godotenv.Load()

    config.DBConnect()
    config.RedisConnect()
}
  1. Appelez la fonction SMTPConnect() au début de la fonction SendOTP, afin que la connexion SMTP soit initialisée à chaque fois qu'un email doit être envoyé
  2. Une fois l'e-mail rédigé, fermez la connexion SMTP en appelant close() sur le SMTPClient

Voici le code final de la fonction SendOTP après avoir effectué les modifications :

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
}

Maintenant, le bug a été corrigé et les e-mails sont envoyés comme ils devraient l'être.


La fonctionnalité est maintenant terminée. Merci d'avoir lu.

L'application est déployée sur Render, ici
Le code source se trouve dans le référentiel GitHub

Déclaration de sortie Cet article est reproduit sur : https://dev.to/bitorsic/password-reset-feature-smtp-debugging-2pla?1 En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3