Отправить вложения в Amazon-SES
Я ищу рабочий пример С# для отправки вложений с помощью Amazon-SES.
После прочтения этого Amazon-SES теперь поддерживает отправку вложений, я искал пример С#, но не смог найти его.
Ответы
Ответ 1
Я думаю, что используя AWS SDK для .NET и MimeKit - это очень простое и чистое решение. Вы можете отправлять электронные письма с вложениями через SES API (вместо SMTP).
Вы можете написать MimeMessage непосредственно в MemoryStream, а затем использовать его с SES SendRawEmail:
using Amazon.SimpleEmail;
using Amazon.SimpleEmail.Model;
using Amazon;
using Amazon.Runtime;
using MimeKit;
private static BodyBuilder GetMessageBody()
{
var body = new BodyBuilder()
{
HtmlBody = @"<p>Amazon SES Test body</p>",
TextBody = "Amazon SES Test body",
};
body.Attachments.Add(@"c:\attachment.txt");
return body;
}
private static MimeMessage GetMessage()
{
var message = new MimeMessage();
message.From.Add(new MailboxAddress("Foo Bar", "[email protected]"));
message.To.Add(new MailboxAddress(string.Empty, "[email protected]"));
message.Subject = "Amazon SES Test";
message.Body = GetMessageBody().ToMessageBody();
return message;
}
private static MemoryStream GetMessageStream()
{
var stream = new MemoryStream();
GetMessage().WriteTo(stream);
return stream;
}
private void SendEmails()
{
var credentals = new BasicAWSCredentials("<aws-access-key>", "<aws-secret-key>");
using (var client = new AmazonSimpleEmailServiceClient(credentals, RegionEndpoint.EUWest1))
{
var sendRequest = new SendRawEmailRequest { RawMessage = new RawMessage(GetMessageStream()) };
try
{
var response = client.SendRawEmail(sendRequest);
Console.WriteLine("The email was sent successfully.");
}
catch (Exception e)
{
Console.WriteLine("The email was not sent.");
Console.WriteLine("Error message: " + e.Message);
}
}
}
Ответ 2
public Boolean SendRawEmail(String from, String to, String cc, String Subject, String text, String html, String replyTo, string attachPath)
{
AlternateView plainView = AlternateView.CreateAlternateViewFromString(text, Encoding.UTF8, "text/plain");
AlternateView htmlView = AlternateView.CreateAlternateViewFromString(html, Encoding.UTF8, "text/html");
MailMessage mailMessage = new MailMessage();
mailMessage.From = new MailAddress(from);
List<String> toAddresses = to.Replace(", ", ",").Split(',').ToList();
foreach (String toAddress in toAddresses)
{
mailMessage.To.Add(new MailAddress(toAddress));
}
List<String> ccAddresses = cc.Replace(", ", ",").Split(',').Where(y => y != "").ToList();
foreach (String ccAddress in ccAddresses)
{
mailMessage.CC.Add(new MailAddress(ccAddress));
}
mailMessage.Subject = Subject;
mailMessage.SubjectEncoding = Encoding.UTF8;
if (replyTo != null)
{
mailMessage.ReplyToList.Add(new MailAddress(replyTo));
}
if (text != null)
{
mailMessage.AlternateViews.Add(plainView);
}
if (html != null)
{
mailMessage.AlternateViews.Add(htmlView);
}
if (attachPath.Trim() != "")
{
if (System.IO.File.Exists(attachPath))
{
System.Net.Mail.Attachment objAttach = new System.Net.Mail.Attachment(attachPath);
objAttach.ContentType = new ContentType("application/octet-stream");
System.Net.Mime.ContentDisposition disposition = objAttach.ContentDisposition;
disposition.DispositionType = "attachment";
disposition.CreationDate = System.IO.File.GetCreationTime(attachPath);
disposition.ModificationDate = System.IO.File.GetLastWriteTime(attachPath);
disposition.ReadDate = System.IO.File.GetLastAccessTime(attachPath);
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);
AmazonSimpleEmailService ses = AWSClientFactory.CreateAmazonSimpleEmailServiceClient(ConfigurationManager.AppSettings.Get("AccessKeyId"), ConfigurationManager.AppSettings.Get("SecretKeyId"));
try
{
SendRawEmailResponse response = ses.SendRawEmail(request);
SendRawEmailResult result = response.SendRawEmailResult;
return true;
}
catch (AmazonSimpleEmailServiceException ex)
{
return false;
}
}
public static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
Assembly assembly = typeof(SmtpClient).Assembly;
Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
MemoryStream fileStream = new MemoryStream();
ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
object mailWriter = mailWriterContructor.Invoke(new object[] { fileStream });
MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);
sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true }, null);
MethodInfo closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic);
closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null);
return fileStream;
}
Найдено, что здесь
Обновление: в .NET 4.5 была изменена сигнатура метода, которая нарушает вышеуказанное:
Получение System.Net.Mail.MailMessage как MemoryStream в .NET 4.5 beta
Ответ 3
Вы можете настроить IIS SMTP для ретрансляции через SES.
Вам нужно установить stunnel и настроить
Затем вы можете просто установить IIS SMTP Smart Host и некоторые другие параметры, и он будет передавать вашу электронную почту через SES.
Инструкции сверху связаны:
Инструкции, взятые из Amazon docs и, при необходимости, изменены.
1. Установить stunnel:
- Загрузите с страницы на странице stunnel
- Запустите установщик с параметрами по умолчанию, создайте самостоятельно подписанный сертификат, отвечая на вопросы.
- Откройте
c:\program files (x86)\stunnel\stunnel.conf
файл в блокноте
- Очистить все конфигурации сервера (в разделе
Example SSL server mode services
не будет строки client = yes
)
- Создайте новую конфигурацию клиента:
[SMTP-TLS-обертка]
accept = 127.0.0.1:2525
client = yes
connect = email-smtp.us-east-1.amazonaws.com:465
- Запустите
stunnel.exe
и убедитесь, что не сообщается об ошибках (вы получите значок маленького systray)
- Если это удается, вы можете установить его как услугу, выполнив
stunnel.exe -install
в командной строке (обратите внимание, что это устанавливает сервис, но не запускает его, поэтому запустите его)
- Проверьте соединение, в строке cmd line
telnet localhost 2525
и вы увидите ответ SMTP с сервера Amazon (если telnet не установлен, добавьте эту функцию в Диспетчер серверов/Функции/Добавить функцию)
2. Настройка SMTP IIS
- Установить Smart Host как
[127.0.0.1]
(включить скобки)
- В разделе Исходящие подключения установите исходящий порт на
2525
(например, файл stunnel.conf)
- В разделе Исходящая безопасность установите данные проверки подлинности на свои учетные данные SMTP Amazon, установите его на базовую проверку подлинности ( ПРИМЕЧАНИЕ: НЕ ПРОВЕРЬТЕ ПРОВЕРКУ ТЕЛЕВИДЕНИЯ TLS)
Ответ 4
Я не уверен, что это то, что вы ищете, но это единственный ресурс, который я смог найти по этому вопросу. Я бы тоже хотел ответить на этот вопрос.
http://docs.amazonwebservices.com/ses/latest/DeveloperGuide/
В нем указано, как его использовать, но очень загадочно, по крайней мере для меня.
Какие-нибудь лучшие проводники там?
Ответ 5
Мне также нужна помощь в этом, но до сих пор я обнаружил, что вам нужно отправить многостраничное сообщение MIME с вложением, закодированным в base64.
Ответ 6
Я думаю, вам нужно следовать инструкциям этой ссылке. Amazon не позволяет добавлять вложения или другие более сложные типы сообщений (события iCalendar). По сути, вам необходимо обработать тело сообщения строкой и манипулированием.
В настоящее время я делаю это для электронных писем формата iCalendar в унаследованной системе. Это немного боль в заднице, но если вы читаете RFC 2822, это довольно четко говорит о том, что такое формат. Особые моменты, на которые следует обратить внимание:
- Базовая кодировка данных
- Типы MIME
- Убедитесь, что ваши множественные границы совпадают (и являются уникальными)
- Конечные проблемы с количеством разрывов строк (\n) после определенных строк
Удачи. Я не знаю, есть ли открытая библиотека, которая сделает это для вас на С#. Если вы можете найти его, попробуйте использовать его, потому что работа с тонкостями RFC должна иметь медицинское уведомление об увеличении артериального давления и выпадения волос.
Ответ 7
Это очень простая реализация с использованием MimeKit
using Amazon;
using Amazon.SimpleEmail;
using Amazon.SimpleEmail.Model;
using MimeKit;
using System.IO;
namespace SendEmailWithAttachments
{
class Program
{
static void Main(string[] args)
{
//Remember to enter your (AWSAccessKeyID, AWSSecretAccessKey) if not using and IAM User with credentials assigned to your instance and your RegionEndpoint
using (var client = new AmazonSimpleEmailServiceClient("YourAWSAccessKeyID", "YourAWSSecretAccessKey", RegionEndpoint.USEast1))
using (var messageStream = new MemoryStream())
{
var message = new MimeMessage();
var builder = new BodyBuilder() { TextBody = "Hello World" };
message.From.Add(new MailboxAddress("[email protected]"));
message.To.Add(new MailboxAddress("[email protected]"));
message.Subject = "Hello World";
//I'm using the stream method, but you don't have to.
using (FileStream stream = File.Open(@"Attachment1.pdf", FileMode.Open)) builder.Attachments.Add("Attachment1.pdf", stream);
using (FileStream stream = File.Open(@"Attachment2.pdf", FileMode.Open)) builder.Attachments.Add("Attachment2.pdf", stream);
message.Body = builder.ToMessageBody();
message.WriteTo(messageStream);
var request = new SendRawEmailRequest()
{
RawMessage = new RawMessage() { Data = messageStream }
};
client.SendRawEmail(request);
}
}
}
}
У меня есть код в моем репозитории https://github.com/gianluis90/amazon-send-email