2015-03-27 3 views
0

Мы используем System.Net.Mail для отправки сообщений электронной почты как текст с вложениями. Вложения: Файлы Excel и Powerpoint. Перед отправкой электронной почты типы содержимого устанавливаются в типы MIME.System.Net.Mail альтернатива без увеличения размера сообщения

Тест, проведенный с тремя письмами, показал, что на сервере Exchange зафиксировано увеличение на 26% в каждом из случаев.

Есть ли способ остановить это увеличение размера сообщения?

Если нет, есть ли другая альтернатива .NET или с открытым исходным кодом?

Может ли SMTP Drop преодолеть эту проблему?

UPDATE:

var mimeMessage = new MimeMessage(); 

       mimeMessage.From.Add(new MailboxAddress(string.Empty, fromEmailAddress));  
       mimeMessage.To.Add(new MailboxAddress(string.Empty, toEmailAddress)); 
       mimeMessage.Cc.Add(new MailboxAddress(string.Empty, copyEmailAddress)); 
       mimeMessage.Subject = subject; 

       var builder = new BodyBuilder { HtmlBody = bodyText }; 

       MvcApplication.Logger.Info("SendEmail:attachmentFiles:Count=" + attachmentFiles.Count); 
       foreach (var attachmentFile in attachmentFiles) 
       { 
        var attachment = new MimePart() 
        { 
         ContentObject = new ContentObject(File.OpenRead(attachmentFile)), 
         ContentDisposition = new ContentDisposition(ContentDisposition.Attachment), 
         ContentTransferEncoding = ContentEncoding.Binary, 
         FileName = Path.GetFileName(attachmentFile) 
        }; 

        builder.Attachments.Add(attachment); 
       } 
       MvcApplication.Logger.Info("SendEmail:attachmentFiles:Added Count=" + builder.Attachments.Count); 

       mimeMessage.Body = builder.ToMessageBody(); 

       using (var client = new SmtpClient()) 
       { 
        client.Connect("smtp.domain.com", 25, false); 

        client.Send(mimeMessage); 

        MvcApplication.Logger.Info(
         client.Capabilities.HasFlag(SmtpCapabilities.BinaryMime) 
          ? "SMTP Server supports BinaryMime" 
          : "SMTP Server does NOT support BinaryMime"); 


        client.Disconnect(true); 
       } 

Приведенный выше код посылает сообщение HTML успешно.

Флаг сервера SMTP для BinaryMime возвращает true.

Если ContentTransferEncoding является Base64, он работает (9 файлов Excel и PowerPoint прикреплены). Если я изменю его на двоичный, тогда будет прикреплен только один поврежденный файл excel. Что мне здесь не хватает?

+1

Двоичные файлы должны быть закодированы как текст, это приводит к увеличению размера, поскольку доступный алфавит меньше байтов, это то, что вы видите? –

+0

Я бы подумал, что если кодировка файла будет проблемой, он видел бы 33% -ное увеличение во всех случаях. Base64, используемый Exchange для кодирования двоичных файлов для передачи в виде вложения электронной почты, приводит к точному увеличению размера на 33%. – Kevin

+0

Думаю, что да. Сначала я попробовал установку как «Октет», а затем попытался установить определенные типы MIME и раздул размер электронной почты. Outlook при ручной отправке одного и того же электронного письма с вложениями не раздувает размер. –

ответ

1

Если SMTP-сервер поддерживает расширение BINARYMIME, вы можете использовать MailKit для отправки электронной почты и установки Content-Transfer-Encoding вложений в ContentEncoding.Binary.

Я не думаю, что System.Net.Mail поддерживает расширение BINARYMIMNE SMTP (по крайней мере, это не выглядело, когда я просмотрел referencesource на GitHub), поэтому System.Net.Mail.SmtpClient всегда будет base64 или кодовые вложения для кодирования.

Расширение SMTP BINARYMIME позволяет клиентам отправлять сообщения без необходимости кодирования abse64 или кавычки.

+0

Есть ли способ получить тип контента автоматически или я должен установить его вручную для xls, xlsx, pdf, mp3, wmv? –

+0

Пожалуйста, ознакомьтесь с обновлением в описании с кодом, используя mailkit –

+0

Я не знаю. Это работает для меня, так что, возможно, ваш клиент-получатель сломан или что-то еще? Может быть, он не может обрабатывать двоичные вложения? Каким образом он поврежден? Что произойдет, если вы выполните новый ContentObject (File.OpenRead (attachmentFile), ContentEncoding.Binary) '? – jstedfast