您的位置:首页 > 其它

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表示,附件编码格式的指定方式有两种:

//// 通过构造函数
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  邮件 excel 邮箱