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


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

    正常的邮件发送代码(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 est.png"));

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

    LinkedResource inline = new LinkedResource(@“C:Temp est.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/

  • 相关阅读:
    【杂谈】操作系统如何有效地掌控CPU
    【API知识】一种你可能没见过的Controller形式
    【详解】Tomcat是如何监控并删除超时Session的?
    【API知识】RestTemplate的使用
    【杂谈】Tomcat 之 Lifecycle接口
    【杂谈】FilterChain相关知识整理
    【杂谈】Remember-Me的实现
    【杂谈】没有公网IP的电脑如何与外部通信
    【杂谈】tocmat是何时写回响应数据报的
    js的class基础
  • 原文地址:https://www.cnblogs.com/dingtingli/p/5092500.html
Copyright © 2020-2023  润新知