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");
}
ASP.NET MVC 生成EML文件的更多相关文章
- [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传
原文 [代码示例]用Fine Uploader+ASP.NET MVC实现ajax文件上传 Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件 ...
- ASP.NET MVC 导出CSV文件
ASP.NET MVC 导出CSV文件.直接贴代码 /// <summary> /// ASP.NET MVC导出CSV文件Demo1 /// </summary> /// ...
- ASP.NET MVC下使用文件上传
这里我通过使用uploadify组件来实现异步无刷新多文件上传功能. 1.首先下载组件包uploadify,我这里使用的版本是3.1 2.下载后解压,将组件包拷贝到MVC项目中 3. 根目录下添加新 ...
- (一)【转】asp.net mvc生成验证码
网站添加验证码,主要为防止机器人程序批量注册,或对特定的注册用户用特定程序暴力破解方式,以进行不断的登录.灌水等危害网站的操作.验证码被广泛应用在注册.登录.留言等提交信息到服务器端处理的页面中. ...
- ASP.Net MVC 生成安全验证码
---------html <td>验证码:</td> <td> <img src="/Logi ...
- 用Fine Uploader+ASP.NET MVC实现ajax文件上传[代码示例]
Fine Uploader(http://fineuploader.com/)是一个实现 ajax 上传文件的 Javascript 组件. This project attempts to achi ...
- ASP.NET MVC上传文件----uploadify的使用
课程设计需要实现上传文件模块,本来ASP.NET是有内置的控件,但是ASP.NET MVC没有,所以就有两种方法:自定义和采用第三方插件.由于时间的关系,故采用第三方插件:uploadify. upl ...
- Asp.Net MVC 文件管理Demo(文件展示,上传,下载,压缩,文件重命名等)
之前 ,有想做一个文件管理页面. 参考了 许多资料,终于完成了一个基于Asp.net MVC 的文件管理Demo.界面如下. 一,实现功能及相关技术 文件管理Demo基于Asp.NET MVC , ...
- ASP.NET MVC上传文件
最近参考网络资料,学习了ASP.NET MVC如何上传文件.最基本的,没有用jQuery等技术. 1.定义Model public class TestModel { [Displ ...
随机推荐
- The system has no LUN copy license
[问题描述] ipsan作为cinder后端的时候,通过快照创建磁盘失败,报以下错误: { u 'data': {}, u 'error': { u 'code': 1077950181, u 'de ...
- System.InsufficientMemoryException:无法分配536870912字节的托管内存缓冲区。可用内存量可能不足
一个病人住院太久,一次性打印护理表单超过3000条时报如标题所示的错误, 个人查阅分析应该可以从如下几方面入手: 一:查看程序客户端和服务端的配置文件相关属性是否限制了缓存最大值 (应该不是这个问题, ...
- sql中生成随机字符串的function
create or replace function random_string(integer) returns text as $body$ ))::) , $)), ''); $body$ la ...
- opencv学习之等待按键事件-waitKey函数
文章来源: https://mangoroom.cn/opencv/opencv-learning-waitKey.html 序 waitKey函数属于opencv函数里既常用又非常基础的函数,无论是 ...
- win10+vs2013+pcl1.8.0(x86) 环境配置遇到的各种小问题解决
1.PCL提供了各自的PDB调试文件(解压后放入pcl安装目录的bin下) 2.OpenNI的安装需同其余在pcl第三方库文件夹下 3.添加附加依赖项的.lib文件请按照网上对应版本添加,另外需要每行 ...
- goods商品类
- Hdu 4738【tanjan求无向图的桥】割边判定定理 dfn[x] < low[y]
题目: 曹操在长江上建立了一些点,点之间有一些边连着.如果这些点构成的无向图变成了连通图,那么曹操就无敌了.刘备为了防止曹操变得无敌,就打算去摧毁连接曹操的点的桥.但是诸葛亮把所有炸弹都带走了,只留下 ...
- Jade学习(四)之结合node如何编译执行
1.首先安装node 2.新建一个文件夹并进入该文件夹 3.安装jade 4.在新建的文件夹下新建js文件,写nodejs代码 5.在vscode中利用插件code runner直接执行js文件,输出 ...
- android中的rn项目更新gradle及补充二
修改build.gradle的版本,com.android.tools.build:gradle:2.1.0, 改为更高的,然后更改gradle/wrapper/gradle-wrapper.prop ...
- npm 命令行基本操作
npm命令选项选项 说明search 在存储库中查找模块包 npm search expressinstall 使用在存储库或本地位置上的一个package.json文件来安装 ...