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标签都不需要对程序进行修改  
希望还能再次优化  有什么意见和建议 希望大家能够提出来 大家一起进步 真心感谢..!!!




C#发送邮件嵌入图片

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

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

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

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

.NET C# 发送邮件内容嵌入图片   例程一   邮件内容调用图片格式为: 发送邮件的服务端代码为: SmtpClient 发送邮件的对象 //代码省略 System.Net...

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

摘自:http://www.cnblogs.com/Areas/archive/2011/09/23/2186605.html 我们在发送邮件时,一般图片都是用网络路径,但有时如果接...
  • windxxf
  • windxxf
  • 2012年02月29日 11:19
  • 3141

Android 邮件cid内嵌资源(表情或图片)解析下载并替换img src路径

前言 嘿嘿,北京又下雨了,莫名的开心啊! 效果图 以表情为例演示下载cid内嵌资源到本地并替换html 中的img src:为本地路径,同时存储到数据库,下载进来则不用再进行下载,你看到c...

【正则表达式】C#正则表达式提取HTML中IMG标签的URL地址

一般来说一个 HTML 文档有很多标签,比如“”、“”、“”等,想把文档中的 img 标签提取出来并不是一件容易的事。由于 img 标签样式变化多端,使提取的时候用程序寻找并不容易。于是想要寻找它们就...
  • farcall
  • farcall
  • 2014年06月29日 23:29
  • 845

img图片标签alt和title属性的区别

alt是给搜索引擎识别,在图像无法显示时的替代文本;title是关于元素的注释信息,主要是给用户解读。当鼠标放到文字或是图片上时有title文字显示。(因为IE不标准)在IE浏览器中alt起到了tit...

H5 img标签图片无法显示 -- 解决方案

如果你也曾复制过一些类似腾讯、百度等各大网站的文章,你会发现黏贴下来发表之后经常出现图片无法显示,这是怎么出现的呢?例如: 解决方案使用Referer Meta标签控制referer,在H5...

css 图片有间隔多个Img标签之间的间隙

今天写css时发现,图片加起来刚好是900px的三张图片,不能在一个900px宽容器放下,因为图片之间有间隔,我猜是浏览器把两个img标签之间的空格当成了空白节点。 在网上找到了几个不错的解决方法:...

图片标签img中alt与title的区别

可能很多新手在做站内优化的时候,不明白图片标签img中alt与title的区别,今天sem学院就单独为大家整理分享一下其中的区别。   大家可以一起动手来做测试:把以下代码保存的文本中,命名为.ht...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C# 发送模板邮件并嵌入N张图片(优化) 以模版img标签为驱动
举报原因:
原因补充:

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