Как любой, кто работал с ним, знает, чтобы отправить электронное письмо через SDK Amazon SES C# с приложением, вы должны использовать функцию SendRawEmail
(которая крайне вонючий). Для этого вы либо вручную передаете сообщение MIME, либо скорее конвертируете объект System.Net.Mail.MailMessage
в MemoryStream
. Это все работает нормально, но я столкнулся с проблемой. После многократного копания я смог найти проблему и скопировать ее, и, похоже, это побочный продукт SMTP dot-stuffing.Проблема с двойным периодом с использованием SES ASAN, вложения, точечные набивки при использовании C# SDK
Проблема заключается в том, что в определенных сценариях, когда MailMessage
преобразуется в необработанное сообщение MIME, если период в теле сообщения завернут в начало строки в необработанном сообщении, то он заполнен точками (правильно Я предполагаю). Однако, похоже, что он не обрабатывается ни внутри SDK, ни на стороне SES, потому что электронная почта проходит через два периода. Это может быть воспроизведено с помощью следующих примеров коды консоли приложения ...
static void Main(string[] args)
{
var to = new List<string> { _toAddress };
var subject = "TEST MESSAGE";
var message = $"This is a carefully crafted HTML email message body such that you should see a single period right here ->. However, you'll see <strong>two periods</strong> in the email instead of one period like originally given in the code.";
var body = $"<br />Hello,<br /><br />{message}<br /><br />Sincerely,<br /><br />Your Tester";
var result = SendEmail(to, subject, body, null, isHtml: true);
Console.WriteLine(result ? "Successfully sent message" : "Failed to send message");
if (Debugger.IsAttached)
{
Console.WriteLine("Press any key to continue...");
Console.ReadLine();
}
}
private static bool SendEmail(List<string> to, string subject, string body, List<string> attachmentFilePaths = null, bool isHtml = false)
{
var message = new MailMessage
{
From = new MailAddress(_fromAddress),
Subject = subject,
Body = body,
IsBodyHtml = isHtml
};
foreach (var address in to)
{
message.To.Add(address.Trim());
}
if (attachmentFilePaths?.Any() == true)
{
foreach (var filePath in attachmentFilePaths)
{
message.Attachments.Add(new Attachment(filePath));
}
}
try
{
var creds = new BasicAWSCredentials(_SESAccessKey, _SESSecretKey);
using (var client = new AmazonSimpleEmailServiceClient(creds, RegionEndpoint.USEast1))
{
var request = new SendRawEmailRequest { RawMessage = new RawMessage { Data = ConvertMailMessageToMemoryStream(message) } };
Console.WriteLine($"RawMessage.Data...\r\n\r\n{Encoding.ASCII.GetString(request.RawMessage.Data.ToArray())}");
client.SendRawEmail(request);
return true;
}
}
catch (Exception ex)
{
Console.WriteLine($"AmazonSESHelper.SendEmail => Exception: {ex.Message}");
}
return false;
}
// Have to do this reflection crap in order to send attachments to the SES API
// From http://stackoverflow.com/questions/29532152/create-mime-mail-with-attachment-for-aws-ses-c-sharp/29533336#29533336
private static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
var stream = new MemoryStream();
var assembly = typeof(SmtpClient).Assembly;
var mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
var mailWriterConstructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
var mailWriter = mailWriterConstructor.Invoke(new object[] { stream });
var sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);
sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null);
var closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic);
closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null);
return stream;
}
Необработанных MIME сообщения, которое получает выводимую ...
X-Sender: [email protected]
X-Receiver: [email protected]
MIME-Version: 1.0
From: [email protected]
To: [email protected]
Date: 2 Dec 2016 11:45:36 -0500
Subject: TEST MESSAGE
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
<br />Hello,<br /><br />This is a carefully crafted HTML email me=
ssage body such that you should see a single period right here ->=
.. However, you'll see <strong>two periods</strong> in the email i=
nstead of one period like originally given in the code.<br /><br =
/>Sincerely,<br /><br />Your Tester
Вы можете увидеть точку-начинку (опять же, если предположить, что это собственно за SMTP), но это не становится не-сделано после отправки, как можно увидеть, когда я получаю электронную почту ...
я могу получить эту работу, если Я добавляю в @jstedfast MimeKit (что здорово), но добавляет еще одну зависимость во всех наших приложениях, что не является моим любимым делом. Прежде всего, я хотел выбросить его здесь, чтобы увидеть, нет ли чего-то, что мне не хватает. Если нет, было бы хорошо видеть, что SES признает это как проблему и исправляет ее. В противном случае, я должен решить между другой библиотечной зависимостью или прыгающим судном от SES другому провайдеру почты.