3

長い名前とアクセントが含まれる添付ファイルを含むメールの送信に問題がありました。

サイズやタイプは結果に影響を与えていないようです (サイズが 300kb と 3833kb の txt & pdf で試しました)

いくつか検索した後、問題を回避する方法を示すこの投稿http://social.msdn.microsoft.com/Forums/en-US/dotnetframeworkde/thread/b6c764f7-4697-4394-b45f-128a24306d55を見つけました。

私の名前が本当に長い場合 (attachement2 変数名を参照)、それは機能します。しかし、少し短い名前の場合 (attachment1 変数名を参照)、名前は -=_iso-8859-1_Q_Example,_Example_and_other_ として出てきます。

SplitEncodedAttachmentName encodedAttachmentName = encodedAttachmentName.Remove(encodedAttachmentName.Length - encodingtoken.Length, encodingtoken.Length); の次の行と関係があると思います。

これが変数 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?="

添付ファイル1を正しく送信できないようです..

(私は過去にこの質問に答えました -アクセント付きのメールメッセージの添付ファイル名ですが、バグがあり、リファクタリングし、この問題に遭遇しました..)

これは、エラーの原因となる最小のコード例です。

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

1 に答える 1

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

特殊文字を含む長い名前の最初の問題を修正するための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(attachment);であるはずの状態に戻ります。mm.Attachments.Add(attachment2);

そしてすべてがうまくいった。

于 2012-05-18T18:04:17.597 に答える