C#使用SmtpClient以内联方式发送带有图像的邮件

Kdg*_*Dev 38 c# inline smtpclient

SmtpClient()允许您在邮件中添加附件,但是如果您想在邮件打开时显示图像而不是附加它,该怎么办?

我记得,它可以使用大约4行代码完成,但我不记得我在MSDN网站上找不到它.

编辑:我没有使用网站或任何东西,甚至没有IP地址.图像位于硬盘上.发送时,它们应该是邮件的一部分.所以,我想我可能想要使用标签......但我不太确定,因为我的电脑没有广播.

Jam*_*ack 80

经常提到的一个解决方案是将图像添加Attachment到邮件中,然后使用引用在HTML邮件主体中引用它cid:.

但是,如果您使用该LinkedResources集合,内联图像仍然会显示正常,但不会显示为邮件的附加附件.这就是我们想要发生的事情,所以这就是我在这里所做的:

using (var client = new SmtpClient())
{
    MailMessage newMail = new MailMessage();
    newMail.To.Add(new MailAddress("you@your.address"));
    newMail.Subject = "Test Subject";
    newMail.IsBodyHtml = true;

    var inlineLogo = new LinkedResource(Server.MapPath("~/Path/To/YourImage.png"), "image/png");
    inlineLogo.ContentId = Guid.NewGuid().ToString();

    string body = string.Format(@"
            <p>Lorum Ipsum Blah Blah</p>
            <img src=""cid:{0}"" />
            <p>Lorum Ipsum Blah Blah</p>
        ", inlineLogo.ContentId);

    var view = AlternateView.CreateAlternateViewFromString(body, null, "text/html");
    view.LinkedResources.Add(inlineLogo);
    newMail.AlternateViews.Add(view);

    client.Send(newMail);
}
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案会AlternateView为您MailMessage的类型添加一个text/html.为了完整起见,您还应添加一种AlternateView类型text/plain,其中包含非HTML邮件客户端的纯文本版本的电子邮件.

  • 为了让我能够正常工作,我必须在创建LinkedResource("image/png")时包含MIME内容.我使用.Net 4.5 (4认同)
  • 这是一个很好的解决方案.感谢您添加它.我还建议添加如何使用Image元素.我使用带有LinkedResource的MemoryStream来管理它.工作得很好,...一旦我获得流后重置.Position属性! (2认同)
  • Server.MapPath -&gt; “服务器”在哪里定义? (2认同)

Laz*_*rus 13

HTML电子邮件和图像是附件,因此它只是通过内容ID引用图像的情况,即

    Dim A As System.Net.Mail.Attachment = New System.Net.Mail.Attachment(txtImagePath.Text)
    Dim RGen As Random = New Random()
    A.ContentId = RGen.Next(100000, 9999999).ToString()
    EM.Body = "<img src='cid:" + A.ContentId +"'>" 
Run Code Online (Sandbox Code Playgroud)

这里似乎有全面的示例:使用内嵌图像发送电子邮件


Bra*_*don 12

当你说4行代码时,你指的是这个吗?

System.Net.Mail.Attachment inline = new System.Net.Mail.Attachment(@"imagepath\filename.png");
inline.ContentDisposition.Inline = true;
Run Code Online (Sandbox Code Playgroud)