zoukankan      html  css  js  c++  java
  • 使用C#发送正文带图片邮件

    转自:http://www.cnblogs.com/madyina/p/3332308.html

    最近有个地方用到正文带图片的邮件发送功能,由于发送邮件调用的是web service,要求正文必须是string,而接收方要能看到图片,还不能单纯的添加一个图片地址链接,查阅了很多资料,基本上都是从头写邮件发送类,以附件的形式上传图片然后替换这么个思路,不适合我目前的需求。思考了很久:不管是图片也好,文字也好还是其他的什么文件,在网路上传输肯定都是数据流,无非是到了目的地数据流每一段解析的方式不同而已,那么能不能将邮件发送数据看成是一个数据流,文字和图片都在里面呢?

          使用OUTLOOK发送了一个带图片的邮件,收到之后另存MHT分析其代码:

          发现带图片img标签的src属性后面是一大堆字符<img alt="" src="data:image/png;base64, SkZJRgABAQEAZA…" />,那这个"乱码"肯定就是图片了!

          再次查阅了一些资料得知邮件在网路上传输一般都要通过base 64编码,然后直接赋给src

    Data URI scheme是在RFC2397中定义的,目的是将一些小的数据,直接嵌入到网页中,从而不用再从外部文件载入。在上面的Data URI中,data表示取得数据的协定名称,image/png 是数据类型名称,base64 是数据的编码方法,逗号后面就是这个image/png文件base64编码后的数据。

          这就好办了,先实现将图片转换为"字符串"替换到那个位置不就OK了?

          base 64编码方法:

    Bitmap bmp = new Bitmap(Imagefilename);

    MemoryStream ms = new MemoryStream(); bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); byte[] arr = new byte[ms.Length]; ms.Position = 0; ms.Read(arr, 0, (int)ms.Length); ms.Close();

    String strbaser64 = Convert.ToBase64String(arr);

    Imagefilename是图片路径

    strbaser64是编码后的字符串

    然后写HTML邮件正文:

    <BODY style="MARGIN: 10px"><DIV><IMG src="data:image/png;base64, SkZJRgABAQEAZA…"> </IMG></DIV></BODY>

    将转换成为字符串的图片放到这个位置:下图是我在163信箱做的实验(注意要切换到HTML源码试图下)

    点击发送,然后过去收:

    发现已经还原成为图片了,初步实验成功。

    然后再试试使用代码发送,简单发送代码如下:

    System.Net.Mail.SmtpClient client = new System.Net.Mail.SmtpClient("smtp.163.com");

    client.UseDefaultCredentials = true;//设置为发送认证消息

    client.Credentials = new System.Net.NetworkCredential("用户名", "密码");//认证消息

    System.Net.Mail.MailMessage mess = new System.Net.Mail.MailMessage();

    mess.From = new System.Net.Mail.MailAddress("shiyeping@163.com", "发信人的名称");

    mess.To.Add(new System.Net.Mail.MailAddress("shiyeping@163.com", "收信人的名称"));

    mess.Subject = "主题";

    mess.IsBodyHtml = true;

    mess.Body = "HTML格式的正文";

    try

    {

    client.Send(mess);

    MessageBox.Show("发送成功完成");

    }

    catch (Exception ex)

    {

    MessageBox.Show(ex.Message);

    }

    正文用变量表示如下:

    string mailBody = "<BODY style="MARGIN: 10px"><DIV><IMG src="data:image/png;base64,/9j/4AAQSkZ….WRN6iXizpJL//Z"> </IMG></DIV></BODY> ";

     

    *注意转义

    发送成功之后再去邮箱就可以看到图片已经正常显示出来了:

  • 相关阅读:
    【SQL Server性能优化】SQL Server 2008之表压缩
    SQL Server 锁的排队机制
    通过DAC来连接SQL Server
    通过SQL Server的数据库邮件功能功能发送邮件
    【SQL 编程你也行】BOM按节点排序
    【SQL Server数据迁移】32位的机器:SQL Server中查询ORACLE的数据
    《女孩梦三十》
    在论坛中出现的比较难的sql问题:26(动态行专列+合并字符串、补足行数)
    【SQL Server高可用性】数据库镜像:同一台机器的两个不同实例上配置数据库镜像 + 另一台见证服务器
    【SQL Server高可用性】数据库复制:修改表结构、新增表、新增存储过程 会被复制到订阅服务器?
  • 原文地址:https://www.cnblogs.com/wangjiahong/p/3732660.html
Copyright © 2011-2022 走看看