MailMessage 到 MIME 字符串

Posted

技术标签:

【中文标题】MailMessage 到 MIME 字符串【英文标题】:MailMessage to MIME String 【发布时间】:2017-10-24 07:03:07 【问题描述】:

我关注了一些关于如何将 MailMessage 转换为 MIME 字符串的 *** 帖子。到目前为止,我只是无法让它工作。我已经解决了 .NET 4.5 的所有错误和细节,但由于某种原因,我的字符串为空,我的流长度始终为 0。任何帮助将不胜感激。

函数调用:

MailMessage message = new MailMessage("from@domain.com", "to@domain.com", "Test", "Test");
Console.WriteLine(ConvertMailMessageToMemoryStream(message));

功能代码:

    private static string ConvertMailMessageToMemoryStream(MailMessage message)
    
        BindingFlags flags = BindingFlags.Instance | BindingFlags.NonPublic;
        Assembly assembly = typeof(SmtpClient).Assembly;
        Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
        MemoryStream stream = new MemoryStream();
        ConstructorInfo mailWriterConstructor = mailWriterType.GetConstructor(flags, null, new[]  typeof(Stream) , null);
        object mailWriter = mailWriterConstructor.Invoke(new object[]  stream );
        MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", flags);
        sendMethod.Invoke(message, flags, null, new[]  mailWriter, true, true , null);
        var sr = new StreamReader(stream);
        var str = sr.ReadToEnd();
        MethodInfo closeMethod = mailWriter.GetType().GetMethod("Close", flags);
        closeMethod.Invoke(mailWriter, flags, null, new object[]  , null);
        return str;
    

【问题讨论】:

你为什么要在运行时加载 MailWriter 程序集?) 据我研究,这是从内置 MailMessage 类中提取原始 mime 文本的唯一方法。据我了解,它的工作方式是邮件消息中有一个私有方法,它允许我们将其作为原始格式保存到流中,但由于它是私有的并且不被 Microsoft 公开,调用它的唯一方法是通过反射。 另一种方法是使用MimeKit。这具有写入流的简单方法 在阅读之前,您可能需要先寻找流的开头。 【参考方案1】:

在阅读之前,您必须先找到流的开头。 stream.Seek(0, SeekOrigin.Begin) sendMethod 将指针留在末尾,因此您无法从中读取任何内容。

【讨论】:

以上是关于MailMessage 到 MIME 字符串的主要内容,如果未能解决你的问题,请参考以下文章

到 MailMessage 的纯文本 mime 电子邮件

使用 send-mailmessage 命令时的电子邮件凭据

与地址不同的 MIME 和 SMTP

如何在 C# 中将非 mime 消息转换为 mime 邮件消息

如何使用Email :: Mime与sendmail

MailMessage 将字符串作为正文发送,在 Outlook 中没有换行符