【问题标题】:How to create HTML email with embeded image and show it in the default mail client using .net (c#)?如何使用.net (c#) 创建带有嵌入图像的 HTML 电子邮件并在默认邮件客户端中显示它?
【发布时间】:2011-05-29 06:19:25
【问题描述】:

如果您查看 Windows 中的 Snip 工具,则可以选择在默认邮件客户端(我猜是 html 电子邮件)中将 snip 作为嵌入式附件发送。我正是需要这个。

目前我正在使用简单的 MAPI 附加图像,但不允许嵌入。

一个关键要求是它应该被创建然后显示在默认邮件客户端中。我认为我不能为此使用 System.Net.Mail。或者我可以吗?

它是一个使用 c# 的 WPF 应用程序。

编辑:请在回答之前仔细阅读问题。我对此并不陌生。我知道如何在非托管代码中做到这一点,而无需求助于黑客。我需要一个托管的等价物。我在寻找技巧,并且很乐意在必要时花大量时间在正确的解决方案上。

【问题讨论】:

  • 你试过我更新的答案了吗?

标签: c# .net email mapi email-client


【解决方案1】:

使用 Process.Start 和 ShellExecute 选项:

mailto:email@domain.com?subject=your+file&body=see attachment&attachment="C:\path\to\file.txt"

我不确定路径周围的引号。

编辑

刚刚想到另一个应该可行的解决方案。

  1. 使用MailMessage 创建 HTML 电子邮件
  2. 在此处使用answer 将其保存为XXXX.eml
  3. 使用 ShellExecute 选项和Process.Start打开 EML 文件。

它应该在默认的电子邮件客户端中打开它。

【讨论】:

  • 这会嵌入图像吗?我怀疑不是。
  • 嵌入在 HTML 电子邮件中的图像实际上是附件。
  • 是的,但您是否编写了 sn-p 代码创建带有嵌入图像的 HTML 电子邮件?
  • 抱歉被其他东西拖住了。还没有机会尝试这个。如果有效,会将其标记为答案。谢谢。
【解决方案2】:

我不认为你可以在 mailto 中嵌入图片 请参考RFC 2368。它说 mailto 目的仅用于短文本消息,而不用于 MIME 正文

   The special hname "body" indicates that the associated hvalue is the
   body of the message. The "body" hname should contain the content for
   the first text/plain body part of the message. The mailto URL is
   primarily intended for generation of short text messages that are
   actually the content of automatic processing (such as "subscribe"
   messages for mailing lists), not general MIME bodies.

【讨论】:

    【解决方案3】:

    我认为您可以使用命名空间 System.Net.Mail 中的类来完成这项工作。这需要相当多的工作。我将把它留作读者练习。

    根据RFC2111,带有嵌入图像的 HTML 电子邮件只是将 HTML 电子邮件正文和图像附件存储在两个不同的 MIME 内容中。

     From: foo1@bar.net
     To: foo2@bar.net
     Subject: A simple example
     Mime-Version: 1.0
     Content-Type: multipart/related; boundary="boundary-example-1";
                   type=Text/HTML
    
     --boundary-example 1
     Content-Type: Text/HTML; charset=US-ASCII
    
     ... text of the HTML document, which might contain a hyperlink
     to the other body part, for example through a statement such as:
     <IMG SRC="cid:foo4*foo1@bar.net" ALT="IETF logo">
    
     --boundary-example-1
     Content-ID: foo4*foo1@bar.net
     Content-Type: IMAGE/GIF
     Content-Transfer-Encoding: BASE64
    
     R0lGODlhGAGgAPEAAP/////ZRaCgoAAAACH+PUNvcHlyaWdodCAoQykgMTk5
     NSBJRVRGLiBVbmF1dGhvcml6ZWQgZHVwbGljYXRpb24gcHJvaGliaXRlZC4A
     etc...
    
     --boundary-example-1--
    

    关键在于,在您的 HTML 电子邮件正文中,您不是使用常规 URL 路径,而是输入“cid:xxxxx”,其中 xxxxx 是您的内容 ID。请查看RFC2111,了解有关 Content ID 的更多详细信息。从我在 System.Net.Mail 命名空间中看到的内容来看,它允许您创建一个将 IsBodyHtml 属性设置为 true 的 MailMessage。然后,您需要做的下一件事是将附件添加到此 MailMessage。附件当然是您嵌入的图像。然后,您需要记住设置附件的 ContentID。因此,为了确保您的 HTML 电子邮件引用了正确的 ContentID,一切都应该正常工作。

    同样,我自己并没有验证它,但我快速检查了一些嵌入图像的电子邮件。我确实看到了带有 cid:xxxx 作为图像源的电子邮件,我的 Outlook 客户端确实可以很好地打开它。

    【讨论】:

    • 您可以通过这种方式发送一封电子邮件(您需要一个 AlternateView),但您不能在默认邮件客户端中显示它, 由用户发送。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2010-10-23
    • 1970-01-01
    • 2019-02-02
    • 2017-04-01
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多