2015-04-09 4 views
0

Я пытаюсь отправить почту AWS SES с вложением с помощью SDK. Я нашел рабочий код here:Создать MIME Mail с приложением для AWS SES C#

это относится к MimeKitLite, но мы не можем ссылаться на .net framework 3.5. Есть ли какое-нибудь обходное решение, которое я могу написать в своем коде для отправки почты с помощью фреймворка 3.5? Из-за некоторых зависимостей мы не можем обновить нашу структуру проекта.

Я пишу здесь мой рабочий код (рамочный 4) для справки:

protected void Page_Load(object sender, EventArgs e) 
     { 
      var message = (MimeMessage)MyMailMessage(); 
      var stream = new MemoryStream(); 
      message.WriteTo(stream); 
      using (AmazonSimpleEmailServiceClient client = new AmazonSimpleEmailServiceClient("awsAccessKeyId", "awsSecretAccessKey", RegionEndpoint.USWest2)) 
      { 
       var sendRequest = new SendRawEmailRequest { RawMessage = new RawMessage { Data = stream } }; 
       var response = client.SendRawEmail(sendRequest); 
       Console.WriteLine(response.ToString()); 
      } 
     } 

    private static MimeKit.MimeMessage MyMailMessage() 
     { 
      var message = new MimeMessage(); 
      message.From.Add(new MailboxAddress("rahul", "[email protected]")); 
      message.To.Add(new MailboxAddress("rahul", "[email protected]")); 
      message.Subject = "Hello"; 
      var builder = new BodyBuilder(); 
      builder.HtmlBody = @"<p>Thank you for submitting your query/complaint."; 
      // 
      string attachement = System.Web.HttpContext.Current.Server.MapPath(Path.GetFileName("IntelOCL.log")); 
      builder.LinkedResources.Add(attachement); 
      message.Body = builder.ToMessageBody(); 
      return message; 
     } 
+1

FWIW, MimeKit теперь поддерживает .NET 3.5 – jstedfast

ответ

3

Вы можете использовать класс .NET MailMessage вместо. Проблема заключается в том, что вы должны предоставить Amazon SES необработанное содержимое сообщения в потоке, и этот класс не имеет прямого способа сделать это (afaik). Это может быть сделано, однако с помощью отражения:

private MemoryStream FromMailMessageToMemoryStream(MailMessage message) 
{ 
    Assembly assembly = typeof(SmtpClient).Assembly; 

    Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter"); 

    MemoryStream stream = new MemoryStream(); 

    ConstructorInfo mailWriterContructor = 
     mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null); 
     object mailWriter = mailWriterContructor.Invoke(new object[] { stream }); 

    MethodInfo sendMethod = 
     typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic); 

    if (sendMethod.GetParameters().Length == 3) 
    { 
     sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null); // .NET 4.x 
    } 
    else 
    { 
     sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true }, null); // .NET < 4.0 
    } 

    MethodInfo closeMethod = 
     mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic); 
    closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null); 

    return stream; 
} 

С помощью этой вспомогательной функции вашего кода будет в настоящее время:

protected void Page_Load(object sender, EventArgs e) 
    { 
     var message = (MailMessage)MyMailMessage(); 
     var stream = FromMailMessageToMemoryStream(message); 
     List<string> bccTo = new List<string>(); 
     bccTo.Add("[email protected]"); 
     using (AmazonSimpleEmailServiceClient client = new AmazonSimpleEmailServiceClient("awsAccessKeyId", "awsSecretAccessKey", RegionEndpoint.USWest2)) 
     { 
      var sendRequest = new SendRawEmailRequest { RawMessage = new RawMessage { Data = stream } }; 
      var response = client.SendRawEmail(sendRequest); 
      Console.WriteLine(response.MessageId); 

      if (bccTo != null && bccTo.Count > 0) 
      { 
       sendRequest.Destinations = bccTo; 
       response = client.SendRawEmail(sendRequest); 
       Console.WriteLine(response.MessageId); 
      } 
     } 
    } 

private static MailMessage MyMailMessage() 
    { 
     var message = new MailMessage(); 
     message.From = new MailAddress("[email protected]", "rahul"); 
     message.To.Add("[email protected]"); 
     message.Subject = "Hello"; 
     message.AlternateViews.Add(AlternateView.CreateAlternateViewFromString(@"<p>Thank you for submitting your query/complaint.", new ContentType("text/html"))); 
     // 
     string attachmentname = "IntelOCL.log"; 
     Stream ms = new MemoryStream(File.ReadAllBytes(System.Web.HttpContext.Current.Server.MapPath(Path.GetFileName(attachmentname)))); 
     ContentType ct = new ContentType(); 
     ct.MediaType = "" // TODO 
     Attachment attachment = new Attachment(ms, ct); 
     attachment.Name = attachmentname; 
     attachment.ContentDisposition.FileName = attachmentname; 
     message.Attachments.Add(attachment); 

     return message; 
    } 
+0

Привет JPG, Спасибо за ваш код, он отлично работает, когда я сохраняю получателей в и cc, Но когда я добавляю любого получателя в Скрытой копии, получатель не получает почту, хотя и получает cc правильно. в коде нет исключения. Я использую песочницу AWS SES. Я делаю что-то неправильно? –

+0

@RahulPatel Я думаю, что проблема связана с объектом .NET MIME, не включая заголовки BCC. Для этого я предполагаю, что вместо этого вы не можете использовать SendRawEmail, но SendEmail. – JPG

+1

@RahulPatel Другим способом было бы отправить BCC в отдельную почту, см. Отредактированный ответ. – JPG

 Смежные вопросы

  • Нет связанных вопросов^_^