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.
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 :
func init() { godotenv.Load() config.DBConnect() config.RedisConnect() }
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
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