Excel本地导出并通过邮件自动推送
2015-12-12 20:42
218 查看
转载请注明:http://blog.csdn.net/HEL_WOR/article/details/50277711
如果加上这篇补充博客,那么工作回顾那边博客里,第二个程序就完整的完成了,本来Excel通过邮件自动推送功能在这个项目后期被去掉了,但昨天看到邮箱里测试同学到点手动发送程序生成的EXCEL文件,我想我可以试试把推送功能写出来,花了一上午,程序跑起来后EXCEL被自动推送了,感觉还不错。
MSDN真是个神器,看别人的博客你可能知道代码是怎么写的,看MSDN你能知道为什么要这么写,不过我仍只是写表没写本,如果要知道为什么这样写就能推送出去,只能读书和看源码了。
关于Excel的导出如果想看一看的朋友请移步<最近的工作>篇幅三分一位置,有使用Microsoft.Office.Interop.Excel.DLL和NPOI实现的代码,这里就直接写关于邮件自动推送。
在C#中实现邮件推送,或者打个比喻,我们给国外的某某某寄包裹,我们要写自己的地址,收件人的地址,负责寄包裹的公司(EMS, UPS…),以及出示我们的身份信息。在代码里对应得就是邮件发送方MailAddress From, 邮件接收方 MailAddress To, 邮件收发服务器SmtpClient.Host, 身份验证SmtpClient.Credentials。
如果从思路上来讲的话,如果我们要发送一封带附件的邮件,我们要设置的只有StmpClient, MailMessage, MailMessage.Attachments,StmpClient主要是设置收发服务器,验证,发送方式等信息, MailMessage是设置我们要发送的消息,接收人,抄送人,附件等信息, MailMessage.Attachments是用来保存要发送的附件的,需要用到Attachment,通过Attachment可以设置发送文件以及文件的编码格式,ContentType.MediaType 即是设置附件的内容格式的,其值由MediaTypeNames表示,附件编码格式的指定方式有两种:
上面举的例子里提到了出示我们的身份信息,所以我们需要设置验证信息,即出示我们身份,表明这封邮件确实我”本人”发出的,这点可以用StmpClient.UseDefaultCredentials和StmpClient.Credentials完成。
至于这个StmpClient.UseDefaultCredentials,它会默认以你的登录windos的账号密码作为你的邮箱账号密码,除了在公司里,一般情况下你的邮箱账号密码是不大可能和windos登录账号密码一样的,这种情况下,会返回给你的No authority。所以对于不同的邮件服务器使用StmpClient.Credentials提供你已在这个邮件服务提供商注册了的账户,比如你使用的邮箱服务器地址是smtp.163.com,你需要通过StmpClient.Credentials提供你的163邮箱账户。
如果你不提供验证信息,那么会返回:
![](http://img.blog.csdn.net/20151213002828014)
另外。
如果你使用了SSL加密,记得更换邮件服务器端口号,因为25是非加密的端口,不会对你加密后的账户解密再去验证有没有登录权限。如果没有更换端口话会出现下面的错误:
![](http://img.blog.csdn.net/20151213002456579)
下面是我的草稿代码,是在测试功能的时候记的一些东西:
正式的代码在下面,增加了邮件抄送,地址,账户密码等信息用配置文件读取,可以发到外网的,如果不能发的话更换下邮件服务器。
如果你发现写的程序只能发公司内网不能发到外网去,那可以用foxmail(都可以)设置为使用公司的邮件服务器往外网发一封,比如发到你的163邮箱,如果你收到了,那么说明公司邮件服务器配置没问题,是你的程序SmtpClient参数没配对,比如发外网是需要身份验证的。
记个好玩的,这个程序写完之后我就开始做点有意思的事了,我把公司几个玩的不错的同事就加进接收名单,邮件设置每0.1秒发送一次,不久后他们的Outlook就被拖死了。LOL。
如果加上这篇补充博客,那么工作回顾那边博客里,第二个程序就完整的完成了,本来Excel通过邮件自动推送功能在这个项目后期被去掉了,但昨天看到邮箱里测试同学到点手动发送程序生成的EXCEL文件,我想我可以试试把推送功能写出来,花了一上午,程序跑起来后EXCEL被自动推送了,感觉还不错。
MSDN真是个神器,看别人的博客你可能知道代码是怎么写的,看MSDN你能知道为什么要这么写,不过我仍只是写表没写本,如果要知道为什么这样写就能推送出去,只能读书和看源码了。
关于Excel的导出如果想看一看的朋友请移步<最近的工作>篇幅三分一位置,有使用Microsoft.Office.Interop.Excel.DLL和NPOI实现的代码,这里就直接写关于邮件自动推送。
在C#中实现邮件推送,或者打个比喻,我们给国外的某某某寄包裹,我们要写自己的地址,收件人的地址,负责寄包裹的公司(EMS, UPS…),以及出示我们的身份信息。在代码里对应得就是邮件发送方MailAddress From, 邮件接收方 MailAddress To, 邮件收发服务器SmtpClient.Host, 身份验证SmtpClient.Credentials。
如果从思路上来讲的话,如果我们要发送一封带附件的邮件,我们要设置的只有StmpClient, MailMessage, MailMessage.Attachments,StmpClient主要是设置收发服务器,验证,发送方式等信息, MailMessage是设置我们要发送的消息,接收人,抄送人,附件等信息, MailMessage.Attachments是用来保存要发送的附件的,需要用到Attachment,通过Attachment可以设置发送文件以及文件的编码格式,ContentType.MediaType 即是设置附件的内容格式的,其值由MediaTypeNames表示,附件编码格式的指定方式有两种:
//// 通过构造函数 Attachment attachMent = new Attachment(path, MediaTypeNames.Application.Pdf);
//// 对MediaType 进行指定。(因为是引用类型因此对content指向对象的改变也会反映到指向这个对象的data.ContentType上) Attachment data = new Attachment(textMessage); ContentType content = data.ContentType; content.MediaType = MediaTypeNames.Text.Plain;
上面举的例子里提到了出示我们的身份信息,所以我们需要设置验证信息,即出示我们身份,表明这封邮件确实我”本人”发出的,这点可以用StmpClient.UseDefaultCredentials和StmpClient.Credentials完成。
至于这个StmpClient.UseDefaultCredentials,它会默认以你的登录windos的账号密码作为你的邮箱账号密码,除了在公司里,一般情况下你的邮箱账号密码是不大可能和windos登录账号密码一样的,这种情况下,会返回给你的No authority。所以对于不同的邮件服务器使用StmpClient.Credentials提供你已在这个邮件服务提供商注册了的账户,比如你使用的邮箱服务器地址是smtp.163.com,你需要通过StmpClient.Credentials提供你的163邮箱账户。
如果你不提供验证信息,那么会返回:
另外。
如果你使用了SSL加密,记得更换邮件服务器端口号,因为25是非加密的端口,不会对你加密后的账户解密再去验证有没有登录权限。如果没有更换端口话会出现下面的错误:
下面是我的草稿代码,是在测试功能的时候记的一些东西:
/// <summary> /// 邮件发送参数设置 /// </summary> /// <returns>邮件发送类</returns> private SmtpClient SmtpClientParamSet() { //// 设置邮件服务器 公司内网的服务器 SmtpClient client = new SmtpClient("mail.517na.com"); //// 使用163的服务器 SMTP协议默认端口为25 //// 大多数邮件服务提供商都需要SMTP验证信息 //// SmtpClient client = new SmtpClient("smtp.163.com"); //// 有些 SMTP 服务器要求在代表客户端发送电子邮件之前验证客户端的身份。若要使用默认网络凭据,可以将 UseDefaultCredentials 设置为 true //// 这个时候默认使用你的用户账号,密码作为邮箱的登录密码 //// 比如在公司内部你的邮箱账号密码就是你的开机账号密码 //// 但如果需要登录163,QQ,新浪邮箱服务器,你需要有已经注册了的163或者QQ的邮箱。 //// 这个时候你可以指定了你的账号密码 ////client.Credentials = new System.Net.NetworkCredential("登录账号", "密码"); client.UseDefaultCredentials = true; client.DeliveryMethod = SmtpDeliveryMethod.Network; //// 增加SSL加密记得修改端口 否则会导致远程证书验证失败 //// client.EnableSsl = true; return client; } /// <summary> /// 设置邮件信息517na2TaoBaoExcelSend@163.com /// </summary> /// <param name="path">附件地址</param> /// <returns>邮件信息</returns> private MailMessage MailMessageParamSet(string path) { MailAddress from = new MailAddress("xxxx@xx.com"); MailAddress to = new MailAddress("xxxx@xxx.com"); MailMessage mail = new MailMessage(from, to); mail.Subject = "主题"; mail.Body = "正文"; ////设置附件 指定传送类型数据类型 Attachment attachMent = new Attachment(path, MediaTypeNames.Application.Octet); mail.Attachments.Add(attachMent); return mail; }
正式的代码在下面,增加了邮件抄送,地址,账户密码等信息用配置文件读取,可以发到外网的,如果不能发的话更换下邮件服务器。
需要引用 using System.Net.Mail; using System.Net.Mime;
/// <summary> /// 邮件发送方法 /// </summary> /// <param name="path">附件路径</param> /// <returns>是否成功</returns> public static bool MailSendInvoke(string path) { SmtpClient client = SmtpClientParamSet(); MailMessage mail = MailMessageParamSet(path); try { client.Send(mail); return true; } catch (Exception ex) { //// 记日志 return false; } } /// <summary> /// 邮件发送参数设置 /// </summary> /// <returns>邮件发送类</returns> private static SmtpClient SmtpClientParamSet() { //// 设置邮件服务器 SmtpClient client = new SmtpClient("mail.517na.com"); userName = ConfigurationSettings.AppSettings.Get("发送邮箱地址账号"); password = ConfigurationSettings.AppSettings.Get("发送邮箱地址密码"); //// 检查权限 client.Credentials = new System.Net.NetworkCredential(userName, password); return client; } /// <summary> /// 设置邮件信息 /// </summary> /// <param name="path">附件地址</param> /// <returns>邮件信息</returns> private static MailMessage MailMessageParamSet(string path) { Regex reg = new Regex(@".{2,}\@.+\.\w{2,}"); fromAddress = ConfigurationSettings.AppSettings.Get("发送邮箱地址"); toAddress = ConfigurationSettings.AppSettings.Get("接收邮箱地址"); copyTo = ConfigurationSettings.AppSettings.Get("抄送邮箱地址"); MailAddress from = new MailAddress(fromAddress); MailAddress to = new MailAddress(toAddress); MailMessage mail = new MailMessage(from, to); mail.Subject = "淘宝政策EXCEL表格推送"; mail.Body = "Excel表请查看附件"; ////设置附件 指定传送类型数据类型 Attachment attachMent = new Attachment(path, MediaTypeNames.Application.Octet); mail.Attachments.Add(attachMent); if (!string.IsNullOrEmpty(copyTo)) { //// 处理抄送邮件地址 if (copyTo.Contains('/')) { string[] ccArray = copyTo.Split('/'); foreach (var item in ccArray) { //// 匹配格式 if (Regex.Match(item, reg.ToString(), RegexOptions.None).Success) { mail.CC.Add(item); } else { //// 记日志 } } } else { if (Regex.Match(copyTo, reg.ToString(), RegexOptions.None).Success) { mail.CC.Add(copyTo); } else { //// 记日志 } } } return mail; }
如果你发现写的程序只能发公司内网不能发到外网去,那可以用foxmail(都可以)设置为使用公司的邮件服务器往外网发一封,比如发到你的163邮箱,如果你收到了,那么说明公司邮件服务器配置没问题,是你的程序SmtpClient参数没配对,比如发外网是需要身份验证的。
记个好玩的,这个程序写完之后我就开始做点有意思的事了,我把公司几个玩的不错的同事就加进接收名单,邮件设置每0.1秒发送一次,不久后他们的Outlook就被拖死了。LOL。
相关文章推荐
- 垃圾邮件过滤器 python简单实现
- 使用Python生成Excel格式的图片
- Excel 曝出 Power Query 安全漏洞,1.2 亿用户易受远程 DDE 攻击
- VBA将excel数据表生成JSON文件
- excel vba 限制工作表的滚动区域代码
- excel vba 高亮显示当前行代码
- 使用Ajax实时检测"用户名、邮箱等"是否已经存在
- 邮箱网站不能用mail.xxx.com:8888的方式访问原因
- SQL 导入导出Excel数据的语句
- 文本、Excel、Access数据导入SQL Server2000的方法
- C#导出数据到Excel文件的方法
- Vbscript生成Excel报表的常用操作总结
- C#实现导入CSV文件到Excel工作簿的方法
- C#实现按数据库邮件列表发送邮件的方法
- C#基于NPOI生成具有精确列宽行高的Excel文件的方法
- 总提示[Microsoft][ODBC Excel Driver] 数值字段溢出官方解决方法
- C#使用自带的email组件发送邮件的方法
- C#将Sql数据保存到Excel文件中的方法
- VC6.0实现读取Excel数据的方法
- C#.NET采用HTML模板发送电子邮件完整实例