gpt4 book ai didi

c# - 带有重音符号的 MailMessage 附件文件名

转载 作者:太空狗 更新时间:2023-10-29 21:14:41 25 4
gpt4 key购买 nike

我正在尝试发送带有 Excel 文件名的 HTML 电子邮件。一切都很好,直到我需要发送附件名称包含重音字母的邮件:-(我尝试过的每一个解决方法都惨遭失败。

原代码:

  var attachment = new Attachment(
new MemoryStream(excelFileContents),
"simplefilename.xls");

这个很好用。但是,如果我将“simplefilename.xls”替换为“échec.xls”,附件将被丢弃(名称和内容)。

我尝试了这些,但无济于事:

  var attachment = new Attachment(
new MemoryStream(excelFileContents),
new System.Net.Mime.ContentType("application/vnd.ms-excel"));
attachment.Name = "échec.xls";

最后一个更糟糕:SmtpClient.Send() 抛出异常,提示文件名中的é:

  var attachment = new Attachment(
new MemoryStream(excelFileContents),
new System.Net.Mime.ContentType("application/vnd.ms-excel"));
attachment.ContentDisposition.FileName = "échec.xls";

我在这个问题上苦苦思索了太久。热烈欢迎任何灯光!

最佳答案

我终于找到了一个有效的答案。

http://social.msdn.microsoft.com/Forums/en-US/dotnetframeworkde/thread/b6c764f7-4697-4394-b45f-128a24306d55

除 Marcel Roma 的帖子外,其他内容均为德语。我将他的代码放入我的应用程序中。我能够发送带口音的 pdf,我们看到的是附件而不是垃圾。

这里是:

public class AttachmentHelper
{
public static System.Net.Mail.Attachment CreateAttachment(string attachmentFile, string displayName, TransferEncoding transferEncoding)
{
System.Net.Mail.Attachment attachment = new System.Net.Mail.Attachment(attachmentFile);
attachment.TransferEncoding = transferEncoding;

string tranferEncodingMarker = String.Empty;
string encodingMarker = String.Empty;
int maxChunkLength = 0;

switch (transferEncoding)
{
case TransferEncoding.Base64:
tranferEncodingMarker = "B";
encodingMarker = "UTF-8";
maxChunkLength = 30;
break;
case TransferEncoding.QuotedPrintable:
tranferEncodingMarker = "Q";
encodingMarker = "ISO-8859-1";
maxChunkLength = 76;
break;
default:
throw (new ArgumentException(String.Format("The specified TransferEncoding is not supported: {0}", transferEncoding, "transferEncoding")));
}

attachment.NameEncoding = Encoding.GetEncoding(encodingMarker);

string encodingtoken = String.Format("=?{0}?{1}?", encodingMarker, tranferEncodingMarker);
string softbreak = "?=";
string encodedAttachmentName = encodingtoken;

if (attachment.TransferEncoding == TransferEncoding.QuotedPrintable)
encodedAttachmentName = HttpUtility.UrlEncode(displayName, Encoding.Default).Replace("+", " ").Replace("%", "=");
else
encodedAttachmentName = System.Convert.ToBase64String(Encoding.UTF8.GetBytes(displayName));

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

return attachment;
}

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;
}

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;
}
}

按以下方式使用:

static void Main(string[] args)
{
string smtpServer = String.Empty;
string userName = String.Empty;
string password = String.Empty;
string attachmentFilePath = String.Empty;
string displayName = String.Empty;

System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient(smtpServer);
client.Credentials = new System.Net.NetworkCredential(userName, password);

var msg = new System.Net.Mail.MailMessage(fromAddress, toAddress, "Subject", "Body");
System.Net.Mail.Attachment attachment =
AttachmentHelper.CreateAttachment(attachmentFilePath, displayName, TransferEncoding.Base64);

msg.Attachments.Add(attachment);
client.Send(msg);
}

关于c# - 带有重音符号的 MailMessage 附件文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5349887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com