发送带附件的电子邮件;附件在Microsoft Outlook中没有扩展名到达

时间:2014-05-14 18:43:33

标签: c# outlook smtpclient

我使用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;
}

MessageMessageAttachment是包含创建电子邮件和附件所需信息的类。这是我用来获取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);

1 个答案:

答案 0 :(得分:3)

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

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

添加扩展程序解决了问题。