上一回完成了Xml配置文件和Excel读取的部分,这一次我们继续
HtmlParser.cs
using mail_poster.Util;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace mail_poster
{
/// <summary>
/// Htm文件解析器
/// </summary>
class HtmParser
{
String htm;
public HtmParser() {
htm = TitleHtm;
}
/// <summary>
/// 将个人数据插入Htm中生成邮件内容
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public String creatMailText(string[] data) {
String htm2 = htm;
String singleLine = "";
foreach (string val in data){
singleLine += "<td>" + val + "</td>";//每一个单元格
}
htm2 = htm2.Replace(Placeholder_M, singleLine);
writeCache(htm2);
return htm2;
}
/// <summary>
/// 将一条数据写入文件替代占位符
/// </summary>
/// <param name="data"></param>
/// <returns></returns>
public void writeCache(String data) {
FileStream fs = new FileStream(Config.mailCachePath,FileMode.Create);
StreamWriter sw = new StreamWriter(fs);
sw.Write(data);
sw.Flush();
sw.Close();
fs.Close();
}
private String TitleHtm {
get { return File.ReadAllText(Config.titleFilePath, Encoding.UTF8); }
}
//内容的占位符
public const string Placeholder_M = "#PLACEHOLDER#";
}
}
Html文件header.htm
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
</head>
<body>
<div id="header" >
写你自己的内容
<table >
写你自己的内容
<tr>
#PLACEHOLDER#
</tr>
</table>
</div>
</body>
</html>
接下来是发送邮件的部分
using System.Net.Mail;
using mail_poster.Util;
using System.Text;
using System.Net;
using System;
using System.Collections;
/// <summary>
/// 邮件发送相关
/// </summary>
namespace mail_poster
{
class MailPoster
{
/// <summary>
/// 准备发送邮件
/// </summary>
/// <param name="config"></param>
/// <param name="mailTo"></param>
/// <param name="mailText"></param>
/// <returns></returns>
public static void SendMail(Config config, string mailTo, string mailText,string subject)
{
//相关类初始化
MailAddress mailForm = new MailAddress(config.Username);
MailMessage mailMessage = new MailMessage();
//设定相关值
mailMessage.To.Add(mailTo);
//mailMessage.CC.Add("");
mailMessage.From = mailForm;
mailMessage.IsBodyHtml = true;
mailMessage.Body = mailText;
mailMessage.BodyEncoding = Encoding.UTF8;
mailMessage.Subject = subject;
//准备发送服务器设定
SmtpClient smtp = new SmtpClient();
smtp.Credentials = new NetworkCredential(config.Username, config.Password);
smtp.Host = config.SendHost;
smtp.EnableSsl = config.UseSsl;
if (!String.IsNullOrWhiteSpace(config.SendPort))
smtp.Port = Convert.ToInt16(config.SendPort);
//发送邮件
try
{
smtp.Send(mailMessage);
}
catch (Exception)
{
throw;
}
}
/// <summary>
/// 读取邮件地址,之前我们已经把通讯录读进List了
/// </summary>
/// <param name="person"></param>
/// <param name="nameLocal"></param>
/// <param name="address"></param>
/// <returns></returns>
public static String GetMailAddress(string[] person, ArrayList address)
{
String name = Convert.ToString(person[1]);
name = name.Trim();
for (int i = 0; i < address.Count; i++)
{
String name2 = ((string[])address[i])[0];
if (name.Equals(name2))
return ((string[])address[i])[1];
}
return null;
}
}
}
接下来就是如何将这一系列的工具类串联起来了
Config config = ConfigReader.ReadConfig();//读取配置文件
XlsReader xr = new XlsReader(Config.contactFilePath);//初始化通讯录
ArrayList sendData, contact:
if (xr.CheckContact())//检查文件合法性
{
contact = xr.GetContact();
Log("通讯录文件读取成功");
}
XlsReader reader = new XlsReader(OpenFilePath);//读取内容文档
bool checkXls = reader.CheckXls();
if (checkXls)//如果文件合法,开始载入文件
{
ArrayList dataList = reader.GetXlsForSend();
if (dataList.Count != 0)
sendData = dataList;
}
for (int i = 0; i < sendData.Count; i++)//发送邮件
{
//获取列表中的单人
string[] person = (string[])sendData[i];
//转换邮件内容
string emailContent = htmParser.creatMailText(person);
//从通讯录获取邮件地址
string mail = MailPoster.GetMailAddress(person, contact);
MailPoster.SendMail(config, mail, emailContent, “标题”);
}
我也是个初学者,编写时磕磕碰碰,出了不少问题,这里只是打算方便后来人,估计代码里面很多地方大神看了都非常想笑,请尽情笑把。。。