2015-04-09 2 views
0

Je tente d'envoyer un courrier AWS SES avec pièce jointe à l'aide du SDK. J'ai trouvé le code de travail here:Création d'un message MIME avec pièce jointe pour AWS SES C#

il fait référence MimeKitLite mais cela nous ne pouvons pas faire référence dans .net framework 3.5. Y at-il une solution de contournement que je peux écrire dans mon code pour envoyer le courrier en utilisant framework 3.5? en raison de certaines dépendances, nous ne pouvons pas mettre à jour notre cadre de projet.

Je vous écris ici mon code de travail (cadre 4) pour référence:

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 prend désormais en charge .NET 3.5 – jstedfast

Répondre

3

Vous pouvez utiliser à la place la classe MailMessage .NET. Le problème avec ceci est que vous devez donner à Amazon SES le contenu brut du message dans un flux et cette classe n'a pas de moyen direct de le faire (afaik). Il peut se faire cependant en utilisant la réflexion:

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; 
} 

Avec cette fonction d'assistance votre code serait maintenant:

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

Salut JPG, Merci pour votre code, il Fonctionne bien lorsque je garde les destinataires dans et cc, Mais quand j'ajoute un destinataire dans Bcc ce destinataire ne reçoit pas les mails et cc reçoit correctement. il n'y a pas d'exception dans le code. J'utilise AWS SES Sandbox. Est-ce que je fais quelque chose de mal? –

+0

@RahulPatel Je pense que le problème est avec l'objet .NET MIME n'incluant pas les en-têtes BCC. Pour cela je suppose que vous ne pouvez pas utiliser SendRawEmail mais SendEmail à la place. – JPG

+1

@RahulPatel Autre manière serait d'envoyer BCC dans un courrier séparé, voir la réponse éditée. – JPG