"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > 비밀번호 재설정 기능: SMTP 디버깅

비밀번호 재설정 기능: SMTP 디버깅

2024-11-03에 게시됨
검색:697

Password Reset Feature: SMTP Debugging

버그

앱의 백엔드와 프런트엔드를 가동하고 모든 구성 요소를 테스트하고 앱을 탐색했습니다. 비밀번호 재설정 기능을 마지막으로 남겨두었습니다. 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 연결을 열고 바로 닫아 시간 초과를 방지해야 합니다.

이를 위해 수행한 단계는 다음과 같습니다.

  1. main.go의 init() 함수에서 SMTPConnect() 함수에 대한 호출을 제거합니다. 이제 init() 함수는 다음과 같습니다:
func init() {
    godotenv.Load()

    config.DBConnect()
    config.RedisConnect()
}
  1. SendOTP 함수 시작 시 SMTPConnect() 함수를 호출하여 이메일을 보내야 할 때마다 SMTP 연결이 초기화되도록 합니다.
  2. 이메일 작성이 완료되면 SMTPClient에서 close()를 호출하여 SMTP 연결을 닫습니다.

변경 후 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에서 복제됩니다.1 침해 내용이 있는 경우, [email protected]으로 연락하여 삭제하시기 바랍니다.
최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3