在较高的层面上,我正在尝试生成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对象无法序列化的错误。有没有办法做我想做的事情,或者我应该寻找其他方法来实现这个目标呢?
答案 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并不想打开它,也许它有一些额外的安全功能。尝试摆弄内容类型和文件扩展名,您也许可以让它在两者中都有效。