首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将邮件附加到MailMessage

将邮件附加到MailMessage
EN

Stack Overflow用户
提问于 2015-02-26 15:28:54
回答 2查看 1.9K关注 0票数 1

我想要达到的目标:

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

我的问题:

我似乎找不到关于这件事是怎么做的任何信息。例如,在使用Outlook时,您可以简单地将邮件拖放到另一条消息中,从而附加邮件。我查看了标题,发现它基本上是邮件的内容和附件,它们的内容类型没有进一步的编码。但是,通过MailMessage将这些数据附加到Attachment.CreateAttachmentFromString中也没有效果,该文件显示为一个常规文件。

当前代码:

代码语言:javascript
复制
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#是否可以使用一些黑客来实现这一点,或者是否有支持这种方法的库?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-27 17:43:43

嗯,我找到了一种方法来满足我的需要。这个解决方案并不是完美的答案,但它的效果几乎与预期的一样。

警告

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

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

代码语言:javascript
复制
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;
        }
    }
}

附加信息

此解决方案要求您在发送邮件后删除临时文件。这个看起来可能是这样的:

代码语言:javascript
复制
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);
}
票数 0
EN

Stack Overflow用户

发布于 2015-02-26 15:34:19

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

代码语言:javascript
复制
Attachment attachment = new Attachment(att.Filename);
mail.Attachments.add(attachment);

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

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

代码语言:javascript
复制
Attachment attachment = new Attachment(att.ContentStream, String.Empty);
mail.Attachments.add(attachment);

注意:构造函数的第二个参数是"content“,如果保留为空字符串,它将是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

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

https://stackoverflow.com/questions/28746396

复制
相关文章

相似问题

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