首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >发送以MailMessage为附件的MailMessage

发送以MailMessage为附件的MailMessage
EN

Stack Overflow用户
提问于 2013-09-19 15:35:15
回答 2查看 1.3K关注 0票数 0

我试图发送一封电子邮件,其中有电子邮件作为附件。我能够发送电子邮件,它通过附件,但我得到以下消息,在outlook时,试图打开任何附件。我认为这与电子邮件附件的编码有关。

代码语言:javascript
复制
MailMessage mm1 = new MailMessage();
mm1.IsBodyHtml = true;
mm1.Body = "Body for person to approve";
mm1.Subject = "Home Owner's Insurance Policy";
mm1.From = new MailAddress("insurance@email.com", "SAHL");
mm1.ReplyTo = new MailAddress("insurance@email.com");
mm1.To.Add("ross.kriel@email.co.za");


foreach (NewBusinessData item in lData)
{

    MailMessage mm = new MailMessage();
    mm.IsBodyHtml = true;
    mm.Body = HTMLBody;
    mm.Subject = "Home Owner's Insurance Policy";
    mm.From = new MailAddress("insurance@email.com", "SAHL");
    mm.ReplyTo = new MailAddress("insurance@email.com");

    byte[] thisAttachment;
    thisAttachment = Common.Attach(Settings.Default.NewBusinessCSFDataFileWriterPath +                item.PolicyNumber + "_" + item.MortgageLoanAccountNumber + ".pdf");

     Stream ClientPDF = new MemoryStream(thisAttachment);

     Attachment attStaticPDF = new Attachment(StaticPDF, "Home Owner's Insurance Policy.pdf");

     Attachment attClientPDF = new Attachment(ClientPDF, item.PolicyNumber + ".pdf");
     mm.Attachments.Add(attStaticPDF);
     mm.Attachments.Add(attClientPDF);

     Assembly assembly = typeof(SmtpClient).Assembly;
     Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
     MemoryStream stream = new MemoryStream();

     ConstructorInfo mailWriterContructor =    mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
     object mailWriter = mailWriterContructor.Invoke(new object[] { stream });
     MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);
     sendMethod.Invoke(mm, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null);

    stream.Position = 0;
    Attachment emailAtt = new Attachment(stream, "Home Owner's Insurance Policy.msg");

    mm1.Attachments.Add(emailAtt);
 }

SmtpClient smtp1 = new SmtpClient();
smtp1.Host = "IPHost";
smtp1.Port = 25;
smtp1.UseDefaultCredentials = true;
smtp1.EnableSsl = false;
try
{
    smtp1.Send(mm1);
}
catch (Exception exd)
{
    Console.WriteLine(exd.ToString());
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-21 13:59:28

所以在一天的最后,是传输编码导致了问题。将其指定为8位并确保附件具有正确的媒体类型也解决了问题。

代码语言:javascript
复制
MailMessage mm1 = new MailMessage();
mm1.IsBodyHtml = true;
mm1.Body = ReportMsgBody;
mm1.Subject = "Home Owner's Insurance Policy Proofs: " + lData.Select(x => x.FileName).First();
mm1.From = new MailAddress("insurance@email.com", "FromName");
mm1.ReplyTo = new MailAddress("insurance@email.com");
mm1.To.Add(receiver.EmailAddress);

foreach (NewBusinessData item in lData)
{
    MailMessage mm = new MailMessage();
    mm.IsBodyHtml = true;
    mm.Body = HTMLBody;
    mm.Subject = "Home Owner's Insurance Policy";
    mm.From = new MailAddress("insurance@email.com", "FromName");
    mm.ReplyTo = new MailAddress("insurance@email.com");
    mm.To.Add(item.EmailAddress);

    byte[] thisAttachment;
    thisAttachment = Common.Attach(Settings.Default.FileWriterPath + item.PolicyNumber + "_" + item.MortgageLoanAccountNumber + ".pdf");
    Stream ClientPDF = new MemoryStream(thisAttachment);
    Attachment attClientPDF = new Attachment(ClientPDF, item.Pr + ".pdf", "application/pdf");
    mm.Attachments.Add(attClientPDF);

    byte[] thisAttachment2;
    thisAttachment2 = Common.Attach(Settings.Default.StaticAttatchmentPath + "Home Owner's Insurance Policy.pdf");
    Stream StaticPDF = new MemoryStream(thisAttachment2);
    Attachment attStaticPDF = new Attachment(StaticPDF, "Home Owner's Insurance Policy.pdf", "application/pdf");
    mm.Attachments.Add(attStaticPDF);

    Assembly assembly = typeof(SmtpClient).Assembly;
    Type mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
    MemoryStream stream = new MemoryStream();

    ConstructorInfo mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
    object mailWriter = mailWriterContructor.Invoke(new object[] { stream });
    MethodInfo sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);
    sendMethod.Invoke(mm, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null);

    stream.Seek(0, SeekOrigin.Begin);
    Attachment emailAtt = new Attachment(stream, "Home Owner's Insurance Policy", "message/rfc822");
    emailAtt.TransferEncoding = System.Net.Mime.TransferEncoding.EightBit;
    mm1.Attachments.Add(emailAtt);
}
票数 0
EN

Stack Overflow用户

发布于 2013-09-19 15:58:50

Outlook的msg格式是二进制文件格式-- MailWriter以SMTP服务器期望接收数据的方式写入邮件(按照RFC 821) --即明文格式。因此,您要附加的文件并不是Outlook所期望的格式。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18899049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档