Ich habe das Backend und Frontend für die App hochgefahren, alle Komponenten getestet und durch die App navigiert. Ich habe die Funktion zum Zurücksetzen des Passworts zum letzten Mal verlassen. Als ich meine E-Mail-Adresse zum Senden des OTP eingegeben habe, erhielt ich die folgende Fehlermeldung als Warnung im Webbrowser:
write tcp 192.168.48.210:43244->103.103.197.223:587: write: kaputtes Rohr
Der Fehler konnte jedes Mal reproduziert werden, wenn ich versuchte, ein OTP zu senden.
Mit Hilfe von ChatGPT und einigen Recherchen habe ich Folgendes verstanden:
Der Server meiner App versucht, auf eine TCP-Verbindung zu schreiben. Der Server versucht, E-Mails vom Port 43244 auf meinem Computer (private IP-Adresse 192.168.48.210) an den SMTP-Server von ZohoMail (IP-Adresse 103.103.197.223, Port-Nr. 587) zu schreiben. Der Schreibvorgang ist fehlgeschlagen (write:kaputte Pipe), da versucht wurde, auf eine bereits geschlossene TCP-Verbindung zu schreiben.
Ich habe festgestellt, dass der SMTP-Server alle TCP-Verbindungen schließt, wenn er zu lange im Leerlauf ist.
Was ich vorher gemacht habe-
Die Funktion SMTPConnect() aus config/smtpConnection.go führt die Einwahl und Authentifizierung über eine TCP-Verbindung zum SMTP-Server durch. Ich habe diese Funktion beim Initialisieren der Server-App aufgerufen.
Als ich den SMTPClient nach der Initialisierung verwendete, versuchte die App, auf die TCP-Verbindung zu schreiben, die beim Start der App erstellt wurde. Bei dieser TCP-Verbindung ist eine Zeitüberschreitung aufgetreten, da sie im Leerlauf war, obwohl nichts über sie gesendet werden konnte, was mir den Fehler angezeigt hat.
Was ich tun musste-
Anstatt die Funktion SMTPConnect() gleich zu Beginn aufzurufen, wenn die App initialisiert wird, muss ich jedes Mal eine TCP-Verbindung öffnen, bevor ich eine E-Mail sende, und sie direkt danach schließen, um eine Zeitüberschreitung zu vermeiden.
Hier sind die Schritte, die ich dazu unternommen habe:
func init() { godotenv.Load() config.DBConnect() config.RedisConnect() }
Hier ist der endgültige Code für die SendOTP-Funktion, nachdem die Änderungen vorgenommen wurden:
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 }
Jetzt wurde der Fehler behoben und die E-Mails werden wie vorgesehen versendet.
Die Funktion ist nun abgeschlossen. Vielen Dank fürs Lesen.
Die App wird hier auf Render bereitgestellt
Der Quellcode befindet sich im GitHub Repository
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3