"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Recurso de redefinição de senha: depuração SMTP

Recurso de redefinição de senha: depuração SMTP

Publicado em 2024-11-03
Navegar:778

Password Reset Feature: SMTP Debugging

O inseto

Eu criei o backend e o frontend do aplicativo, testei todos os componentes, navegando pelo aplicativo. Deixei o recurso de redefinição de senha para o final. Ao inserir meu endereço de e-mail para enviar o OTP, recebi o seguinte erro como alerta no navegador:

escrever tcp 192.168.48.210:43244->103.103.197.223:587: escrever: tubo quebrado

O bug poderia ser reproduzido toda vez que eu tentasse enviar um OTP.

Depuração

Com a ajuda do ChatGPT e algumas pesquisas, entendi o seguinte:

O servidor do meu aplicativo está tentando gravar em uma conexão TCP. O servidor está tentando escrever (e-mail) da porta 43244 da minha máquina (endereço IP privado 192.168.48.210) para o servidor SMTP do ZohoMail (endereço IP 103.103.197.223, porta nº 587). A gravação falhou (write:broken pipe), porque estava tentando gravar em uma conexão TCP que já foi fechada.

Descobri que o servidor SMTP fechará todas as conexões TCP se ficar ocioso por muito tempo.

O que eu estava fazendo antes-

A função SMTPConnect() de config/smtpConnection.go realiza discagem e autenticação em uma conexão TCP com o servidor SMTP. Chamei essa função ao inicializar o aplicativo do servidor.

O que aconteceu é que, quando eu estava usando o SMTPClient após a inicialização, o aplicativo estava tentando gravar na conexão TCP que foi criada quando o aplicativo foi iniciado. O tempo limite desta conexão TCP expirou porque estava ocioso quando não havia nada para enviar, causando o erro.

O que eu precisava fazer-

Em vez de chamar a função SMTPConnect() logo no início, quando o aplicativo é inicializado, preciso abrir uma conexão TCP todas as vezes antes de enviar um e-mail e fechá-la logo em seguida, para evitar o tempo limite.

Aqui estão as etapas que segui para fazer isso:

  1. Remova a chamada para a função SMTPConnect() da função init() em main.go. Agora a função init() é:
func init() {
    godotenv.Load()

    config.DBConnect()
    config.RedisConnect()
}
  1. Chame a função SMTPConnect() no início da função SendOTP, para que a conexão SMTP seja inicializada sempre que um e-mail precisar ser enviado
  2. Depois que o email for escrito, feche a conexão SMTP chamando close() no SMTPClient

Aqui está o código final para a função SendOTP após fazer as alterações:

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
}

Agora, o bug foi corrigido e os e-mails estão sendo enviados como deveriam.


O recurso foi concluído. Obrigado por ler.

O aplicativo é implantado no Render, aqui
O código fonte está no repositório GitHub

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/bitorsic/password-reset-feature-smtp-debugging-2pla?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3