IAM à l'aide d'API Amazon SES SENDRAWEMAILAILLE D'API Ainsi, j'ai besoin d'un mailMessage en tant que MemorMemReam.
J'ai trouvé plusieurs réponses au mailmessage dans le numéro de mailmessage ici sur Stackoverflow. P>
Solution 1: Utiliser celui qui utilise des méthodes privées, il entraîne un encodage incorrect de pièces de l'e-mail:
https://stackoverflow.com/a/8826833 p> Je n'aime pas beaucoup le fait que j'ai besoin de Écrivez dans un fichier temporaire pour rendre ce travail correctement.
Est-ce que quelqu'un a une idée de la manière dont la solution de mémoire mémoire pure peut gâcher une partie de l'encodage. P> Le test de messagerie IAM Test avec est Ceci: P> avec des problèmes de codage, je veux dire «Ã¸» comme p> var mailMessage = new MailMessage();
mailMessage.Subject = "HEADER WITH SPECIAL ÃÃÃ
";
mailMessage.Body = "TEST";
Attachment att = new Attachment(@"C:\AttachmentWithSpecial ÃÃÃ
.pdf");
mailMessage.Attachments.Add(att);
mailMessage.From = new MailAddress("test@test.com", "NameÃÃÃ
");
mailMessage.To.Add(new MailAddress("test@test.com", "NameÃÃÃ
"));
p> p>
3 Réponses :
Avez-vous essayé de spécifier explicitement le codage pour sujet / corps et mailaddress? p>
Je suppose que lorsque .NET écrit des courriers sur dossier, il peut en quelque sorte définir le bon codage (ou peut-être que le lecteur de fichier peut en quelque sorte trouver le codage droit pour convertir des données). Et en mémoire, tout est en codage par défaut, ce qui ne fonctionne pas pour vous. p>
Ya j'ai essayé que cependant, je suis très intelligent de les installer sur UTF-8 si nécessaire. Dans le constructeur d'une adresse postale foringuistique, vous trouverez: this.displayNameCoding = displayNameCoding ?? Encoding.gecoding ("utf-8"); Ce qui signifie que si vous ne définissez pas le codage, il sera par défaut à UTF-8. Dans l'ensemble du sujet et du corps, ils ont des tests de code si une chaîne contient uniquement ASCII, sinon elle essaiera de deviner le codage seul. Donc, si vous faites mail.subject = "æøå"; et ensuite vérifier la messagerie.
message.BodyEncoding = message.SubjectEncoding = message.HeadersEncoding = Encoding.UTF8;
Malheureusement, l'objet MailMessage est buggy et a une interface médiocre.
La bonne chose est que .NET 4.5 partiellement corrigé avec un drapeau indexicode en envoi () (malheureusement, la méthode est toujours privée) P>
ci-dessous est modifié "solution 1". Il code de la même manière que "Solution 2". .NET Framework 4.5 uniquement. P>
private static MemoryStream ConvertMailMessageToMemoryStream(MailMessage message)
{
Assembly systemAssembly = typeof(SmtpClient).Assembly;
Type mailWriterType = systemAssembly.GetType("System.Net.Mail.MailWriter");
const BindingFlags nonPublicInstance = BindingFlags.Instance | BindingFlags.NonPublic;
ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(nonPublicInstance, null, new[] typeof(Stream) }, null);
MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", nonPublicInstance);
MethodInfo closeMethod = mailWriterType.GetMethod("Close", nonPublicInstance);
using (MemoryStream memoryStream = new MemoryStream())
{
object mailWriter = mailWriterContructor.Invoke(new object[] { memoryStream });
//AssertHelper.IsTrue(sendMethod.GetParameters().Length > 2, ".NET framework must be 4.5 or higher in order to properly encode email subject.");
sendMethod.Invoke(message, nonPublicInstance, null,
new[] { mailWriter, true, false },
null);
closeMethod.Invoke(mailWriter, nonPublicInstance, null, new object[] { }, null);
return memoryStream;
}
}
Pourquoi n'utilisez-vous pas Sendemail à la place? SES vous permet de composer un e-mail et qu'il prend en charge le codage.
Comme je le vois, cela ne supporte pas les pièces jointes. ?
Oh oui, avez-vous essayé d'utiliser StringWriter? Le flux de mémoire peut ignorer le codage car il utilise des octets comme stockage.
Pouvez-vous fournir l'exemple de minomal qui n'implique pas d'API d'Amazon? Comme un exemple qui génère, deux flux de mémoire différents sont corrects (pour
sendrawemail code>) et un autre n'est pas.