2012-05-18 3 views
3

У нас была проблема с отправкой писем, содержащих вложения с длинными именами и акцентами.Отправка вложений с длинными именами и акцентами

размер или тип, кажется, не влияет на результат (я пытался с & текстовый формат PDF, 300Кб и 3833kb размера)

После некоторого поиска вокруг, я нашел этот пост http://social.msdn.microsoft.com/Forums/en-US/dotnetframeworkde/thread/b6c764f7-4697-4394-b45f-128a24306d55, которые показывают, как обойти проблема.

Если мое имя действительно длинное (см. Имя переменной attachement2), оно будет работать. Но в случае небольшого короткого имени (см attachment1 имя переменной), имя выходит как - = _ изо-8859-1_Q_Example, _Example_and_other_

Я думаю, что он должен сделать с помощью следующей строки как-то в SplitEncodedAttachmentName encodedAttachmentName = encodedAttachmentName.Remove (encodedAttachmentName.Length - encodingtoken.Length, encodingtoken.Length);

Вот часы из attach1 Варс -

attach2 "= ISO-8859-1 Q Пример = 2c_Example_and_other_Repr = e9senta.txt =??" -? «= ISO-8859-1 Q ? Пример = 2c_Example_and_other_Repr = e9sentant_Example_Examp? ==? ISO-8859-1? Q? le_Example_Example_Example_Example2.txt? =»

Я не могу показаться, чтобы получить attachment1 быть отправлены правильно ..

(я сделал ответьте на этот вопрос в прошлом - MailMessage Attachment filename with accents, но у меня была ошибка, рефакторинг и наткнулся на эту проблему ..)

Вот самый маленький пример кода, который я мог бы найти, что вызывает ошибку.

class Program 
{ 
    static void Main(string[] args) 
    { 
     Attachment attachment = new Attachment(@"c:\client\temp\Example,_Example_and_other_Représenta.pdf"); //3488kb 
     Attachment attachment2 = new Attachment(@"c:\client\temp\Example,_Example_and_other_Représentant_Example_Example_Example_Example_Example_Example.pdf"); //3488kb 

     Console.WriteLine(attachment.Name); 

     MailMessage mm = new MailMessage(); 
     mm.From = new MailAddress("toemail"); 
     mm.To.Add("toemail"); 
     mm.Subject = "Yo"; 
     mm.Body = "hello"; 
     mm.Attachments.Add(CreateAttachment(attachment, attachment.Name)); // =_iso-8859-1_Q_Example,_Example_and_other_ 
     mm.Attachments.Add(CreateAttachment(attachment2, attachment2.Name)); 

     SmtpClient smtp = new SmtpClient("SmptServer"); 
     smtp.Send(mm); 
    } 

    /// <summary> 
    /// This method fixes the name of the attachment to allow accents 
    /// </summary> 
    /// <remarks>Taken from http://social.msdn.microsoft.com/Forums/en-US/dotnetframeworkde/thread/b6c764f7-4697-4394-b45f-128a24306d55</remarks> 
    public static Attachment CreateAttachment(Attachment attachmentFile, string displayName) 
    { 
     Attachment attachment = attachmentFile; 
     attachment.TransferEncoding = TransferEncoding.Base64; 

     string tranferEncodingMarker = "Q"; 
     string encodingMarker = "ISO-8859-1"; 
     int maxChunkLength = 76; 

     attachment.NameEncoding = Encoding.GetEncoding(encodingMarker); 

     string encodingtoken = String.Format("=?{0}?{1}?", encodingMarker, tranferEncodingMarker); 
     string softbreak = "?="; 
     string encodedAttachmentName = encodingtoken; 
     encodedAttachmentName = HttpUtility.UrlEncode(displayName, Encoding.Default).Replace("+", " ").Replace("%", "="); 

     encodedAttachmentName = SplitEncodedAttachmentName(encodingtoken, softbreak, maxChunkLength, encodedAttachmentName); 
     attachment.Name = encodedAttachmentName; 

     return attachment; 
    } 


    private static IEnumerable<string> SplitByLength(string stringToSplit, int length) 
    { 
     while (stringToSplit.Length > length) 
     { 
      yield return stringToSplit.Substring(0, length); 
      stringToSplit = stringToSplit.Substring(length); 
     } 

     if (stringToSplit.Length > 0) 
     { 
      yield return stringToSplit; 
     } 
    } 

    private static string SplitEncodedAttachmentName(string encodingtoken, string softbreak, int maxChunkLength, string encoded) 
    { 
     int splitLength = maxChunkLength - encodingtoken.Length - (softbreak.Length * 2); 
     var parts = SplitByLength(encoded, splitLength); 

     string encodedAttachmentName = encodingtoken; 

     foreach (var part in parts) 
     { 
      encodedAttachmentName += part + softbreak + encodingtoken; 
     } 

     encodedAttachmentName = encodedAttachmentName.Remove(encodedAttachmentName.Length - encodingtoken.Length, encodingtoken.Length); 

     return encodedAttachmentName; 
    } 
} 

ответ

4

Оказывается, есть сообщение об ошибке - https://connect.microsoft.com/VisualStudio/feedback/details/696372/filename-encoding-error-when-encoding-utf-8-and-encoded-name-exceeds-the-length-of-a-single-mime-header-line#details

и т.п.н. статья исправить первоначальный выпуск длинных имен со специальными символами. http://support.microsoft.com/kb/2402064

После установки т.п.н.,

Я изменил

mm.Attachments.Add (CreateAttachment (крепления, attachment.Name)); mm.Attachments.Add (CreateAttachment (attachment2, attachment2.Name));

Назад к тому, что должно быть mm.Attachments.Add (приложение); mm.Attachments.Add (attachment2);

и все работало.

Смежные вопросы