Я развернул серверную часть и интерфейс приложения, протестировал все компоненты и перемещался по приложению. Функцию сброса пароля я оставил напоследок. Когда я ввел свой адрес электронной почты для отправки 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-соединение каждый раз перед отправкой электронного письма и закрывать его сразу после этого, чтобы избежать тайм-аута.
Вот шаги, которые я предпринял для этого:
func init() { godotenv.Load() config.DBConnect() config.RedisConnect() }
Вот окончательный код функции 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
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3