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");
Attachment attachment2 = new Attachment(@"c:\client\temp\Example,_Example_and_other_Représentant_Example_Example_Example_Example_Example_Example.pdf");
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));
mm.Attachments.Add(CreateAttachment(attachment2, attachment2.Name));
SmtpClient smtp = new SmtpClient("SmptServer");
smtp.Send(mm);
}
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;
}
}