通过代码在邮件中嵌入图片

在一个开发需求中需要将一张图片嵌入邮件中并发送出去。

正常的邮件发送代码(c#)如下:

MailMessage mail = new MailMessage(from, to, subject, emailBody);

如果需要邮件支持Html,需要将IsBodyHtml设置成true:mail.IsBodyHtml = true;

1.第一个想到的方式是在emailBody中添加<img scr="">标签,但如果收到邮件的用户无法访问scr中的资源链接,将会导致图片无法访问。

2.找到的第二种方式是data:image/png;base64,emailBody中的图片在浏览器中可以展示,但在outlook被屏蔽,无法查看。代码如下:

<img src="data:image/png;base64,RAAAtuhhx4dbgYKAAA7...more data....." alt="test">
string base64Str = Convert.ToBase64String(File.ReadAllBytes(@"C:\Temp\test.png"));

3.第三种方式,是使用“cid:”,基本可以满足需求。代码如下:

LinkedResource inline = new LinkedResource(@“C:\Temp\test.png”, MediaTypeNames.Image.Jpeg);
inline.ContentId = Guid.NewGuid().ToString();
string htmlBody = @"<img src=‘cid:" + inline.ContentId + @"‘ />";
AlternateView alternateView = AlternateView.CreateAlternateViewFromString(htmlBody, null, MediaTypeNames.Text.Html);
alternateView.LinkedResources.Add(inline);

MailMessage mail = new MailMessage(from, to);
mail.Subject = "subject";
mail.IsBodyHtml = true;
mail.AlternateViews.Add(alternateView);

SmtpClient smtp = new SmtpClient("127.0.0.1");
smtp.Send(mail);

实现中多出了两个概念LinkedResource和AlternateView。

LinkResouce表示电子邮件附件中嵌入的外部资源,比如图片。但此类资源不是以附件形式展示在邮件中。如需附件需要使用Attachment

AlternateView可以指定一个电子邮件的不同格式副本。

参考:

http://stackoverflow.com/questions/18358534/send-inline-image-in-email

https://sendgrid.com/blog/embedding-images-emails-facts/

时间: 2024-12-25 23:48:58

通过代码在邮件中嵌入图片的相关文章

如何在邮件中嵌入图片,而非上传在附件

刚接触OutLook使用公司的邮箱发邮件.问题来了,每次从本地目录 Ctrl+c 拷贝一个图片Ctrl+v到邮件正文,这个图片都会到了附件栏上.如下图: 产生这样的原因是因为直接复制的图片就是一个文档,只能保存到附件上. 要达到自己想要的结果,有两种方式可以把图片直接放到邮件正文上: 使用QQ截图打钩后,Ctrl+v能把截图的图片放在邮件正文上. 开一个空白word文档,把你要的图片使用CV大法(复制.粘贴)到word文档中,再选中word文档中的目标图片,CV大法到邮件正文上,这样的图片就不会

WPF代码引用Resouces中的图片

WPF引入了统一资源标识Uri(Unified Resource Identifier)来标识和访问资源.其中较为常见的情况是用Uri加载图像. Uri表达式的一般形式为:协议+授权+路径 协议:pack:// 授权:有两种.一种用于访问编译时已经知道的文件,用application:///.一种用于访问编译时不知道.运行时才知道的文件,用siteoforigin:///.在这里加载图片时,我们选用前者,即application:///,但是书写时候,我们一般用逗号代替斜杠,也就是改写作appl

postal邮件发送-邮件中带有图片

前言 上篇提到如果邮件中有图片的话,可以使用 @Html.EmbedImage("~/Content/postal.png") 这种方式,但是经过测试发现,在outlook中如果有该行代码,则会导致乱码问题,原因未知(有兴趣可研究下)... 后台以附件形式添加图片 下面提供另一种方式,解决outlook乱码问题,,, 后台代码,以附件的形式 public ActionResult SendImageEmail() { var emailService = new EmailServic

使用CKplayer插件在网页中嵌入视频的方法(常用笔记2)

在做网站中有时候我们需要在网页中嵌入视频,一般视频嵌入有以下几种方法: 1. 优酷代码嵌入 优点:简单,方便,可靠. 缺点:有广告,现在的网站非常注重用户体验,如果打开一个在线视频是有长广告的一定会崩溃的. 2. 利用<object>标签嵌入视频 优点:也比较方便,对于swf来说不错. 缺点:如果播放的是wmv格式,利用Chrome打开就搞笑了,有时候会提示你安装media player插件,有时候连个提醒都没有.也就是说跨浏览器的能力不足. 不同的视频格式还有不一样的代码,太繁琐. 3. 利

博客代码:iframe—网页中嵌入其他网页

iframe 是一个可以把另外一个网页嵌入到一个网页里的代码,非常有用.对于一个内容不错的网页,要方便地把它搬到自己的博客里,用这个代码最合适.而对于在新浪博客里不支持的一些网页效果和代码,可先把他们设置好,在支持他们的网站上使用,或上传到一个免费的网络空间或网络硬盘里,获取相应的网页地址,然后用 iframe嵌入到新浪博客里,非常好用! 一.固定位置的iframe代码: <DIV align=center><IFRAME src="http://weather.265.com

在博文中嵌入Javascript代码

今天吃饭时无聊,突然想到Markdown除了兼容HTML会不会也兼容Javascript,于是博文里除了码文插音乐还可以干点更好玩的事儿了,可以自动修改markdown文件本身,比如说自动修改从Github搬运过来的md文件中图片link或者图片格式之类的,于是在W3School找了一个JavaScript例子,果然. Markdown虽然弱,但他的世界开始变得有意思了. 点击灯泡来点亮或熄灭这盏灯 在博文中嵌入Javascript代码

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 选择调用的进程为 24 i386 getuid sys_getuid1647 i386 getgid sys_getgid16 使用库函数API方式 使用C代码中嵌入汇编代码方式

实验--使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用(杨光)

使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 攥写人:杨光  学号:20135233 ( *原创作品转载请注明出处*) ( 学习课程:<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 实验要求: 选择一个系统调用(13号系统调用time除外),系统调用列表参见http://codelab.shiyanlou.com/xref/linux-3.18.6/arch/x86/syscalls/sys

在smarty模板中嵌入php代码

我个人并不太喜欢smarty的语法,写起来比较啰嗦易出现匹配出错,但是旧项目中有许多工程都是采用它作模板.最近需要在此上稍微加一些PHP的内容,但我不想在模板控制层去一个一个assign,而想在模板文件中直接嵌入PHP的代码. 搜索了一下smarty中确实有直接使用PHP代码的标签,是 {php}//PHP语句 echo 'yes';{/php} 于是便用上它了.但注意这是默认的方式,如果你自定制了smarty标签的定界符,那么也得将{ 和 }进行相对应的改动. 我看到有些是用<?  ?>作定