我想要实现的目标:
扫描邮件并将相关邮件附加到"摘要"邮件中。
我的问题:
我似乎找不到任何关于如何做到这一点的信息。例如,当使用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#可以使用一些破解来开箱即用吗?或者有支持它的库吗?
您可能只想使用采用文件名的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第5.1节。
另外,有关Attachment
构造函数重载的更多信息,请参阅MSDN:https://msdn.microsoft.com/en-us/library/System.Net.Mail.Attachment.Attachment%28v=vs.110%29.aspx
好吧,我找到了一种方法来做我需要的事情。这个解决方案不是完美的答案,但它几乎按预期工作。
警告
此解决方案要求当前安装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);
}