«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Функция сброса пароля: отладка SMTP

Функция сброса пароля: отладка SMTP

Опубликовано 3 ноября 2024 г.
Просматривать:914

Password Reset Feature: SMTP Debugging

Ошибка

Я развернул серверную часть и интерфейс приложения, протестировал все компоненты и перемещался по приложению. Функцию сброса пароля я оставил напоследок. Когда я ввел свой адрес электронной почты для отправки OTP, я получил следующую ошибку в виде предупреждения в веб-браузере:

write tcp 192.168.48.210:43244->103.103.197.223:587: write: сломанная труба

Ошибка могла воспроизводиться каждый раз, когда я пытался отправить OTP.

Отладка

Благодаря ChatGPT и некоторым исследованиям я понял следующее:

Сервер моего приложения пытается выполнить запись в TCP-соединение. Сервер пытается писать (электронную почту) с порта 43244 на моем компьютере (частный IP-адрес 192.168.48.210) на SMTP-сервер ZohoMail (IP-адрес 103.103.197.223, номер порта 587). Запись не удалась (запись: сломанный канал), так как она пыталась записать TCP-соединение, которое уже было закрыто.

Я обнаружил, что SMTP-сервер закроет все TCP-соединения, если он простаивает слишком долго.

То, что я делал раньше-

Функция SMTPConnect() из config/smtpConnection.go выполняет дозвон и аутентификацию при TCP-соединении с SMTP-сервером. Я вызвал эту функцию при инициализации серверного приложения.

Произошло следующее: когда я использовал SMTPClient после инициализации, приложение пыталось записать TCP-соединение, которое было создано при запуске приложения. Время ожидания этого TCP-соединения истекло, так как оно простаивало, когда по нему нечего было отправлять, поэтому я выдал ошибку.

Что мне нужно было сделать-

Вместо вызова функции SMTPConnect() в самом начале инициализации приложения мне нужно открывать TCP-соединение каждый раз перед отправкой электронного письма и закрывать его сразу после этого, чтобы избежать тайм-аута.

Вот шаги, которые я предпринял для этого:

  1. Удалите вызов функции SMTPConnect() из функции init() в main.go. Теперь функция init():
func init() {
    godotenv.Load()

    config.DBConnect()
    config.RedisConnect()
}
  1. Вызовите функцию SMTPConnect() в начале функции SendOTP, чтобы SMTP-соединение инициализировалось каждый раз, когда необходимо отправить электронное письмо.
  2. После завершения написания электронного письма закройте SMTP-соединение, вызвав метод close() в SMTPClient.

Вот окончательный код функции SendOTP после внесения изменений:

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
}

Теперь ошибка исправлена, и электронные письма отправляются так, как и должно быть.


Эта функция завершена. Спасибо за чтение.

Приложение развернуто на Render здесь
Исходный код находится в репозитории GitHub

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/bitorsic/password-reset-feature-smtp-debugging-2pla?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3