Muitas vezes, você pode precisar enviar e-mails para muitas contas usando programas para autenticação e muitos outros propósitos.
O protocolo SMTP define padrões que permitem a comunicação de e-mail entre servidores de e-mail e agentes de transferência de e-mail, enquanto o protocolo IMAP é para recebimento de e-mails.
Go fornece funcionalidade para atividades relacionadas a e-mail definidas pelo RFC no pacote net/smtp, que também contém extensões 8BITMIME, AUTH e STARTTLS.
O código usado neste projeto está disponível em um Repositório do GitHub e é gratuito para você usar sob a licença do MIT.
Como enviar e-mails em Go usando o pacote Net/SMTP
O pacote net/smtp faz parte da biblioteca padrão Go, então você não precisa instalar nenhum pacote externo. Você só precisa importar o pacote antes de usá-lo.
importar (
"net/smtp"
"registro"
"cripto/tls"
"fm"
)
Você também precisará importar o registro pacote para registrar erros no console e no criptografia/tls pacote para configurar uma conexão segura.
Depois de importar o pacote net/smtp, você deve escrever um Enviar correio() função para enviar o correio e, em seguida, chamar a função na função principal.
funçãoa Principal() {
fmt. Imprimir (EnviarMail())
}
funçãoEnviar correio()corda {
// Adicione o código aqui
}
o Enviar correio() A função conteria o código que envia o e-mail aos destinatários.
Como o envio de e-mails funciona
O protocolo SMTP define os parâmetros que todo e-mail precisa ter. Esses parâmetros são os endereços de e-mail do remetente e do destinatário, uma porta na qual o e-mail é enviado, um servidor host e uma mensagem.
Os parâmetros indicados acima são importantes para o envio de e-mails.
Neste tutorial, você aprenderá a enviar e-mails do Yahoo. No entanto, o processo é o mesmo para qualquer provedor de servidor de email (MSP) que você usar.
Como você está usando o Yahoo Mail, faça login no seu E-mail do Yahoo conta, vá para Informações da Conta, e clique no Segurança da conta aba. Em seguida, gere uma senha de aplicativo. Você precisará nomear o aplicativo e, em seguida, o Yahoo Mail criará uma senha para o aplicativo e você poderá usar a senha em seu código junto com seu endereço de e-mail.
No Enviar correio() função, você declarará três variáveis; uma variável que contém a string do seu e-mail, uma que contém a senha do seu e-mail e uma string que contém o endereço de e-mail para o qual você está enviando mensagens.
from := "[email protected]"
password := "aSecurePasswordHere"
para := "[email protected]"
Você pode usar uma fatia e percorrer os elementos se você pretende enviá-los para vários destinatários.
Obtendo e configurando o host e a porta de e-mail
O protocolo SMTP usa os números do host e da porta para identificar a origem do email. É aí que entra o seu MSP. Você precisa saber o host e o número da porta que seu MSP permite que você use.
Verifique este recurso para obter uma lista de hosts MSP e números de porta se você usa e-mails públicos como Gmail, Yahoo ou Outlook. O Google desativou “aplicativos menos seguros” para o Gmail; você pode querer proteger seu aplicativo se estiver usando o Gmail.
Depois de obter o número da porta e o endereço do host, atribua-os a variáveis como esta:
host := "smtp.mail.yahoo.com"
porta := "465"
Os números de host e porta acima são do Yahoo Mail para uso em contas normais. O servidor está hospedado em smtp.mail.yahoo.com, e você tem permissão para usar a porta 465 para enviar e-mails.
Declarando o conteúdo do e-mail
O próximo passo é declarar o conteúdo do correio como variáveis. O assunto e o corpo compõem a mensagem.
subject := "Ei, estou apenas verificando você."
body := "Espero que você esteja bem! Como você está hoje. "
o sujeito variável é o assunto do email; a corpo variável é o corpo do e-mail que você está enviando.
Configurando os cabeçalhos de e-mail
Você precisará fazer um mapa de strings para denotar os cabeçalhos do e-mail.
cabeçalhos := faço(mapa[corda]corda)
headers["From"] = from
headers["Para"] = para
headers["Assunto"] = assunto
mensagem := ""
por k, v := variar cabeçalhos {
mensagem += fmt. Sprintf("%s: %s\r", k, v)
}
mensagem += "\r" + corpo
Primeiro, você cria um mapa de chaves e valores de string e define os cabeçalhos do seu endereço, o endereço do destinatário e o assunto, conforme mostrado acima. Usando um loop for de intervalo no cabeçalhos mapa, um mensagem A variável é declarada para conter os cabeçalhos e a mensagem usando formatação de string.
Autenticação do e-mail
O email precisa de autenticação para verificar a origem. O pacote smtp fornece funcionalidade para autenticação de e-mail usando o PlainAuth. o PlainAuth O método recebe a identidade, o e-mail do remetente, a senha e o host como parâmetros e retorna um Autenticação objeto que você usará para enviar o e-mail.
autenticar := smtp. PlainAuth("", de, senha, host)
A identidade é seu nome de usuário, que pode ser deixado em branco, como visto neste caso.
Criando uma conexão para o e-mail
Alguns provedores de serviços de e-mail exigem que você envie o e-mail por meio de uma conexão. Neste artigo, faremos uma conexão TCP para o servidor com configurações TLS.
tlsConfig := &tls. Configuração{
InsecureSkipVerify: verdadeiro,
Nome do servidor: host,
}
No código acima, você fez uma configuração TLS referenciando o Configuração estrutura onde InsecureSkipVerify foi definido para verdadeiro, e o nome do servidor foi atribuído ao hospedeiro variável.
Você deve criar uma conexão TCP usando o Discar método do tls pacote. o discar O método recebe o tipo de conexão (TCP), neste caso, o endereço do servidor e as configurações de conexão TLS.
conexão, err := tls. Dial("tcp", serverAddress, tlsConfig) err != nada {
registro. Pânico (err)
}
No código acima, você fez uma conexão TCP e lidou com erros; você terá instanciado um novo pacote smtp usando o Novo cliente método do net/smtp pacote. o Novo cliente O método recebe uma conexão e um host, respectivamente.
smtpClient, err := smtp. NewClient (conexão, host)
E se err!= nada {
registro. Pânico (err)
}
Agora que você criou um smtp instância do cliente, você deve definir os parâmetros da smtpClient e lidar com erros.
E se err = smtpCliente. Autenticar (autenticar); err!= nada {
registro. Pânico (err)
}
E se err = smtpCliente. Mail de); err!= nada {
registro. Pânico (err)
}
E se err = smtpCliente. Rcpt (headers["Para"]); err!= nada {
registro. Pânico (err)
}
No exemplo acima, você passou os parâmetros de autenticação, endereço do remetente e endereço do destinatário para seus respectivos métodos e tratou de erros.
Por fim, você precisa gravar na instância de conexão e pode fazer isso criando um gravador usando o Dados método do seu cliente smtp instância.
escritor, err := smtpClient. Dados()
E se err!= nada {
registro. Pânico (err)
}
_, erro = escritor. Escreva([]byte(mensagem))
E se err!= nada {
registro. Pânico (err)
}
Depois de criar um escritor, você escreve uma fatia de byte da mensagem usando o Escreva método como no exemplo acima.
erro = escritor. Perto()
E se err!= nada {
registro. Pânico (err)
}
err = smtpCliente. Desistir()
E se err!= nada {
Retorna
}
Retorna "Sucesso, o e-mail foi enviado!"
Feche o gravador e saia da instância de conexão do cliente smtp usando o código acima. o Enviar correio() A função retorna uma mensagem de sucesso, conforme mostrado acima.
Ao chamar o Enviar correio() função no a Principal função, você deve obter a mensagem de sucesso registrada em seu console e o email` enviado ao seu destinatário.
Há mais no pacote Net
O pacote net contém muitos pacotes para funcionalidades relacionadas à rede e o pacote smtp é apenas um deles. Você também pode usar os pacotes TCP e HTTP para desenvolvimento relacionado à rede.
Você pode achar o pacote net/smtp esmagador se não for um desenvolvedor de back-end. Existem muitas outras alternativas para enviar e-mails rapidamente com menos linhas de código. Você pode conferir empresas de marketing por e-mail como SendGrid, Twilio e MailChimp e serviços de newsletter como Substack e Revue que permitem enviar e-mails para muitos usuários sem estresse.