O que é o SES
Dentre os serviços disponíveis no Amazon AWS, existe um exclusivo para envio de e-mail, é o SES (Amazon Simple Email Service).
Criando as chaves para acessar o serviço
Antes de utilizar esse serviço, é necessário criar as chaves de acesso para a API, para isso, siga os seguintes passos:
- Acesse o site da Amazon:
http://aws.amazon.com/, clique em “Sign in to the AWS Management Console e forneça o seu usuário e senha
-
Clique em “Security Credentials”.

-
Clique na opção “Create a new Access Key”.

-
Serão geradas duas chaves: “Access Key” e “Secret Access Key”. Você precisará dessas chaves para fazer o envio.
Cadastrando os remetentes
Você só pode enviar e-mail utilizando remetentes cadastrados, para cadastrar um remetente siga os seguintes passos:
- Acesse a área SES do console do Amazon AWS. https://console.aws.amazon.com/ses/home

- Adicione o endereço do e-mail de remetente que deseja adicionar.

- Você receberá um e-mail nessa conta. Clique no link do e-mail recebido para confirmar esse remetente.
Envio utilizando a API via C#
Para fazer envio de e-mail utilizando o serviço SES do Amazon AWS utilizando a linguaguem C#, siga os seguintes passos:
- Baixe a API .NET da Amazon no seguinte endereço: http://aws.amazon.com/sdkfornet/
- Instale a API
- Adicione no seu projeto uma referência para a DLL “AWSSDK.dll”, deve ter sido instalada no caminho: “C:\Program Files (x86)\AWS SDK for .NET\bin\AWSSDK.dll”
O código da rotina de envio é o seguinte:
public static Boolean SendRawEmail(String from, String to, String cc, String Subject, String text, String html, String replyTo, String returnPath, List<System.Net.Mail.Attachment> attachmentList)
{
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress(from);
List<string> toAddresses = to.Replace(", ", ",").Replace(",", ";").Split(',').ToList();
foreach (string toAddress in toAddresses)
mailMessage.To.Add(new MailAddress(toAddress));
if (!string.IsNullOrEmpty(cc))
{
List<string> ccAddresses = cc.Replace(", ", ",").Split(',').ToList();
foreach (string ccAddress in ccAddresses)
{
mailMessage.CC.Add(new MailAddress(ccAddress));
}
}
mailMessage.Subject = Subject;
mailMessage.SubjectEncoding = Encoding.UTF8;
if (!string.IsNullOrEmpty(replyTo))
{
List<string> replyAddresses = replyTo.Replace(", ", ",").Replace(",", ";").Split(',').ToList();
foreach (string replyAddress in replyAddresses)
mailMessage.ReplyToList.Add(new MailAddress(replyAddress));
}
if (!string.IsNullOrEmpty(text))
{
AlternateView plainView = AlternateView.CreateAlternateViewFromString(text, Encoding.UTF8, "text/plain");
mailMessage.AlternateViews.Add(plainView);
}
if (!string.IsNullOrEmpty(html))
{
AlternateView htmlView = AlternateView.CreateAlternateViewFromString(html, Encoding.UTF8, "text/html");
mailMessage.AlternateViews.Add(htmlView);
}
if (attachmentList != null)
{
foreach (var objAttach in attachmentList)
{
ContentDisposition disposition = objAttach.ContentDisposition;
disposition.DispositionType = "attachment";
disposition.CreationDate = System.IO.File.GetCreationTime(objAttach.Name);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(objAttach.Name);
disposition.ReadDate = System.IO.File.GetLastAccessTime(objAttach.Name);
mailMessage.Attachments.Add(objAttach);
}
}
RawMessage rawMessage = new RawMessage();
using (MemoryStream memoryStream = ConvertMailMessageToMemoryStream(mailMessage))
{
rawMessage.WithData(memoryStream);
}
SendRawEmailRequest request = new SendRawEmailRequest();
request.WithRawMessage(rawMessage);
request.WithDestinations(toAddresses);
request.WithSource(from);
AmazonSimpleEmailServiceClient serMailSer = new AmazonSimpleEmailServiceClient(ACCESS_KEY, SECRET_ACCESS_KEY);
try
{
SendRawEmailResponse response = serMailSer.SendRawEmail(request);
SendRawEmailResult result = response.SendRawEmailResult;
Console.WriteLine("Email sent.");
Console.WriteLine(String.Format("Message ID: {0}", result.MessageId));
return true;
}
catch (Exception ex)
{
Console.WriteLine(string.Format("EXCEPTION: {0}", ex.Message));
return false;
}
}
private static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
Assembly assembly = typeof(SmtpClient).Assembly;
MemoryStream stream = new MemoryStream();
Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(flags, null, new[] { typeof(Stream) }, null);
object mailWriter = mailWriterContructor.Invoke(new object[] { stream });
MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", flags);
sendMethod.Invoke(message, flags, null, new[] { mailWriter, true }, null);
MethodInfo closeMethod = mailWriter.GetType().GetMethod("Close", flags);
closeMethod.Invoke(mailWriter, flags, null, new object[] { }, null);
return stream;
}
Um exemplo de chamada do código é o seguinte:
private const string ACCESS_KEY = "xxxxxx"; //Substituir pela sua chave
private const string SECRET_ACCESS_KEY = "xxxxxxxxx"; //Substituir pela sua chave
List<System.Net.Mail.Attachment> attachmentList = new List<System.Net.Mail.Attachment>();
//attachmentList.Add(new System.Net.Mail.Attachment(@"c:\temp\teste.txt"));
//attachmentList.Add(new System.Net.Mail.Attachment(@"c:\temp\teste2.txt"));
SendRawEmail("remetente@email.com", "destinatario@email.com", null, "teste", "texto teste", "<h2>mensagem teste</h2>", "no-reply@email.com.br", null, attachmentList);
Lembrando que você deve substituir nesse código além das chaves “Access Key” e “Secret Access Key” geradas no passo anterior, também os endereço de rementente, destinatário e a mensagem.
Download do exemplo
Esse exemplo pode ser baixado aqui: www.educoutinho.com.br/downloads/AmazonSESEmailSend.zip
Mais informações
Para obter mais informações sobre o SES, consulte os seguintes links:
http://aws.amazon.com/ses/
http://aws.amazon.com/documentation/ses/