我使用SMTPClient
创建了一个C#应用程序,用于通过电子邮件发送用于调试的附件(通常只是图像或文本文件,但也可以发送其他类型)。附件在Outlook(网络版)和Gmail中很好地到达,但对于Microsoft Outlook 2013,附件无需扩展即可到达。这是一个问题,因为大多数目标用户将使用Outlook 2013,我无法要求他们在下载附件时手动添加文件扩展名。
我已经明确填写了附件的ContentDisposition
字段,但它没有用。
private MailMessage BuildEmail(Message msg)
{
MailMessage email = null;
email = new MailMessage();
email.Subject = msg.Subject.Trim();
email.SubjectEncoding = UTF8Encoding.UTF8;
email.From = new MailAdress(msg.Sender);
email.Body = msg.Body;
email.IsBodyHtml = msg.HasRichText;
email.BodyEncoding = UTF8Encoding.UTF8;
foreach(String to in msg.Recipients)
email.To.Add(new MailAddress(to));
email.Priority = msg.Priority == CatPriority.Urgent ? MailPriority.High : MailPriority.Normal;
foreach (MessageAttachment ma in msg.Attachments)
email.Attachments.Add(BuildAttachment(ma));
return email;
}
private Attachment BuildAttachment(MessageAttachment ma)
{
Attachment att = null;
if (ma == null || ma.FileContent == null)
return att;
att = new Attachment(new MemoryStream(ma.FileContent), ma.FileName, ma.FileType.GetMimeType());
att.ContentDisposition.CreationDate = ma.CreationDate;
att.ContentDisposition.ModificationDate = ma.ModificationDate;
att.ContentDisposition.ReadDate = ma.ReadDate;
att.ContentDisposition.FileName = ma.FileName;
att.ContentDisposition.Size = ma.FileSize;
return att;
}
Message
和MessageAttachment
是包含创建电子邮件和附件所需信息的类。这是我用来获取MIME类型信息的方法:
public static string GetMimeType(this string fileExtension)
{
string mimeType = "application/unknown";
string ext = fileExtension.ToLower();
Microsoft.Win32.RegistryKey regKey = Microsoft.Win32.Registry.ClassesRoot.OpenSubKey(ext);
if (regKey != null && regKey.GetValue("Content Type") != null)
mimeType = regKey.GetValue("Content Type").ToString();
return mimeType;
}
并发送:
smtp = new SmtpClient(host);
smtp.Port = 587;
smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
smtp.UseDefaultCredentials = false;
smtp.Credentials = new NetworkCredential(sender, password);
smtp.EnableSsl = true;
smtp.Timeout = 30000;
smtp.Send(email);
答案 0 :(得分:3)
好的,经过一些调试我意识到错误是在Attachment(...)
中将名称作为参数传递。第二个参数应该接收带有扩展名的文件的名称(例如“file.txt”),而我的变量ma.FileName
本身只有名称。因此,即使我在第三个参数中指定了MIME类型,该方法也不知道它应该处理的文件类型。或者至少Outlook没有。
att = new Attachment(new MemoryStream(ma.FileContent), ma.FileName + ma.FileType, ma.FileType.GetMimeType());
添加扩展程序解决了问题。