使用预填充附件打开默认邮件客户端 - Web(Asp.Net MVC)

时间:2016-09-08 14:12:26

标签: javascript html asp.net-mvc email email-attachments

在搜索了几个小时之后,我意识到这么简单的任务(或者至少看起来像那样)并不容易实现。

那么,是否有可能从Web应用程序打开预填充的邮件客户端窗口(预填充我的意思是添加附件)?我正在使用ASP.NET Mvc,但我想那不是那么重要的bcz代码需要在客户端上执行。

我尝试使用mailto和& attachment =" C:\ file.txt"但是这是最好的工作。我读到可能不可能出于安全原因。这对我来说是最有意义的,bcz的重点是用户可以在发送之前看到邮件(因此它比自动发送邮件更安全)。

而且我不希望服务器端发送,bcz以这种方式每个用户都需要提供他们的凭据,除此之外,用户可能希望在发送之前更改邮件内的smt。

这是关于企业软件,当用户点击链接时,我在服务器上创建一个文档,将其下载到客户端,现在,尝试将其附加到邮件中,然后打开新创建的邮件

由于 此致

1 个答案:

答案 0 :(得分:0)

虽然你说:

  

代码需要在客户端上执行

根据您发布的要求,在服务器上执行此操作仍然有效且有效。如果还有其他原因导致您不应该在服务器上执行此操作,请告诉我。

如果您可以访问服务器上的附件文件,则可以在服务器上生成System.Net.Mail.MailMessage对象,添加附件,并通过下载将文件传递给用户。 (有点棘手,但请参阅下面的可能解决方案)

唯一的缺点是,用户必须主动打开下载的邮件文件,而不是立即打开邮件程序。

这是你可以将MailMessage转换为字节数组的方法(假设你正在使用):

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,则必须更改内容类型。