Ir para o conteúdo principal

Configurando Amazon SES para envio de e-mail

·2120 palavras·10 minutos
aws ses email iam
Alfredo Castro
Autor
Alfredo Castro
AWS Solutions Architect | AWS x3 | LPI x2 | CompTIA Linux+
O Amazon Simple Email Service (SES) é um serviço econômico projetado para facilitar o envio de e-mails integrado a diversas aplicações, permitindo a automação de envios em larga escala.

Se você utiliza um software de e-mail para enviar mensagens transacionais, campanhas de marketing ou newsletters, o Amazon SES oferece uma estrutura de pagamento flexível, permitindo que você pague apenas pelo que efetivamente utilizar. Além disso, ele suporta diferentes configurações de implantação, como endereços IP dedicados, compartilhados ou próprios.

Neste tutorial, vou ajudá-lo a configurar o Amazon SES para o seu domínio. Vamos gerar uma credencial SMTP e enviar um e-mail de teste.

Pré-requisito: #

Uma conta AWS e um domínio (irei utilizar o domínio alfredocastro.com.br).

Etapa 01 - Configurando o Amazon SES #

Acesse a console AWS e procure pelo serviço “Amazon Simple Email Service”.

IMAGEM 01

No menu lateral a esquerda, clique em “Verified identities”.

IMAGEM 02

Clique em “Create identity”.

IMAGEM 03

Nesta etapa, você poderá escolher entre a criação de uma identidade do tipo “Domain” ou “Email address”.

Uma identidade do tipo “Domain” significa que após o Amazon SES configurado, você terá a capacidade de enviar e-mails representando qualquer endereço vinculado ao domínio configurado, por exemplo, você poderá enviar e-mails representando mkt@alfredocastro.com.br ou marketing@alfredocastro.com.br e assim por diante.

Já com a identidade do tipo “Email address”, você irá configurar o Amazon SES para enviar e-mails apenas com um determinado endereço de e-mail.

IMAGEM 04

Para este tutorial, vamos utilizar o tipo “Domain”, no campo “Domain” digite o seu domínio, deixe as demais configurações padrões e clique em “Create identity”.

IMAGEM 05

Pronto, você concluiu com sucesso a criação da identidade para o seu domínio.

Na próxima tela que abrir, será apresentada uma ação para confirmar que você é o proprietário desse domínio.

Você precisará criar alguns registros do tipo CNAME no seu DNS para configurar o DKIM e, dessa forma, confirmar a propriedade do domínio.

IMAGEM 06

Na aba “Authentication”, vá até o campo “Publish DNS records”, será exibido 3 registro DNS do tipo CNAME para serem criados em seu DNS.

IMAGEM 07

Etapa 02 - Criando os registro DNS #

Acesse o seu gerenciador de registros DNS do seu domínio.

Crie os registros do tipo CNAME conforme exibido na etapa anterior. Veja um exemplo:

IMAGEM 01

Para consultar a propagação do registro criado, consulte o site: WhatsMyDNS

IMAGEM 02
IMAGEM 03
IMAGEM 04

Após a propagação, você receberá um e-mail (e-mail que está configurado em sua Root Account da AWS) confirmando que a configuração do DKIM foi realizada com sucesso.

IMAGEM 05

Acesse o Amazon SES e entre na identidade que acabamos de criar, você irá conseguir visualizar o status como “Verified” e o status do DKIM como “Successful”.

IMAGEM 06

Etapa 03 - Solicitando acesso ao Amazon SES produção #

Acesse a console AWS e acesse o serviço “Amazon Simple Email Service”.

No menu lateral a esquerda, clique em “Account dashboard”.

IMAGEM 01

Veja na mensagem em amarelo, a identidade que acabamos de criar está no modo “Sandbox”, clique no botão “View Get set up page”.

IMAGEM 02

Nossa conta está em “Sandbox” e com algumas restrições de utilização, podemos enviar apenas 200 e-mails por 24 horas e podemos enviar apenas e-mails para a nossa própria identidade verificada.

Para remover essa restrição, precisamos abrir um chamado para a AWS, clique no botão “Request production access”.

IMAGEM 03

Precisamos preencher esse formulário explicando para qual finalidade iremos utilizar o Amazon SES, a AWS irá analisar a solicitação e se estiver de acordo irá liberar nossa identidade para o modo “Production”.

Em “Mail type” selecione qual tipo de email você irá enviar, se é e-mail do tipo “Marketing” ou “Transactional”, para este tutorial irei utilizar como “Transactional”.

Em “Website URL” digite a URL do site da sua empresa ou produto para que a AWS possa analisar qual o tipo do conteúdo será enviado.

Em “Use case description”, faça uma descrição do tipo de e-mail que será enviado e quais medidas você irá tomar para que os e-mails enviados não sejam considerados pelos usuários como Spam, a AWS solicita que você responda 3 questões:

1) How will you build or acquire your mailing list?
2) How will you handle bounces and complaints?
3) How can recipients unsubscribe from your mailing list, and how will you respond to those requests?

Eu utilizei o seguinte texto para a minha solicitação (basicamente expliquei que iria utilizar o Amazon SES como envio de email transacional, e-mails enviados por um novo sistema que estou criando e dei um exemplo do tipo de e-mail “Esqueci minha senha” e e-mails com novas postagens, também expliquei que para não ter meus e-mails marcados como indesejados ou serem enviados para o Spam, irei criar um link para que os usuários possam remover seu e-mail da lista de envio ou podem acessar o sistema e remover o envio de e-mails):

How will you build or acquire your mailing list?
It's a new system, I will use AWS SES to send emails to new registered users, to send "I forgot my password" emails and to send notifications of new posts made on the website.

How will you handle bounces and complaints?
Each user will can cancelate the notification of system. Or via a link that will be sent along with the email.

How can recipients unsubscribe from your mailing list, and how will you respond to those requests?
Each user will can cancelate the notification of system through of a option 'help' inside the system. Or via a link that will be sent along with the email.

As it is a new system, I believe that daily emails will be sent around 100 emails.

Marque a caixa “I agree to the AWS Service Terms and Acceptable Use Policy (AUP)” e clique em “Submit request”.

IMAGEM 04

Você receberá uma mensagem informando que a requisição foi enviada com sucesso e a AWS irá revisar em 24 horas. O status será alterado para “Under review”.

IMAGEM 05

Atualize a página e você irá visualizar uma mensagem com o ID do ticket aberto para a AWS. Você pode clicar no link e ir até o ticket para enviar mais informações para a AWS, caso a AWS encontre alguma inconsistencia, ela irá enviar uma mensagem pelo ticket.

IMAGEM 06

Após a análise da AWS, você irá receber uma e-mail (e-mail da conta Root Account) avisando que o Amazon SES foi liberado para o modo “Production”.

IMAGEM 07

Acesse o serviço novamente e clique em “Account dashboard”, agora podemos ver que a nossa cota para envios de e-mails foi alterada para 50.000 e-mails por 24 horas e o nosso status está como “Healthy”.

Esse número de e-mails foi definido pela AWS, você consegue solicitar um ajuste conforme a utilização.

A AWS fornece um dashboard onde podemos ver como está nossa utilização diária.

IMAGEM 08

Etapa 04 - Criando credencial SMTP via AWS Console #

Agora que já possuimos o nosso Amazon SES configurado e habilitado para envio de e-mails, devemos gerar uma credencial SMTP.

Acesse a console AWS e acesse o serviço “Amazon Simple Email Service”.

No menu lateral a esquerda, clique em “SMTP settings”.

IMAGEM 01

Clique no botão “Create SMTP credentials”.

IMAGEM 02

Por padrão, a AWS irá criar o “User name” como “ses-smtp-user.YYYYMMDD-HHMMSS”, caso você queira, poderá alterar o nome do “User name”, abaixo irá mostrar qual a permissão o usuário possui.

Basicamente a AWS cria um usuário IAM com uma Policy de Allow para ses:SendRawEmail, ela gera uma Access keys e executa um script para gerar uma credencial SMTP.

IMAGEM 03

Eu alterei o nome do meu usuário para “ses-smtp-alfredo”, clique em “Create user”.

IMAGEM 04

Copie os dados exibidos na tela e salve em um local seguro o “SMTP username” e “SMTP password” é a nossa credencial de autenticação no Amazon SES para envio de e-mails. Clique em “Return to SES console”.

IMAGEM 05

Retornando à guia “SMTP settings”, encontraremos as informações essenciais para a configuração da nossa aplicação, incluindo o “SMTP endpoint”, as configurações de “TLS” e “Port”.

IMAGEM 06

Etapa 05 - Criando credencial SMTP via credencial programática #

Nesta etapa irei demonstrar como gerar uma credencial SMTP via credencial programática, para isso é necessário executar um script para transformar a Secret Key em uma credencial SMTP.

NOTA: A credencial SMTP é gerada por região e só funciona para o Amazon SES daquela região, você pode utilizar a mesma Secret Key para gerar credencial SMTP para outras regiões.

Acesse a console AWS e acesse o serviço “IAM”.

No menu lateral a esquerda, clique em “Users”.

IMAGEM 01

Clique em “Create user”.

IMAGEM 02

Em “User name”, defina um nome para o seu usuário e clique em “Next”.

IMAGEM 03

Iremos definir as permissões depois, apenas clique em “Next”.

IMAGEM 04

Clique em “Create user”.

IMAGEM 05

Clique no usuário que acabamos de criar.

IMAGEM 06

Clique em “Add permissions” e em seguida clique em “Create inline policy”.

IMAGEM 07

Altere o “Policy editor” para “JSON”.

IMAGEM 08

Cole o seguinte JSON no “Policy editor” e clique em “Next”.

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "ses:SendRawEmail",
            "Resource": "*"
        }
    ]
}

IMAGEM 09

Defina um nome para a Policy e clique em “Create policy”.

IMAGEM 10

Clique na aba “Security credentials”.

IMAGEM 11

Em “Access keys”, clique em “Create access key”.

IMAGEM 12

Escolha a “Use case” como “Other” e clique em “Next”.

IMAGEM 13

Clique em “Create access key”.

IMAGEM 14

Salve a “Access key” e a “Secret access key” gerada em um local seguro, clique em “Done”.

IMAGEM 15
IMAGEM 16

Agora, precisamos converter nossa “Secret access key” em uma credencial SMTP.

Utilizei um Linux com Ubuntu 22.04. Primeiro, instalei o python3 e, em seguida, criei o arquivo com o script em python. Ao executar o script, forneça a “Secret access key” e, em seguida, indique a região para a qual deseja gerar a credencial SMTP. Neste tutorial, estamos usando a região us-east-1.

apt-get update
apt-get install python3 -y
vim /tmp/ses.py

Script:

#!/usr/bin/env python3

import hmac
import hashlib
import base64
import argparse

SMTP_REGIONS = [
    "us-east-2",  # US East (Ohio)
    "us-east-1",  # US East (N. Virginia)
    "us-west-2",  # US West (Oregon)
    "ap-south-1",  # Asia Pacific (Mumbai)
    "ap-northeast-2",  # Asia Pacific (Seoul)
    "ap-southeast-1",  # Asia Pacific (Singapore)
    "ap-southeast-2",  # Asia Pacific (Sydney)
    "ap-northeast-1",  # Asia Pacific (Tokyo)
    "ca-central-1",  # Canada (Central)
    "eu-central-1",  # Europe (Frankfurt)
    "eu-west-1",  # Europe (Ireland)
    "eu-west-2",  # Europe (London)
    "eu-south-1",  # Europe (Milan)
    "eu-north-1",  # Europe (Stockholm)
    "sa-east-1",  # South America (Sao Paulo)
    "us-gov-west-1",  # AWS GovCloud (US)
]

# These values are required to calculate the signature. Do not change them.
DATE = "11111111"
SERVICE = "ses"
MESSAGE = "SendRawEmail"
TERMINAL = "aws4_request"
VERSION = 0x04


def sign(key, msg):
    return hmac.new(key, msg.encode("utf-8"), hashlib.sha256).digest()


def calculate_key(secret_access_key, region):
    if region not in SMTP_REGIONS:
        raise ValueError(f"The {region} Region doesn't have an SMTP endpoint.")

    signature = sign(("AWS4" + secret_access_key).encode("utf-8"), DATE)
    signature = sign(signature, region)
    signature = sign(signature, SERVICE)
    signature = sign(signature, TERMINAL)
    signature = sign(signature, MESSAGE)
    signature_and_version = bytes([VERSION]) + signature
    smtp_password = base64.b64encode(signature_and_version)
    return smtp_password.decode("utf-8")


def main():
    parser = argparse.ArgumentParser(
        description="Convert a Secret Access Key to an SMTP password."
    )
    parser.add_argument("secret", help="The Secret Access Key to convert.")
    parser.add_argument(
        "region",
        help="The AWS Region where the SMTP password will be used.",
        choices=SMTP_REGIONS,
    )
    args = parser.parse_args()
    print(calculate_key(args.secret, args.region))


if __name__ == "__main__":
    main()

Executando o script:

NOTA: A saída do script será a sua credencial SMTP.

python3 /tmp/ses.py AedgghOlpaoKFYZ+5w/aoAo/BEBb/1z9RQ2V4N9W us-east-1

IMAGEM 17

Etapa 06 - Testando envio de e-mail via AWS Console #

Agora vamos realizar um teste de envio de e-mail utilizando a própria Console da AWS.

Acesse a console AWS e acesse o serviço “Amazon Simple Email Service”.

No menu lateral a esquerda, clique em “Verified identities”.

IMAGEM 01

Clique no seu domínio.

IMAGEM 02

Clique no botão “Send test email”.

IMAGEM 03

Em “Email format”, selecione “Formatted”.

Em “From-address”, digite o nome do email que irá enviar a mensagem.

Em “Scenario”, selecione “Custom”.

Em “Custom recipient”, digite o e-mail do destinatário, quem irá receber o nosso e-mail de teste.

Em “Subject”, digite um assunto para o e-mail.

Em “Body”, digite uma mensagem de teste.

Clique em “Send test email”.

IMAGEM 04

Veja as informações extraida do e-mail de teste que acabamos de enviar:

IMAGEM 05
IMAGEM 06

Nosso e-mail foi enviado com sucesso!

Etapa 07 - Testando envio de e-mail via script #

Agora vamos realizar um teste de envio de e-mail utilizando um script bash utilizando a nossa credencial SMTP gerada na etapa 05.

Utilizei o mesmo Linux com Ubuntu 22.04, primeiro instalei o sendemail e em seguida criei o arquivo com o script em bash com permissão de execução. Antes de executar o script, altere as variáveis conforme o seu ambiente.

apt-get update
apt-get install sendemail -y
vim /tmp/email.sh

Script:

#!/bin/bash

# STMP endpoint
SMTP_HOST="email-smtp.us-east-1.amazonaws.com"
# STARTTLS Port
SMTP_PORT="587"
# Access key
SMTP_USER="AKIAR3YIWCET3TYHQR6T"
# Credencial SMTP
SMTP_PASS="BHqSfD7stBQJf55FGQ9RoSeNK5h2E0LvOaQFl0DmZs2Z"
# Remetente
EMAIL_FROM="contato2@alfredocastro.com.br"
# Destinatário
EMAIL_TO="alfredotavio@gmail.com"
# Assunto
SUBJECT="Teste de Envio 2"
# Mensagem
echo "E-mail de teste 2" | \
        sendemail -o tls=yes -f ${EMAIL_FROM} -u ${SUBJECT} -t ${EMAIL_TO} -s ${SMTP_HOST}:${SMTP_PORT} -xu ${SMTP_USER} -xp ${SMTP_PASS}

Executando o script:

chmod +x /tmp/email.sh
/tmp/email.sh

IMAGEM 01

Veja as informações extraida do e-mail de teste que acabamos de enviar utilizando nosso script em bash:

IMAGEM 02
IMAGEM 03

Espero tê-lo ajudado! Se houver alguma dúvida, não hesite em entrar em contato.