【问题标题】:How to convert MailAttachment to MimeKit Attachment如何将 MailAttachment 转换为 MimeKit 附件
【发布时间】:2019-02-22 15:57:28
【问题描述】:

由于我们使用的是 Amazon SES,因此我们必须重新设计发送电子邮件的方式。过去,我们使用 smtp,但在这种情况下不能这样做。需要更新的类接受了一个 MailMessage 对象并使用 smtp 发送它。因此,我试图重新设计该方法,以便能够继续接受 MailMessage 对象并将其转换为 MimeKit MimeMessage。在大多数情况下,它工作正常,除了附件。在我拥有的代码中,附件被添加并发送,但是,当尝试打开它时,它似乎已损坏或其他东西。在我的测试用例中,我附加了一个 csv 文件。收到邮件后无法用excel打开。

public class EmailAbstraction
{
    public virtual void Send(MailMessage mailMessage)
    {
        sendMessage(mailMessage);
    }

    private static void sendMessage(MailMessage mailMessage)
    {
        using (var client = new AmazonSimpleEmailServiceClient(AwsConstants.SESAWSKey, AwsConstants.SESAWSSecret, AwsConstants.RegionEndpoint))
        {
            foreach (var to in mailMessage.To)
            {
                using (var messageStream = new MemoryStream())
                {
                    var newMessage = new MimeMessage();

                    var builder = new BodyBuilder
                    {
                        HtmlBody = mailMessage.Body
                    };

                    newMessage.From.Add(mailMessage.From == null
                        ? new MailboxAddress(EmailConstants.DefaultFromEmailDisplayName, EmailConstants.DefaultFromEmailAddress)
                        : new MailboxAddress(mailMessage.From.Address));

                    newMessage.To.Add(new MailboxAddress(to.DisplayName, to.Address));
                    newMessage.Subject = mailMessage.Subject;

                    foreach (var attachment in mailMessage.Attachments)
                    {
                        builder.Attachments.Add(attachment.Name, attachment.ContentStream);
                    }

                    newMessage.Body = builder.ToMessageBody();
                    newMessage.WriteTo(messageStream);

                    var request = new SendRawEmailRequest
                    {
                        RawMessage = new RawMessage { Data = messageStream }
                    };

                    client.SendRawEmail(request);
                }
            }
        }
    }
}

在我的测试应用中,我有这个。

internal class Program
{
    private static void Main(string[] args)
    {
        var s = GetFileStream();
        var m = new MailMessage();

        var sender = new MailAddress("info@ourwebsite.com", "info");
        m.From = sender;
        m.Sender = sender;
        m.Body = "test email";
        m.Subject = "test subject";
        m.To.Add(myemail);
        m.Attachments.Add(new Attachment(s, "test-file.csv"));
        new EmailAbstraction().Send(m);
    }

    private static MemoryStream GetFileStream()
    {
        var stream = new MemoryStream();
        var fileStream = File.Open(@"C:\Users\dev\Desktop\test-file.csv", FileMode.Open);
        fileStream.CopyTo(stream);
        fileStream.Close();
        return stream;
    }
}

【问题讨论】:

    标签: amazon-ses mimekit


    【解决方案1】:

    这只是从 MimeKit 源代码中复制的:

        static MimePart GetMimePart (System.Net.Mail.AttachmentBase item)
        {
            var mimeType = item.ContentType.ToString ();
            var contentType = ContentType.Parse (mimeType);
            var attachment = item as System.Net.Mail.Attachment;
            MimePart part;
    
            if (contentType.MediaType.Equals ("text", StringComparison.OrdinalIgnoreCase))
                part = new TextPart (contentType);
            else
                part = new MimePart (contentType);
    
            if (attachment != null) {
                var disposition = attachment.ContentDisposition.ToString ();
                part.ContentDisposition = ContentDisposition.Parse (disposition);
            }
    
            switch (item.TransferEncoding) {
            case System.Net.Mime.TransferEncoding.QuotedPrintable:
                part.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                break;
            case System.Net.Mime.TransferEncoding.Base64:
                part.ContentTransferEncoding = ContentEncoding.Base64;
                break;
            case System.Net.Mime.TransferEncoding.SevenBit:
                part.ContentTransferEncoding = ContentEncoding.SevenBit;
                break;
            //case System.Net.Mime.TransferEncoding.EightBit:
            //  part.ContentTransferEncoding = ContentEncoding.EightBit;
            //  break;
            }
    
            if (item.ContentId != null)
                part.ContentId = item.ContentId;
    
            var stream = new MemoryStream ();
            item.ContentStream.CopyTo (stream);
            stream.Position = 0;
    
            part.Content = new MimeContent (stream);
    
            return part;
        }
    

    【讨论】:

    • 我尝试将其拉入我的代码中,但是当我这样做时,Visual Studio 似乎不喜欢这行 - part = new TextPart(contentType);它给出了一个错误 - 无法从 MimeKit.ContentType 转换为 MimeKit.MimeEntityConstructorArgs 并在 contentType 参数下划线。
    • 啊,因为那个.ctor是一个内部的.ctor。为什么不直接将 MailMessage 转换为 MimeMessage? MimeKit 已经为您提供了该功能。
    • 我确实尝试过,但附件是空的。我正在使用 MimeMessage.CreateFromMailMessage(mailMessage)。我收到了电子邮件,但附件是空的。
    • 尝试创建一个简单的测试用例来说明这个错误并将其归档到github.com/jstedfast/MimeKit/issues - 而不是在测试程序中通过 SMTP 发送,只需让它将消息保存到磁盘(例如 message.WriteTO (fileName); )。
    猜你喜欢
    • 1970-01-01
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-05
    • 1970-01-01
    • 2019-07-27
    相关资源
    最近更新 更多