实用小程序:C#读取Excel并根据每一条条目群发邮件(二)

上一回完成了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, “标题”);
    }

我也是个初学者,编写时磕磕碰碰,出了不少问题,这里只是打算方便后来人,估计代码里面很多地方大神看了都非常想笑,请尽情笑把。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值