Как конвертировать MailAttachment в MimeKit Attachment - PullRequest
0 голосов
/ 22 февраля 2019

Нам нужно переделать способ отправки электронных писем, поскольку мы используем 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;
    }
}

1 Ответ

0 голосов
/ 22 февраля 2019

Это просто скопировано из исходного кода 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;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...