如何使用 system.net.mail 发送非替代的多个部分

Posted

技术标签:

【中文标题】如何使用 system.net.mail 发送非替代的多个部分【英文标题】:How to send non-alternative multiple parts using system.net.mail 【发布时间】:2015-03-03 13:10:36 【问题描述】:

我的电子邮件包含多部分/混合正文,其中包含嵌套的多部分/相关部分以及 html 部分和相关图像部分。有没有办法将这些电子邮件构造为 System.Net.Mail 的 MailMessage 实例?

这不是一个替代视图问题。

    多部分/混合 1.1。多部分/相关 1.1.1。文本/html 1.1.2。图片/gif 1.2.多部分/相关 1.2.1。文本/html 1.2.2。图片/gif

1.1.1 与 1.1.2 相关。但它与 1.2.2 无关。 1.1.1 和 1.2.1 是单独的 html 正文。

我在下面粘贴了一条示例消息。

Message-ID: <mhtml-11@dsv.su.se>
Date: Wed, 04 Apr 2000 04:18:00 +0200
From: MHTML <mhtml@dsv.su.se>
MIME-Version: 1.0
To: mhtml@dsv.su.se
Subject: Test message no. 11
Content-Type: multipart/mixed; boundary="==boundary-2"

--==boundary-2
Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"
Content-Location: http://www.dsv.su.se/jpalme/mimetest/

Text displayed only to non-MIME-compliant mailers
--==boundary-1
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD><TITLE>Test message no. 11 first part</TITLE>
</HEAD>
<BODY>
<H1>This is test message no. 11 first HTML part</H1>

<H2>Here comes the red test image:</H2>
<IMG SRC="http://www.dsv.su.se/jpalme/mimetest/red-test-image.gif" 
BORDER=0 HEIGHT=32 WIDTH=117 ALT="red test image">

<P>This is the last line of this test message.
</BODY></HTML>

--==boundary-1
Content-Type: image/gif
Content-ID: <image1.mhtml-11@dsv.su.se>
Content-Location: http://www.dsv.su.se/jpalme/mimetest/red-test-image.gif
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="red-test-image.gif"

R0lGODlhdQAgAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+Z
zP+Zmf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8A
zP8Amf8AZv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZ
zMyZmcyZZsyZM8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wA
zMwAmcwAZswAM8wAAJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZ
zJmZmZmZZpmZM5mZAJlm/5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kA
zJkAmZkAZpkAM5kAAGb//2b/zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZ
zGaZmWaZZmaZM2aZAGZm/2ZmzGZmmWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YA
zGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZ
zDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNmMzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMA
zDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZ
zACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz/wAzzAAzmQAzZgAzMwAzAAAA/wAA
zAAAmQAAZgAAM+4AAN0AALsAAKoAAIgAAHcAAFUAAEQAACIAABEAAADuAADdAAC7AACqAACI
AAB3AABVAABEAAAiAAARAAAA7gAA3QAAuwAAqgAAiAAAdwAAVQAARAAAIgAAEe7u7t3d3bu7
u6qqqoiIiHd3d1VVVURERCIiIhEREQAAACH5BAAAAAAALAAAAAB1ACAAQAj/AP8JHEiwoMGD
CBMqXMiwocOGIyJKnEixosWLGDNq3MixY0aBFKuJrBZypMiIJ0ekrLhSpUmSKEdObMkSpsuY
OG/qTMnzJUWQHoMKHUq0KEagRpMqXaoUaU6dG2lKlOqRKtOkTq9q3VrV5sd/XMOKZZp1rNmz
GsuiXct2hNq2cMVmXdkzZ12LLe/ehYrXpsy/MPUGHvw04lzCdhFbzasYMd+aUxsnnrzTq1uw
cTN3tVrxrebPWDGDHr3UM+nTHE2jXn1RNevXEl3Dfi179urDJrte5BzVcknNhyNHZiyzJnGv
uWMuppu7uHLkyV1Kxe1ccOGZ0Cn/xshcu8/K2g2LQ8bJGPJj4eh3+/WNHb118PAtBn8aXTrn
6s7tl2QP9b399fhNN55tbe31FYEITlRbgqAtyCBwAz5I20MUVmjhhRgyFBAAOw==
--==boundary-1--
--==boundary-2
Content-Type: multipart/related; boundary="==boundary-1"; type="text/html"
Content-Location: http://www.dsv.su.se/jpalme/mimetest/

Text displayed only to non-MIME-compliant mailers
--==boundary-1
Content-Type: text/html; charset=us-ascii
Content-Transfer-Encoding: 7bit

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD><TITLE>Test message no. 11 second part</TITLE>
</HEAD>
<BODY>
<H1>This is test message no. 11 second HTML part</H1>

<H2>Here comes the yellow test image:</H2>
<IMG SRC="cid:image2.mhtml-11@dsv.su.se" BORDER=0 HEIGHT=32 WIDTH=152
ALT="yellow test image">

<P>This is the last line of this test message.
</BODY></HTML>

--==boundary-1
Content-Type: image/gif
Content-ID: <image2.mhtml-11@dsv.su.se>
Content-Transfer-Encoding: base64
Content-Disposition: inline; filename="yellow-test-image.gif"

R0lGODlhmAAgAPcAAP//////zP//mf//Zv//M///AP/M///MzP/Mmf/MZv/MM//MAP+Z//+Z
zP+Zmf+ZZv+ZM/+ZAP9m//9mzP9mmf9mZv9mM/9mAP8z//8zzP8zmf8zZv8zM/8zAP8A//8A
zP8Amf8AZv8AM/8AAMz//8z/zMz/mcz/Zsz/M8z/AMzM/8zMzMzMmczMZszMM8zMAMyZ/8yZ
zMyZmcyZZsyZM8yZAMxm/8xmzMxmmcxmZsxmM8xmAMwz/8wzzMwzmcwzZswzM8wzAMwA/8wA
zMwAmcwAZswAM8wAAJn//5n/zJn/mZn/Zpn/M5n/AJnM/5nMzJnMmZnMZpnMM5nMAJmZ/5mZ
zJmZmZmZZpmZM5mZAJlm/5lmzJlmmZlmZplmM5lmAJkz/5kzzJkzmZkzZpkzM5kzAJkA/5kA
zJkAmZkAZpkAM5kAAGb//2b/zGb/mWb/Zmb/M2b/AGbM/2bMzGbMmWbMZmbMM2bMAGaZ/2aZ
zGaZmWaZZmaZM2aZAGZm/2ZmzGZmmWZmZmZmM2ZmAGYz/2YzzGYzmWYzZmYzM2YzAGYA/2YA
zGYAmWYAZmYAM2YAADP//zP/zDP/mTP/ZjP/MzP/ADPM/zPMzDPMmTPMZjPMMzPMADOZ/zOZ
zDOZmTOZZjOZMzOZADNm/zNmzDNmmTNmZjNmMzNmADMz/zMzzDMzmTMzZjMzMzMzADMA/zMA
zDMAmTMAZjMAMzMAAAD//wD/zAD/mQD/ZgD/MwD/AADM/wDMzADMmQDMZgDMMwDMAACZ/wCZ
zACZmQCZZgCZMwCZAABm/wBmzABmmQBmZgBmMwBmAAAz/wAzzAAzmQAzZgAzMwAzAAAA/wAA
zAAAmQAAZgAAM+4AAN0AALsAAKoAAIgAAHcAAFUAAEQAACIAABEAAADuAADdAAC7AACqAACI
AAB3AABVAABEAAAiAAARAAAA7gAA3QAAuwAAqgAAiAAAdwAAVQAARAAAIgAAEe7u7t3d3bu7
u6qqqoiIiHd3d1VVVURERCIiIhEREQAAACH5BAAAAAAALAAAAACYACAAQAj/AP8JHEiwoMGD
CBMqXMiwocOHECMWmEixosWLGDNq3Mixo8ePIEN+FPixWrWKJlOenGgS5coCLWG+VKlSY0yW
NCnW1PkS482YQFcGxUlU5s6MJEUqXcq0qdOnGpNCnUq1qlWlUm0K7emz502qX0WGvTo1K9mz
aNOO7Wg2rdu3cDG2jUu3Ltm5dvPqZYp3r9+/G/u6/LmVp0vDMosO7Xo4sWPCGwmfTPm4cGXF
XC0KbowZcdHLiNd6Br3YcUbIpC0vLi33H+DXbo+G3Ay7tl7atnPHxa27N1revoNXBS68uFPi
xpOLRK68OVvXHFlfpIwz81PRHrGb9ku7tOyv4Kmnbu4avvxM8RbF50T//ajs1tnVW96OWnLO
015VW9def/791fPBFx9nBPbXGH/5RXaegqHp1xloz5XEVXsFogchfueZl55oBpp2n1H2ccSc
c4BJ59GIJKZYEYoqqshiiyS+CGNzEdVo44045qhjQwEBADs=
--==boundary-1--
--==boundary-2--

【问题讨论】:

【参考方案1】:

您可以使用一些免费库,查看 MailMessagesExamples.zip: http://www.lumisoft.ee/lswww/download/downloads/Examples/

或者谷歌其他图书馆。

Mime 相当复杂,从字符串中编写有效消息很困难,里面有一些 unicode 字符。

【讨论】:

我知道 lumisoft 的库。我看过其他开源的东西,比如 MimeKit。由于我的要求,我不得不开发自己的解析器。如果我能解决上面的这个问题,那就完美了。 我看不到 MailMessage 将允许解析或构造复杂的消息,所以你不能这样做。为什么您如此迫切地需要 MailMessage ?那你为什么不自己上课呢?如果您需要 SmtpClient 类,那么这是一个问题,但您可以编写自己的 SMTP 客户端,如果使用一些免费的可用库不是一个选项。

以上是关于如何使用 system.net.mail 发送非替代的多个部分的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 System.NET.mail 发送带有附件但没有任何纯文本正文的电子邮件?

如何使用 System.Net.Mail 设置退回地址?

如何在没有硬编码 NetworkCredentials 的情况下使用 System.Net.Mail?

使用 Gmail SMTP 和 System.Net.Mail 发送电子邮件 [重复]

通过 gmail 使用 System.Net.Mail 发送电子邮件

C#使用 System.Net.Mail发送邮件功能