将邮件附加到 MailMessage
Attach mail to MailMessage
我想达到的目标:
扫描邮件并将相关邮件附加到 "summary" 邮件中。
我的问题:
我似乎找不到有关如何完成此操作的任何信息。例如,当使用 Outlook 时,您可以简单地将一封邮件拖放到另一封邮件中,从而将其附加。我查看了 headers 并发现它基本上是邮件的内容和附件及其内容类型,没有进一步编码。但是通过 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# 可以使用一些 hack 来开箱即用吗?或者是否有支持它的库?
您可能只想使用带有文件名的 Attachment
构造函数:
Attachment attachment = new Attachment(att.Filename);
mail.Attachments.add(attachment);
当然,这假设您已经将附件保存到文件系统的某个地方。
您也可以只使用附件的内容流来避免先将每个附件保存到文件的开销:
Attachment attachment = new Attachment(att.ContentStream, String.Empty);
mail.Attachments.add(attachment);
注意: 该构造函数的第二个参数是 "content type",如果保留为空字符串,它将是 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
好吧,我找到了一种方法来以某种方式完成我需要的事情。这个解决方案不是完美的答案,但它几乎可以按预期工作。
警告
此解决方案当前需要安装 Outlook,因为邮件需要作为 .msg 文件附加。我想重复一下,这不是正确的方法,这种方法比任何其他解决方案都慢,但它确实有效。我会尽快进一步调查。
但现在,这是我的分机 class:
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);
}
我想达到的目标:
扫描邮件并将相关邮件附加到 "summary" 邮件中。
我的问题:
我似乎找不到有关如何完成此操作的任何信息。例如,当使用 Outlook 时,您可以简单地将一封邮件拖放到另一封邮件中,从而将其附加。我查看了 headers 并发现它基本上是邮件的内容和附件及其内容类型,没有进一步编码。但是通过 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# 可以使用一些 hack 来开箱即用吗?或者是否有支持它的库?
您可能只想使用带有文件名的 Attachment
构造函数:
Attachment attachment = new Attachment(att.Filename);
mail.Attachments.add(attachment);
当然,这假设您已经将附件保存到文件系统的某个地方。
您也可以只使用附件的内容流来避免先将每个附件保存到文件的开销:
Attachment attachment = new Attachment(att.ContentStream, String.Empty);
mail.Attachments.add(attachment);
注意: 该构造函数的第二个参数是 "content type",如果保留为空字符串,它将是 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
好吧,我找到了一种方法来以某种方式完成我需要的事情。这个解决方案不是完美的答案,但它几乎可以按预期工作。
警告
此解决方案当前需要安装 Outlook,因为邮件需要作为 .msg 文件附加。我想重复一下,这不是正确的方法,这种方法比任何其他解决方案都慢,但它确实有效。我会尽快进一步调查。
但现在,这是我的分机 class:
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);
}