C# 发送带有附件的电子邮件;附件在Microsoft Outlook中不带扩展名

C# 发送带有附件的电子邮件;附件在Microsoft Outlook中不带扩展名,c#,outlook,smtpclient,C#,Outlook,Smtpclient,我使用SMTPClient创建了一个C#应用程序,它通过电子邮件发送用于调试的附件(通常只发送图像或文本文件,但也可以发送其他类型的附件)。附件在Outlook(web版)和Gmail中可以正常送达,但在Microsoft Outlook 2013中,附件送达时没有扩展。这是一个问题,因为大多数目标用户将使用Outlook 2013,我不能要求他们在下载附件时手动添加文件扩展名 我已经明确填写了附件的ContentDisposition字段,但它不起作用 private MailMessage

我使用
SMTPClient
创建了一个C#应用程序,它通过电子邮件发送用于调试的附件(通常只发送图像或文本文件,但也可以发送其他类型的附件)。附件在Outlook(web版)和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);

好的,经过一些调试后,我意识到错误在于名称作为参数在
附件(…)
中传递。第二个参数应该接收扩展名为“file.txt”的文件名,而我的变量“
ma.FileName
”本身只有名称。因此,即使我在第三个参数中指定了MIME类型,该方法也不知道应该处理的文件类型。或者至少Outlook没有

att = new Attachment(new MemoryStream(ma.FileContent), ma.FileName + ma.FileType, ma.FileType.GetMimeType());

添加扩展名解决了问题。

您确定接收计算机上的windows没有在资源管理器中设置为“隐藏已知文件类型的文件扩展名”吗?Outlook可能正在读取此设置并隐藏扩展名以匹配资源管理器。@BradleyUffner否,我已将其禁用。我的意思是,当我说它没有扩展名时,并不是说扩展名只是隐藏的,但Outlook仍然将其识别为文本文件,而是说文件到达时好像根本没有扩展名一样,Linux允许您保存没有扩展名的文件。