„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Funktion zum Zurücksetzen des Passworts: SMTP-Debugging

Funktion zum Zurücksetzen des Passworts: SMTP-Debugging

Veröffentlicht am 03.11.2024
Durchsuche:990

Password Reset Feature: SMTP Debugging

Der Käfer

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.

Debuggen

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:

  1. Entfernen Sie den Aufruf der Funktion SMTPConnect() aus der Funktion init() in main.go. Die Funktion init() lautet nun:
func init() {
    godotenv.Load()

    config.DBConnect()
    config.RedisConnect()
}
  1. Rufen Sie die Funktion SMTPConnect() zu Beginn der SendOTP-Funktion auf, damit die SMTP-Verbindung jedes Mal initialisiert wird, wenn eine E-Mail gesendet werden muss
  2. Sobald die E-Mail fertig geschrieben ist, schließen Sie die SMTP-Verbindung, indem Sie close() auf dem SMTPClient aufrufen

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

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/bitorsic/password-reset-feature-smtp-debugging-2pla?1 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

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