在MVC中将Outlook邮件项返回给客户端

时间:2015-08-27 17:49:31

标签: c# asp.net-mvc email outlook

在较高的层面上,我正在尝试生成Outlook电子邮件项服务器端,然后将其返回到客户端,以便在本地Outlook中打开,允许他们进行他们想要的任何更改(这与发送时相关)电子邮件通过SMTP)。

这是我第一次使用文件流,而且我不确定如何继续。我有一个非常基本的开始,我正在尝试做什么,这最初只是在此控制器操作返回邮件项后打开Outlook。此代码是Controller中用于创建邮件项的代码。我没有任何添加各种电子邮件地址,正文,主题等的逻辑,因为这不是真正相关的。此代码也会被控制器操作调用,只需将其置于此处,以防我在创建邮件项时出错。

     public MailItem CreateEmail(int id)
    {
        Application app = new Application();
        MailItem email = (MailItem)app.CreateItem(OlItemType.olMailItem);
        email.Recipients.Add("example@example.com");
        return email;
    }

以下是我想将此MailItem返回给客户端的控制器操作。 (这是通过AJAX调用的)

    public ActionResult GenerateEmail(int id)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            BinaryFormatter format = new BinaryFormatter();
            format.Serialize(ms, logic.CreateEmail(id));
            return File(ms, "message/rfc822");
        }
    }

代码在format.Serialize中断,给出了我的_COM对象无法序列化的错误。有没有办法做我想做的事情,或者我应该寻找其他方法来实现这个目标呢?

2 个答案:

答案 0 :(得分:0)

首先,Outlook对象模型不能在服务(例如IIS)中使用。其次,由于您只是指定收件人地址,为什么不在客户端使用mailto链接?

如果您仍想发送邮件,则可以生成EML(MIME)文件 - Outlook应该可以正常打开它。要使其看起来未显示,请使用X-Unsent MIME标头。

答案 1 :(得分:0)

主要基于here的代码,

public ActionResult DownloadEmail()
{
    var message = new MailMessage();

    message.From = new MailAddress("from@example.com");
    message.To.Add("someone@example.com");
    message.Subject = "This is the subject";
    message.Body = "This is the body";

    using (var client = new SmtpClient())
    {
        var id = Guid.NewGuid();

        var tempFolder = Path.Combine(Path.GetTempPath(), Assembly.GetExecutingAssembly().GetName().Name);

        tempFolder = Path.Combine(tempFolder, "MailMessageToEMLTemp");

        // create a temp folder to hold just this .eml file so that we can find it easily.
        tempFolder = Path.Combine(tempFolder, id.ToString());

        if (!Directory.Exists(tempFolder))
        {
            Directory.CreateDirectory(tempFolder);
        }

        client.UseDefaultCredentials = true;
        client.DeliveryMethod = SmtpDeliveryMethod.SpecifiedPickupDirectory;
        client.PickupDirectoryLocation = tempFolder;
        client.Send(message);

        // tempFolder should contain 1 eml file

        var filePath = Directory.GetFiles(tempFolder).Single();

        // stream out the contents - don't need to dispose because File() does it for you
        var fs = new FileStream(filePath, FileMode.Open);
        return File(fs, "application/vnd.ms-outlook", "email.eml");
    }
}

这在Chrome中运行良好,但IE并不想打开它,也许它有一些额外的安全功能。尝试摆弄内容类型和文件扩展名,您也许可以让它在两者中都有效。