8
votes

C # MailMessage à la diffusion - numéro de codage

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>

solution 2: strong> Aucun problème de codage à l'aide de cette solution dans laquelle vous envoyez un répertoire de prise en charge, puis lisez-le dans: https://stackoverflow.com/a/14350088 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>

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ÆØÅ"));
  • Si j'envoie ce message avec SMTP standard, ça a l'air bien. Li>
  • Si je l'envoie à l'aide de Sendrawemail, il a l'air bien si j'ai généré le Morthstream à l'aide de la solution 2 Li>
  • Si je l'envoie à l'aide de Sendrawemail, il dispose de problèmes de codage si j'ai généré le Morthstream à l'aide de la solution 1. Li> ul>

    avec des problèmes de codage, je veux dire «Ã¸» comme p>

     Entrez la description de l'image ici p> p>


4 commentaires

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 ) et un autre n'est pas.


3 Réponses :


1
votes

Avez-vous essayé de spécifier explicitement le codage pour sujet / corps et mailaddress?


1 commentaires

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.



0
votes
message.BodyEncoding = message.SubjectEncoding = message.HeadersEncoding = Encoding.UTF8;

0 commentaires

2
votes

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


0 commentaires