2011-08-29 32 views
3

我需要通過電子郵件在html中發送一些文本。但我需要做的不是在電子郵件正文中,而是在附件中。我用這個代碼段,形成一個附件:如何在附件中發送html?

public MailMessage GetMailMessage(string @from) 
{ 
    var m = new MailMessage(new MailAddress(@from), new MailAddress(_to)) {Subject = _subj}; 
    var attach = new Attachment(new MemoryStream(
     Encoding.UTF8.GetBytes(_htmlAttach)), _subj + ".html", MediaTypeNames.Text.Html); 
    attach.ContentDisposition.Inline = false; 
    attach.ContentType.Name = _subj + ".html"; 
    m.Attachments.Add(attach); 
    return m; 
} 

但是,當我發這樣的郵件到我的Gmail郵箱我在文本收到一個純文本消息水木清華這樣的:

\ =?utf-8?B?dDlDd0lOQy8wTFhSZ05DNDBMN1F0Q0F4Pz0NCiA9P3V0Zi04P0I/TXpv?=\ \ =?utf- 
8?B?ME5pQXlPUzR3T0M0eU1ERXhJQzBnTVRRNk1qQWdNamt1TURndU1qQXhN?=\ \ =?utf-8?B?UzVvZEcxcz89?=" 
Content-Transfer-Encoding: base64 Content-Disposition: attachment 
PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VO 
IiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+DQo8aHRt 
bCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9 ImVuIj4NCjxoZWFkPg0KI 

什麼在附件中發送html文件是否正確? Thnx提前。

UPD:這裏是原始郵件的一部分:

MIME-Version: 1.0 
From: <[email protected]> 
To: [email protected] 
Date: Mon, 29 Aug 2011 03:29:05 -0700 (PDT) 
Subject: xxx 
Content-Type: multipart/mixed; boundary=--boundary_0_c99e5172-1766-4cfe-a6e0-7f6b0fa11061 
----boundary_0_c99e5172-1766-4cfe-a6e0-7f6b0fa11061 
Content-Type: text/plain; charset=us-ascii 
Content-Transfer-Encoding: quoted-printable 


----boundary_0_c99e5172-1766-4cfe-a6e0-7f6b0fa11061 
Content-Type: text/html; 
name="=?utf-8?B?PT91dGYtOD9CPzBLUFFzdEMxMExUUXZ0QzgwTHZRdGRDOTBMalF0U0RR?=\ 
\ 

=?utf-8?B?dDlDd0lOQy8wTFhSZ05DNDBMN1F0Q0F4Pz0NCiA9P3V0Zi04P0I/TXpv?=\ 
\ 

=?utf-8?B?ME5pQXlPUzR3T0M0eU1ERXhJQzBnTVRRNk1qQWdNamt1TURndU1qQXhN?=\ 
\ 
=?utf-8?B?UzVvZEcxcz89?=" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment 

然後就以base64文本:

PCFET0NUWVBFIGh0bWwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEvL0VO 
IiAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+DQo8aHRt 
bCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgeG1sOmxhbmc9 
ImVuIj4NCjxoZWFkPg0KICAgIDxtZXRhIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hh 

而在最後:

----boundary_0_c99e5172-1766-4cfe-a6e0-7f6b0fa11061-- 
+0

文件名看起來不對。 「Content-Type:text/html;」後面是否有換行符?你的樣本中的反斜槓,它們是字面的嗎?他們不應該在那裏。在反斜槓後換行符。最後,文件名看起來像是RFC2047編碼的多次傳遞;第一個短語解碼爲以'=?utf-8?B?'開始的內容......' – tripleee

+0

這是**解碼的**文件名:= = utf-8?B?0KPQstC10LTQvtC80LvQtdC90LjQtSDQt9CwINC/0LXRgNC40L7QtCAx?= = ?utf-8?B?Mzo0NiAyOS4wOC4yMDExIC0gMTQ6MjAgMjkuMDguMjAxMS5odG1s?='(sic!)解碼後得到'Уведомлениезапериод13:46 29.08.2011 - 14:20 29.08.2011.html'。至少應該去掉雙重編碼。 – tripleee

回答

0

,而不是把字節放入內存流中爲什麼不放置文本?

我想你可以使用new Attachment()的另一個重載並以另一種方式指定內容。

如果您已經有一個文件存儲在某處,您可以附加該文件,或者您可以使用StreamReader/TextReader組合來確保將文本數據而不是二進制數據壓入attachmentz內容。

+0

我正在使用流,因爲沒有其他方式可以動態創建附件的內容。 'new Attachment()'的其他重載可以從文件中獲取內容,而不是從字符串獲取內容。 –

0

使用SevenBit(最多1000個字符!)或QuotedPrintable作爲TransferEncoding作爲附件。

+0

@Downvoter,你能評論嗎? – Lucero

+0

只是試圖。還是我的電子郵件是沒有附件,看起來像這樣: '\ = UTF-的8B dDlDd0lOQy8wTFhSZ05DNDBMN1F0Q0F4Pz0NCiA9P3 V0Zi04P0I/T0Rv = \ \ = UTF-的8B eU9DQXlOUzR3T0M0eU 1ERXhJQzBnTVRnNk1qZ2dNekF1TURndU1qQXhN = \ \ =????????? 「Content-Transfer-Encoding: quoted-printable Content-Disposition:attachment = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0D = 0A = 0D = 0D = = 0A = = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0A = 0D = 0A' –

1

看起來你缺少生成部分之間的換行符。所以你需要放入類似"To: " + newMailAddress(to) + "\n"等。你還需要構建容器的MIME結構。如果您沒有任何實際的信息,只需將HTML作爲單一身體部分發送,而不是作爲「附件」。像您粘貼此

From: me <[email protected]> 
To: you <[email protected]> 
Subject: here 
MIME-Version: 1.0 
Content-type: text/html; name="=?utf-8?q?really_bewildering?= 
    =?utf-8?q?_long_name.html?=" 
Content-Transfer-Encoding: base64 
Content-Disposition: attachment; filename="=?utf-8?q?really_bewildering?= 
    =?utf-8?q?_long_name.html?=" 

PCFET0NUWVBFIGh0bWwgUFVCTElDICItL ... 

示例消息,其移動包裹體的單部分多部分/相關結構的內部,一些是完全等價的。

我相信Content-Disposition中的filename =部分是放置文件名的正確位置,但爲了與非常老的客戶端向後兼容,最好將它放在兩個位置。

請注意包裝長標題行的正確方法:在換行符之前不應該有反斜槓;相反,用至少一個空格字符縮進後續行。標題中不應該有空行(空行是將標題與正文分開的;因此,錯誤標題中的第一個空行將其餘標題壓入正文)。

什麼地方的base64編碼?除非您的文檔在8位內容上很繁重,否則如果您使用quoted-printable,它可能更小,更易於調試。您會注意到我將文件名更改爲quoted-printable,以方便閱讀;你也可以對實際附件的內容也做同樣的事情。

更新:添加內容 - 處置和文件名稱以及以下注釋示例消息。

強調:直接的問題是您在MIME頭文件中不正確地包裝多行文件名。

+0

看看原始的電子郵件消息, 。我需要發送附件中的html,因爲它可能非常大。 –

+0

添加更多的MIME結構會使郵件變大而不是變小。在問題中粘貼的內容顯然缺少標題和換行符。也許你需要使用'\ r \ n',而不是僅僅使用'\ n'(SMTP需要DOS風格的行結尾,但許多MTA會接受平臺本地行結束約定的輸入)。 – tripleee

+0

實際上文件名應該根據[RFC5987](https://tools.ietf.org/html/rfc5987)正確編碼,但這是切線,所以我沒有更新答案。另見http://stackoverflow.com/a/6745788/874188 – tripleee

相關問題