2

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

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

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

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

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

4

3 回答 3

4

我不认为您可以在 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.
于 2010-12-22T07:50:16.707 回答
3

在此使用 Process.Start 和 ShellExecute 选项:

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

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

编辑

只是想到了另一个应该可行的解决方案。

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

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

于 2010-12-22T07:27:08.210 回答
0

我认为您可以使用命名空间 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。有关 Content ID 的更多详细信息,请查看RFC2111。根据我在 System.Net.Mail 命名空间中看到的内容,它允许您创建一个将 IsBodyHtml 属性设置为 true 的 MailMessage。然后,您需要做的下一件事是将附件添加到此 MailMessage。附件当然是您嵌入的图像。然后,您需要记住设置附件的 ContentID。因此,为了确保您的 HTML 电子邮件引用了正确的 ContentID,这些东西应该可以正常工作。

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

于 2010-12-22T07:53:51.590 回答