앱의 백엔드와 프런트엔드를 가동하고 모든 구성 요소를 테스트하고 앱을 탐색했습니다. 비밀번호 재설정 기능을 마지막으로 남겨두었습니다. OTP를 보내기 위해 이메일 주소를 입력했을 때 웹 브라우저에 다음 오류가 경고로 표시되었습니다:
tcp 192.168.48.210:43244->103.103.197.223:587 쓰기: 쓰기: 깨진 파이프
OTP를 보내려고 할 때마다 버그가 재현될 수 있었습니다.
ChatGPT와 일부 연구의 도움으로 다음 내용을 이해했습니다.
내 앱의 서버가 TCP 연결에 쓰려고 합니다. 서버가 내 컴퓨터의 포트 43244(개인 IP 주소 192.168.48.210)에서 ZohoMail의 SMTP 서버(IP 주소 103.103.197.223, 포트 번호 587)로 쓰기(이메일)를 시도하고 있습니다. 이미 닫힌 TCP 연결에 쓰려고 했기 때문에 쓰기에 실패했습니다(쓰기:깨진 파이프).
SMTP 서버가 너무 오랫동안 유휴 상태일 경우 모든 TCP 연결을 닫는다는 사실을 발견했습니다.
내가 이전에 하고 있던 일-
config/smtpConnection.go의 SMTPConnect() 함수는 SMTP 서버에 대한 TCP 연결에서 전화 접속 및 인증을 모두 수행합니다. 서버 앱을 초기화하면서 이 함수를 호출했습니다.
초기화 후 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