C# 发送模板邮件并嵌入N张图片(优化) 以模版img标签为驱动

原创 2012年09月29日 14:36:05
        public ServiceResult SendMail_imgTest(string toEmail)
        {
            var result = new ServiceResult()
            {
                Success = false,
                Message = ""
            };
            try
            {
                var smtp = new SmtpClient();
                smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
                smtp.Host = mailServer;
                smtp.Port = port;
                smtp.EnableSsl = ssl;
                smtp.Credentials = new System.Net.NetworkCredential(mailUserName, mailPassword);
                NameValueCollection myCol = new NameValueCollection();
                string timeNow = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                CultureInfo cultureInfo = new CultureInfo("zh-CN");
                string DayOfWeek = cultureInfo.DateTimeFormat.GetAbbreviatedDayName(DateTime.Today.DayOfWeek);
                myCol.Add("TaskName", "测试图片邮件");
                myCol.Add("NowTime", timeNow);
                myCol.Add("DayOfWeek", getWeek(DateTime.Now));
                myCol.Add("TitleTime", DateTime.Now.ToString("yyyy年MM月dd日"));
                string mailBody = BulidByFile(Server.MapPath("/template/test.htm"), myCol);
                //替换img标签src属性  返回替换后html
                var str_html = RegexHtml(mailBody);
                //处理所有img标签
                var htmlBody = GetHtmlImageUrlList(mailBody, str_html);
                
                MailMessage msg = new MailMessage();
                // sender
                msg.From = new MailAddress("111@11.com.cn");
                msg.AlternateViews.Add(htmlBody);
                msg.To.Add(toEmail);

                // if error, smtp server will be send notification
                msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;

                // subject 主题
                msg.Subject = "测试图片邮件";

                // subject encoding  编码
                msg.SubjectEncoding = Encoding.UTF8;

                // format is html
                msg.IsBodyHtml = true;

                // body encoding  
                msg.BodyEncoding = Encoding.UTF8;

                // body 
                msg.Body = str_html;
                smtp.Send(msg);
                result.Success = true;
                result.Message = str_html;
                return result;
            }
            catch (Exception e)
            {
                return result;
            }
        }

        public AlternateView GetHtmlImageUrlList(string sHtmlText, string str_html)
        {
            AlternateView htmlBody = AlternateView.CreateAlternateViewFromString(str_html, Encoding.UTF8, "text/html");
            Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r

\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
            MatchCollection matches = regImg.Matches(sHtmlText);
            foreach (Match match in matches)
            {
                var src = match.Groups["imgUrl"].Value;
                if (!src.Contains("http://www"))//绝对路径图片不处理
                {
                    var fileName_index = src.LastIndexOf('/');
                    var cid = src.Substring(fileName_index + 1, src.Length - fileName_index - 5);
                    LinkedResource lrImage = new LinkedResource(Server.MapPath("template/" + src), "image/gif");
                    lrImage.ContentId = cid;
                    htmlBody.LinkedResources.Add(lrImage);
                }
            }
            return htmlBody;
        }

        /// <summary>
        /// 替换img标签的sec属性
        /// </summary>
        /// <param name="htmltext">html</param>
        /// <returns></returns>
        public string RegexHtml(string htmltext)
        {
            Regex regImg = new Regex(@"<img\b[^<>]*?\bsrc[\s\t\r\n]*=[\s\t\r\n]*[""']?[\s\t\r\n]*(?<imgUrl>[^\s\t\r

\n""'<>]*)[^<>]*?/?[\s\t\r\n]*>", RegexOptions.IgnoreCase);
            MatchCollection matches = regImg.Matches(htmltext);
            foreach (Match match in matches)
            {
                var src = match.Groups["imgUrl"].Value;
                if (!src.Contains("http://spimg"))
                {
                    var fileName_index = src.LastIndexOf('/');
                    var cid = src.Substring(fileName_index + 1, src.Length - fileName_index - 5);
                    htmltext = Regex.Replace(htmltext, src, "cid:" + cid, RegexOptions.None);
                }
            }
            return htmltext;
        }

        public static string BulidByFile(string templatePath, NameValueCollection values)
        {
            return BulidByFile(templatePath, values, "[$", "]");
        }

        public static string BulidByFile(string templatePath, NameValueCollection values, string prefix, string postfix)
        {
            StreamReader reader = null;
            string template = string.Empty;
            try
            {
                reader = new StreamReader(templatePath);
                template = reader.ReadToEnd();
                reader.Close();
                if (values != null)
                {
                    foreach (string key in values.AllKeys)
                    {
                        template = template.Replace(string.Format("{0}{1}{2}", prefix, key, postfix), values[key]);
                    }
                }
            }
            catch
            {

            }
            finally
            {
                if (reader != null)
                    reader.Close();
            }
            return template;
        }

        public class ServiceResult
        {
            public bool Success { get; set; }
            public string Message { get; set; }
        }
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>审核通过</title>
    <style>
        body, div, p, h1, ul, li, table, tr, td
        {
            margin: 0;
            padding: 0;
            border: none;
            list-style: none;
        }
        html, body
        {
            font-size: 12px;
            line-height: 24px;
            font-family: " 微软雅黑 " , " 宋体 " , " 黑体 " ,Arial, Helvetica, sans-serif;
        }
        a
        {
            font-size: 12px;
            font-weight: normal;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <table border="0" cellspacing="0" cellpadding="0" width="520" bgcolor="#ededef" style="margin: 0px auto;">
        <tr>
            <td height="78" valign="middle" width="220" align="right">
                    <img border="0" alt="" src="mailimg/logo1.gif" />
            </td>
            <td width="300" align="right" valign="middle" style="font-family: 微软雅黑; color: #666666;
                font-size: 14px">
                <span style="color: #000; font-size: 16px">[$TitleTime] [$DayOfWeek] <!--模板替换标签-->     </span><br />
                [$city] [$temp1]~[$temp2] [$weather]        
            </td>
        </tr>
    </table>
    <table width="520" border="0" cellspacing="0" cellpadding="0" bgcolor="#FFFFFF" style="margin: 0px auto;">
        <tr>
            <td width="28" valign="top" bgcolor="#ededef">
                <img src="mailimg/mail_l_01.gif" width="28" height="343" />
            </td>
            <td width="43" valign="top" bgcolor="#FFFFFF">
                <img src="mailimg/mail_l_02.gif" width="43" height="343" />
            </td>
            <td width="378" valign="top" style="line-height: 24px; color: #6c6c6c; font-size: 12px;">
                
                
                
            </td>
            <td width="43" valign="top">
                <img src="mailimg/mail_r_01.gif" width="43" height="343" />
            </td>
            <td width="28" valign="top" bgcolor="#ededef">
                <img src="mailimg/mail_r_02.gif" width="28" height="343" />
            </td>
        </tr>
    </table>
</body>
</html>


此次优化放弃了xml配置部分  虽然配置也比较简单  但还是不理想
现在主要是用正则查找到img标签然后再替换src属性   页面有多少个img标签都不需要对程序进行修改  
希望还能再次优化  有什么意见和建议 希望大家能够提出来 大家一起进步 真心感谢..!!!




spring mvc发送带有内嵌图片的velocity模板

1.velocity模板如下 test.vm 你好,${userName}! 下面是实例图片: 模板路径:/sem/src/main/webapp/WEB-INF/velocity/e...
  • Carl_WeiRenKuan
  • Carl_WeiRenKuan
  • 2015年05月14日 11:20
  • 1333

C# 发送模板邮件并嵌入N张图片

private string mailServer = ConfigurationManager.AppSettings["EmailServer"];         private string ...
  • zhaochanglong
  • zhaochanglong
  • 2012年09月25日 15:34
  • 4363

Java使用freemarker模版发送包含图片邮件

最近要做一个流程发送邮件的事情。发送的对象不一样。邮件内容不一样。使用freemarker 模版来作为邮件发送的模版。 java 发送邮件首先需要导入所需jar包。因为发送邮件中包涵图片所以...
  • u012373815
  • u012373815
  • 2016年07月06日 22:16
  • 1893

C# 发送邮件内容嵌入图片

我们在发送邮件时,一般图片都是用网络路径,但有时如果接收方不可直接访问外网,就不能看到图片了,比如公司内部邮件,跟外界就没法交流图片。 那么我们就来把图片嵌入邮件中;查看人就没有限制了。 1。以l...
  • anihasiyou
  • anihasiyou
  • 2014年12月31日 16:20
  • 5632

C#发送带图片HTML邮件

SmtpClient client = new SmtpClient(); client.Host = "smtp.163.com"; MailMess...
  • TrueRed
  • TrueRed
  • 2015年11月23日 15:10
  • 435

【干货】使用Java发送各种格式的邮件

测试可用:          有些重复代码没有给注释。类的方法作用自行查看API了解,最后附上源码。         首先使用JavaMail的jar,官网可下载。        公共静...
  • u011031689
  • u011031689
  • 2016年05月05日 22:09
  • 5185

JavaMail发送HTML邮件

目的在一些客户响应系统中,面对客户的需求,我们有可能需要通过邮件对客户进行通知或者向客户反馈查询信息。比如:银行的账单系统,需要对客户的查账请求进行处理,发送账单邮件,此时就能将账单数据写入到HTML...
  • qq_24448899
  • qq_24448899
  • 2017年08月09日 08:55
  • 1110

使用spring 并加载模板发送Email 发邮件 java 模板

以下例子是使用spring发送email,然后加载到固定的模板,挺好的,大家可以试试 需要使用到spring-context 包 和 com.springsource.org.apache.velo...
  • CloudCraft
  • CloudCraft
  • 2013年09月24日 23:40
  • 4694

c#:SMTP发送带图片邮件

使用SMTP发送邮件 发送的邮件为本地html文件,html中的图片为本地图片主体函数,根据传入的bool参数发送不同的模板internal class FeedbackMail { pub...
  • u014571132
  • u014571132
  • 2016年12月02日 14:43
  • 780

spring+velocity+javamail发送模版邮件

有时候当我们注册完的时候系统会提示有一封邮件发送到了你的邮箱,如何做呢?  就要用到spring+velocity+javamail这3个玩意,其实只用了spring,因为其他2个都被spring集...
  • Hughnes
  • Hughnes
  • 2016年05月10日 16:16
  • 1783
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 发送模板邮件并嵌入N张图片(优化) 以模版img标签为驱动
举报原因:
原因补充:

(最多只允许输入30个字)