zoukankan      html  css  js  c++  java
  • ASP.NET MVC 生成EML文件

    需求: 点发送邮件按钮的时候, 自动在客户端电脑打开默认邮件的窗口,并且把内容和附件都附加上去.

    解决方案: 尝试使用过Microsoft.Office.Interop.Outlook 和 MPAI.dll 都无法实现, 在本地debug的时候是完全没问题的, 但是部署到IIS上后发现 这两个方式都会在服务器上寻找默认的邮件客户端. 显然这个不能实现的。

    Mailto :方法可行, 也可以打开默认的邮件客户端,但是无法添加附件。 

    最后只能在Controller里面生成EML文件

    注意: 在这里我曾使用过MomeyStream 直接作为附件, 但是提示文件损坏. 后面没有时间就没有继续研究了,. 目前是保存到服务器的一个文件夹里面. 

    下面是实现的代码:

    Helper:

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using System.Net.Http;
    using System.Net.Mail;
    using System.Reflection;
    using System.Text;
    using System.Threading.Tasks;
    using System.Web.Mvc;
    
    namespace AgilityNorthAsiaPlatform.Code.Helpers
    {
        public class MailHelper
        {
         
            public static void ToEmlStream(System.Net.Mail.MailMessage msg, Stream str, string dummyEmail)
            {
                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(msg);
    
                    // tempFolder should contain 1 eml file
                    var filePath = Directory.GetFiles(tempFolder).Single();
    
                    // create new file and remove all lines that start with 'X-Sender:' or 'From:'
                    string newFile = Path.Combine(tempFolder, "modified.eml");
                    using (var sr = new StreamReader(filePath))
                    {
                        using (var sw = new StreamWriter(newFile))
                        {
                            string line;
                            while ((line = sr.ReadLine()) != null)
                            {
                                if (!line.StartsWith("X-Sender:") &&
                                    !line.StartsWith("From:") &&
                                    // dummy email which is used if receiver address is empty
                                    !line.StartsWith("X-Receiver: " + dummyEmail) &&
                                    // dummy email which is used if receiver address is empty
                                    !line.StartsWith("To: " + dummyEmail))
                                {
                                    sw.WriteLine(line);
                                }
                            }
                        }
                    }
    
                    // stream out the contents
                    using (var fs = new FileStream(newFile, FileMode.Open))
                    {
                        fs.CopyTo(str);
                    }
                }
            }
    
            public static string ReadSignature()
            {
                string appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\Microsoft\Signatures";
                string signature = string.Empty;
                DirectoryInfo diInfo = new DirectoryInfo(appDataDir);
                if
                (diInfo.Exists)
                {
                    FileInfo[] fiSignature = diInfo.GetFiles("*.htm");
    
                    if (fiSignature.Length > 0)
                    {
                        StreamReader sr = new StreamReader(fiSignature[0].FullName, Encoding.Default);
                        signature = sr.ReadToEnd();
                        if (!string.IsNullOrEmpty(signature))
                        {
                            string fileName = fiSignature[0].Name.Replace(fiSignature[0].Extension, string.Empty);
                            signature = signature.Replace(fileName + "_files/", appDataDir + "/" + fileName + "_files/");
                        }
                    }
    
                }
                return signature;
            }
    
    
    
        }
    }
    

     Controller 

    public FileStreamResult ModalSendMail()
            {
    var report = new rpt_CFS_ShipmentReport_1(); report.ajs_Param.Value = (string)LocalViewData["SendMail_Json"]; report.as_Table.Value = "Con_Shp"; report.as_UsrID.Value = User.Identity.Name; var ReportStream = new MemoryStream(); report.ExportToPdf(ReportStream); string ls_filename = "Shipment Report" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".pdf"; try { report.ExportToPdf(ReportStream); FileStream fs = null; fs = new FileStream(Path.Combine(Server.MapPath("~/FileUploads/"), ls_filename), FileMode.CreateNew); fs.Write(ReportStream.GetBuffer(), 0, ReportStream.GetBuffer().Length); fs.Flush(); fs.Close(); ReportStream.Flush(); ReportStream.Close(); } catch (Exception ex) { } string dummyEmail = User.Identity.Name+"@xxx.com"; var mailMessage = new MailMessage(); mailMessage.To.Add(new MailAddress("xxx@xxx.com")); mailMessage.From = new MailAddress(dummyEmail); mailMessage.Subject = "Test subject"; mailMessage.IsBodyHtml = true; mailMessage.Body = "Test body" + MailHelper.ReadSignature(); // mark as draft mailMessage.Headers.Add("X-Unsent", "1"); // download image and save it as attachment using (var httpClient = new HttpClient()) { //download file from HTTP: //var imageStream = await httpClient.GetStreamAsync(new Uri(Path.Combine(Server.MapPath("~/FileUploads/"), ls_filename))); //mailMessage.Attachments.Add(new Attachment(HttpContext.Server.MapPath("~/App_Data/Test.docx"))); mailMessage.Attachments.Add(new System.Net.Mail.Attachment(Path.Combine(Server.MapPath("~/FileUploads/"), ls_filename), MediaTypeNames.Application.Pdf)); } var stream = new MemoryStream(); MailHelper.ToEmlStream(mailMessage, stream, "jahe@agility.com"); stream.Position = 0; return File(stream, "message/rfc822", "test_email.eml"); }

      

  • 相关阅读:
    .NET写的Email可以群发邮件的实用函数
    動網中用到的幾個Function和一個JS[base64encode,base64decode,md5,sendmail,js]
    HTML在线编辑器
    IIS虚拟目录控制类
    实用正则表达式(实用篇)
    IIS站点管理类
    精巧sql语句
    圖片滾動代碼
    c# 添加图片水印,可以指定水印位置+生成缩略图
    JavaScript旋转图片
  • 原文地址:https://www.cnblogs.com/hesijian/p/10457140.html
Copyright © 2011-2022 走看看