将邮件附加到MailMessage

时间:2015-02-26 15:28:54

标签: c# email attachment smtpclient mailmessage

我想要实现的目标:

扫描邮件并将相关邮件附加到“摘要”邮件中。

我的问题:

我似乎无法找到有关如何完成此操作的任何信息。使用例如Outlook时,您只需将邮件拖放到另一条邮件中即可附加邮件。我查看了标题,发现它基本上是邮件的内容和附件,其内容类型无需进一步编码即可附加。但是,通过Attachment.CreateAttachmentFromString将此数据附加到MailMessage也无法解决,该文件显示为常规文件。

我目前的代码:

var mail = new MailMessage(settings.Username, to);
var smtp = new SmtpClient(settings.SMTP, settings.Port);

// ...
// authentication + packing stuff into subject and body
// ...

foreach (var att in attachments) 
{
    Attachment attachment = Attachment.CreateAttachmentFromString(att.Text, att.Filename);
    mail.Attachments.add(attachment);
}

client.Send(mail);
client.Dispose();
mail.Dispose();

我的问题:

C#可以使用一些黑客来开箱即用,还是有支持它的库?

2 个答案:

答案 0 :(得分:2)

您可能只想使用带有文件名的Attachment构造函数:

Attachment attachment = new Attachment(att.Filename);
mail.Attachments.add(attachment);

当然,这假设您已经将附件保存到文件系统的某处。

您也可以使用附件的内容流来避免首先将每个附件保存到文件的开销:

Attachment attachment = new Attachment(att.ContentStream, String.Empty);
mail.Attachments.add(attachment);

注意:该构造函数的第二个参数是“内容类型”,如果保留为空字符串,则为text/plain; charset=us-ascii。有关更多内容类型,请参阅RFC 2045 Section 5.1

另外,请参阅MSDN了解更多Attachment构造函数重载:https://msdn.microsoft.com/en-us/library/System.Net.Mail.Attachment.Attachment%28v=vs.110%29.aspx

答案 1 :(得分:0)

好吧,我找到了一种方法以某种方式做我需要的。这个解决方案不是完美的答案,但它几乎按预期工作。

警告

此解决方案需要安装当前的Outlook,因为邮件需要作为.msg文件附加。我想重复一遍这不是正确的方法,这种方法比任何其他解决方案都慢,但它有效。我会尽快进一步调查。

但就目前而言,这是我的扩展课程:

using System;
using System.Net.Mail;
using System.IO;
using Outlook = Microsoft.Office.Interop.Outlook;

namespace MailAttachment
{
    public static class Extensions
    {
        public static string AttachMail(this MailMessage mail, MailMessage otherMail)
        {
            string path = Path.GetTempPath(),
                tempFilename = Path.Combine(path, Path.GetTempFileName());

            Outlook.Application outlook = new Outlook.Application();
            Outlook.MailItem outlookMessage;

            outlookMessage = outlook.CreateItem(Outlook.OlItemType.olMailItem);
            foreach (var recv in message.To)
            {
                outlookMessage.Recipients.Add(recv.Address);
            }

            outlookMessage.Subject = mail.Subject;

            if (message.IsBodyHtml)
            {
                outlookMessage.BodyFormat = Outlook.OlBodyFormat.olFormatHTML;
                outlookMessage.HTMLBody = message.Body;
            }
            else
            {
                outlookMessage.Body = message.Body;
            }

            outlookMessage.SaveAs(tempFilename);

            outlookMessage = null;
            outlook = null;


            Attachment attachment = new Attachment(tempFilename);
            attachment.Name = mail.Subject + ".msg";
            otherMail.Attachments.Add(attachment);

            return tempFilename;
        }
    }
}

其他信息

此解决方案要求您在发送邮件后删除临时文件。这可能如下所示:

MailMessage mail = new MailMessage();

List<MailMessage> mailsToAttach = mails.FindAll(m => m.Date.CompareTo(otherDate) < 0);
List<string> tempFiles = new List<string>();

foreach (var item in mailsToAttach) 
{
    string tempFile = mail.AttachMail(item);

    tempFiles.Add(tempFile);
}

// smtp.Send(mail)

foreach (var item in tempFiles)
{
    System.IO.File.Delete(item);
}