У нас была проблема с отправкой писем, содержащих вложения с длинными именами и акцентами.Отправка вложений с длинными именами и акцентами
размер или тип, кажется, не влияет на результат (я пытался с & текстовый формат 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;
}
}