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 informaçã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 MIT.
Porquê enviar e-mails em Go usando o pacote Net/SMTP
O pacote net/smtp faz segmento da livraria padrão Go, logo você não precisa instalar nenhum pacote extrínseco. Você só precisa importar o pacote antes de usá-lo.
import (
"net/smtp"
"log"
"crypto/tls"
"fmt"
)
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 grafar um Enviar correio() função para enviar o correio e, em seguida, invocar a função na função principal.
func main() {
fmt.Print(SendMail())
}
func SendMail() string {
}
o Enviar correio() A função conteria o código que envia o e-mail aos destinatários.
Porquê 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 supra 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.
Porquê você está usando o Yahoo Mail, faça login na sua conta do Yahoo Mail, 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 := "yourMail@gmail.com"
password := "aSecurePasswordHere"
to := "anemail@gmail.com"
Você pode usar uma fatia e percorrer os elementos se pretender 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. É cá que entra o seu MSP. Você precisa saber o host e o número da porta que seu MSP permite que você use.
Verifique leste recurso para obter uma lista de hosts MSP e números de porta se você usa e-mails públicos uma vez que 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 uma vez que esta:
host := "smtp.mail.yahoo.com"
port := "465"
Os números de host e porta supra 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 texto do e-mail
O próximo passo é declarar o texto do correio uma vez que variáveis. O peça e o corpo compõem a mensagem.
subject := "Hey, I'm Just Checking On You."
body := "Hope you're doing okay! How are you doing today. "
o sujeito variável é o peça do email; a corpo variável é o corpo do e-mail que você está enviando.
Você precisará fazer um vegetal de strings para denotar os cabeçalhos do email.
headers := make(map[string]string)
headers["From"] = from
headers["To"] = to
headers["Subject"] = subject
message := ""
for k, v := range headers {
message += fmt.Sprintf("%s: %sr", k, v)
}
message += "r" + body
Primeiro, você cria um vegetal de chaves e valores de string e define os cabeçalhos de seu endereço, o endereço do destinatário e o peça, conforme mostrado supra. Usando um loop for de pausa no cabeçalhos vegetal, um mensagem A variável é declarada para sofrear 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 uma vez que parâmetros e retorna um Autenticação objeto que você usará para enviar o e-mail.
authenticate := smtp.PlainAuth("", from, password, host)
A identidade é seu nome de usuário, que pode ser deixado em branco, uma vez que 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 cláusula, faremos uma conexão TCP com o servidor com configurações TLS.
tlsConfig := &tls.Config{
InsecureSkipVerify: true,
ServerName: host,
}
No código supra, você fez uma forma TLS referenciando o Laia estrutura onde InsecureSkipVerify foi definido para verdadeiroe o nome do servidor foi atribuído ao hospedeiro variável.
Você deve fabricar 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.
connection, err := tls.Dial("tcp", serverAddress, tlsConfig) err != nil {
log.Panic(err)
}
No código supra, 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(connection, host)
if err != nil {
log.Panic(err)
}
Agora que você criou um smtp instância do cliente, você deve definir os parâmetros da smtpClient e mourejar com erros.
if err = smtpClient.Auth(authenticate); err != nil {
log.Panic(err)
}
if err = smtpClient.Mail(from); err != nil {
log.Panic(err)
}
if err = smtpClient.Rcpt(headers["To"]); err != nil {
log.Panic(err)
}
No exemplo supra, 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 término, 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.
writer, err := smtpClient.Data()
if err != nil {
log.Panic(err)
}
_, err = writer.Write([]byte(message))
if err != nil {
log.Panic(err)
}
Depois de fabricar um gravador, você escreve uma fatia de bytes da mensagem usando o Escreva método uma vez que no exemplo supra.
err = writer.Close()
if err != nil {
log.Panic(err)
}
err = smtpClient.Quit()
if err != nil {
return
}
return "Successful, the mail was sent!"
Feche o gravador e saia da instância de conexão do cliente smtp usando o código supra. o Enviar correio() A função retorna uma mensagem de sucesso, conforme mostrado supra.
Ao invocar 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 é somente um deles. Você também pode usar os pacotes TCP e HTTP para desenvolvimento relacionado à rede.
Você pode encontrar 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 uma vez que SendGrid, Twilio e MailChimp e serviços de newsletter uma vez que Substack e Revue que permitem enviar e-mails para muitos usuários sem estresse.