那么,是否有可能从Web应用程序打开预填充的邮件客户端窗口(预填充我的意思是添加附件)?我正在使用ASP.NET Mvc,但我想那不是那么重要的bcz代码需要在客户端上执行。
我尝试使用mailto和& attachment =" C:\ file.txt"但是这是最好的工作。我读到可能不可能出于安全原因。这对我来说是最有意义的,bcz的重点是用户可以在发送之前看到邮件(因此它比自动发送邮件更安全)。
而且我不希望服务器端发送,bcz以这种方式每个用户都需要提供他们的凭据,除此之外,用户可能希望在发送之前更改邮件内的smt。
这是关于企业软件,当用户点击链接时,我在服务器上创建一个文档,将其下载到客户端,现在,尝试将其附加到邮件中,然后打开新创建的邮件
由于 此致
答案 0 :(得分:0)
虽然你说:
代码需要在客户端上执行
根据您发布的要求,在服务器上执行此操作仍然有效且有效。如果还有其他原因导致您不应该在服务器上执行此操作,请告诉我。
如果您可以访问服务器上的附件文件,则可以在服务器上生成System.Net.Mail.MailMessage
对象,添加附件,并通过下载将文件传递给用户。 (有点棘手,但请参阅下面的可能解决方案)
唯一的缺点是,用户必须主动打开下载的邮件文件,而不是立即打开邮件程序。
这是你可以将MailMessage转换为字节数组的方法(假设你正在使用c#):
public static byte[] ToEml(this MailMessage message)
{
var assembly = typeof(SmtpClient).Assembly;
var mailWriterType = assembly.GetType("System.Net.Mail.MailWriter");
using (var memoryStream = new MemoryStream())
{
// Get reflection info for MailWriter contructor
var mailWriterContructor = mailWriterType.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { typeof(Stream) }, null);
// Construct MailWriter object with our FileStream
var mailWriter = mailWriterContructor.Invoke(new object[] { memoryStream });
// Get reflection info for Send() method on MailMessage
var sendMethod = typeof(MailMessage).GetMethod("Send", BindingFlags.Instance | BindingFlags.NonPublic);
// Call method passing in MailWriter
sendMethod.Invoke(message, BindingFlags.Instance | BindingFlags.NonPublic, null, new[] { mailWriter, true, true }, null);
// Finally get reflection info for Close() method on our MailWriter
var closeMethod = mailWriter.GetType().GetMethod("Close", BindingFlags.Instance | BindingFlags.NonPublic);
// Call close method
closeMethod.Invoke(mailWriter, BindingFlags.Instance | BindingFlags.NonPublic, null, new object[] { }, null);
return memoryStream.ToArray();
}
}
(找到here)
然后构建一个控制器动作,将该字节数组作为文件结果返回:
var result =
new FileContentResult(messageBytes, "application/vnd.ms-outlook")
{
FileDownloadName = "WhateverDownloadNameYouNeed.eml"
};
如果您不使用Outlook,则必须更改内容类型。