Sending attachments with long names and accents

We had a problem sending emails containing attachments with long names and accents.

Size or type does not affect the result (I tried with txt and pdf sizes, 300kb and 3833kb)

After some searching, I found this post http://social.msdn.microsoft.com/Forums/en-US/dotnetframeworkde/thread/b6c764f7-4697-4394-b45f-128a24306d55 , which shows how to work around the problem.

If my name is really long (see attachement2 variable name), it will work. But in the case of a small shorter name (see Attachment variable name 1), the name appears as - = _ iso-8859-1_Q_Example, _Example_and_other _

I think this is related to the next line somehow in SplitEncodedAttachmentName encodedAttachmentName = encodedAttachmentName.Remove (encodedAttachmentName.Length - encodingtoken.Length, encodingtoken.Length);

Here's the var1 watch attach1 - "=? ISO-8859-1? Q? Example = 2c_Example_and_other_Repr = e9senta.txt? ="

attach2 - "=? ISO-8859-1? Q? Example = 2c_Example_and_other_Repr = e9sentant_Example_Examp? ==? ISO-8859-1? Q? le_Example_Example_Example_Example2.txt? ="

It seems I can not pass the application 1 correctly.

(I actually answered this question in the past - the file name of the attached MailMessage file with accents , but I had an error, refactoring and came across this problem.)

Here is the smallest code example that I can find that causes the error.

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;
    }
}
+3
1

- 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

kb, . http://support.microsoft.com/kb/2402064

kb,

mm.Attachments.Add(CreateAttachment (attachment, attachment.Name)); mm.Attachments.Add(CreateAttachment (attachment2, attachment2.Name));

, mm.Attachments.Add(); mm.Attachments.Add(attachment2);

.

+4

All Articles