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.
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:
func init() { godotenv.Load() config.DBConnect() config.RedisConnect() }
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
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