最近有个地方用到正文带图片的邮件发送功能,由于发送邮件调用的是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> ";

*注意转义

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

同样道理,如果要在邮件正文里面加一个视频?FLASH 动画?声音?…?

我没试,如果你有兴趣可以试试,我只是推理!

附测试代码下载:点击下载

使用C#发送正文带图片邮件的更多相关文章

  1. java发送内嵌图片邮件

    前言: 博客系统中需要邮件服务的功能,以前写过类似的功能,不过功能太简单了,仅仅是发送文本内容,现在尝试一下发送内嵌图片邮件! 准备工作: 请参考:http://www.cnblogs.com/huj ...

  2. 邮件实现详解(四)------JavaMail 发送(带图片和附件)和接收邮件

    好了,进入这个系列教程最主要的步骤了,前面邮件的理论知识我们都了解了,那么这篇博客我们将用代码完成邮件的发送.这在实际项目中应用的非常广泛,比如注册需要发送邮件进行账号激活,再比如OA项目中利用邮件进 ...

  3. delphi发送html带附件邮件

    var html: TIdText; begin if not SMTP.Connected then SMTP.Disconnect(); try SMTP.Connect; try if SMTP ...

  4. 在Linux命令行下发送html格式的邮件

    在Linux利用formail+sendmail来发送带图片的邮件 formail接收html格式的文件作为邮件的内容,这样就可以解决发送带图片邮件的问题了,因为html中可以插入图片,只要给出的im ...

  5. java带图片的邮件发送方法实现

    package sendEmail; import java.util.Properties; import javax.activation.DataHandler; import javax.ac ...

  6. [Java] JavaMail 发送带图片的 html 格式的邮件

    JavaMail 发送的邮件正文和附件是相互独立的,但是内置图片需要定位图片在正文中的位置,所以内置图片和邮件正文是互相依赖的. 发送带附件的邮件可参考JavaMail 发送 html 格式.带附件的 ...

  7. Django发送带图片和附件的邮件

    最近需要做集团的SRC系统.暂无安全研发,所以只能找我这个小菜兼职开发.系统使用Django框架,在整个过程中,有许多奇特的需求.在某项需求中,需要给厂商用户发送富文本邮件,漏洞详情,这个折腾了一下, ...

  8. 接口测试基础——第3篇smtplib发送带图片的邮件

    smtplib发送邮件最后一篇,发送带图片的邮件: 大家可以去廖雪峰的网站看一下,下面的代码就是我跟着博客写的,哈哈,大家即使不明白为什么,也要多写两遍,记在心里,如果有不明白的地方可以留言,船长会第 ...

  9. 带有附件及图片正文的JavaMail邮件发送

    1 package javamail; 2 3 import java.io.UnsupportedEncodingException; 4 import java.util.Properties; ...

随机推荐

  1. myeclipse下安装svn

    在网上查了一下,安装的方法有几种,这里给大家推荐一种快速安装的方法. //第一步 : 下载 site-1.6.5.zip //===================================== ...

  2. BZOJ4060 : [Cerc2012]Word equations

    首先通过hash建树 设f[i][j]表示第i个特殊符号从P的第j位开始匹配能到达哪里 记忆化搜索,对于底层贪心匹配. #include<cstdio> #include<cstri ...

  3. BZOJ3830 : [Poi2014]Freight

    首先为了保证发车时间都不同,T[i]=max(T[i],T[i-1]+1) 然后设f[i]表示前i列车回来的最早时刻 f[i]=min(max(T[i],f[j]+i-j-1)+s*2+i-j-1) ...

  4. HDU 1010 (DFS搜索+奇偶剪枝)

    题目链接:  http://acm.hdu.edu.cn/showproblem.php?pid=1010 题目大意:给定起点和终点,问刚好在t步时能否到达终点. 解题思路: 4个剪枝. ①dep&g ...

  5. 转:10条建议让你创建更好的jQuery插件

    在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以 copy & paste 大部分的代码结构,只要专注最主要的逻辑代码就行了.使 ...

  6. CSS一些总结

    1. display block:块元素,默认宽度为100%,可以设置元素的宽高,默认占满一行.块元素包括div,h1-h6,form,table,ul,ol等: inline:行内元素,默认宽度为内 ...

  7. Java中实现文件上传下载的三种解决方案

    第一点:Java代码实现文件上传 FormFile file=manform.getFile(); String newfileName = null; String newpathname=null ...

  8. 静态页分页功能js代码

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. iOS移动开发周报-第22期

    iOS移动开发周报-第22期 [摘要]:本期iOS移动开发周报带来如下内容:苹果股价创新高,iOS8自动调整UITableView布局,Swift学习心得等. 新闻 <苹果股价创新高 市值全球第 ...

  10. cvSave in VS2010 or Linux

    cvSave这个函数是OpenCV中用来保存某个数据类型到文件中常用的函数,它原本共有五个参数,但是在VS2010中只需要填前两个,而在Linux必须填满五个,否则会出错,如下: // VS2010 ...