2009-12-04 27 views
1

我想向用戶發送密碼電子郵件,但客戶想要在電子郵件中嵌入(內聯)圖像。如何使用c#aspx發送電子郵件的MIME數據

我創建了一封電子郵件,將數據保存到一個txt文件,在我讀取模板的代碼期間,但是當我發送它時,行結束被破壞,因此MIME數據被破壞。我剛剛得到= 3D

我在做什麼錯?

string FILENAME = Server.MapPath("~/GuestUserTemplate.txt"); 
    StreamReader objStreamReader = File.OpenText(FILENAME); 
    string sEmailTemplate = ""; 
    string input = null; 
    while ((input = objStreamReader.ReadLine()) != null) 
    { 
     sEmailTemplate = sEmailTemplate + input; 
    } 
    objStreamReader.Close(); 

    /* send an email */ 
    MailMessage msg = new MailMessage(); 
    msg.IsBodyHtml = true; 
    msg.To.Add(new MailAddress(sToEmail)); 
    msg.From = new MailAddress(sFromEmail); 
    msg.Subject = sEmailSubject; 
    msg.Body = sEmailTemplate; 
    //try 
    { 
     client.Send(msg); 
    } 
    //catch (Exception excm) 
    { 

    } 

只是做了更多的偵探工作。我發出的郵件有這樣的標題:

MIME-Version: 1.0 
Content-Type: text/html; charset=us-ascii 
Content-Transfer-Encoding: quoted-printable 

凡爲具有內嵌圖片的電子郵件有:

Content-class: urn:content-classes:message 
MIME-Version: 1.0 
Content-Type: multipart/related; 
    boundary="----_=_NextPart_001_01C9C98D.6552117E"; 
    type="multipart/alternative" 

看來我需要設置內容類型爲多部分,但我我不知道如何...

回答

2

我不太清楚你加載什麼樣的文字(並追加到什麼呢?),但我會建議你創建一個真正的模板,例如帶有佔位符的電子郵件文本將替換爲用戶名稱等

使用< IMG SRC = 「CID:logo.png」/ > - 在郵件的HTML體內嵌圖像(模板)。

然後,您將需要相應的圖像添加到MAILMESSAGE的LinkedResources收集,並設置其內容識別頭爲「Logo.png」或者無論你怎麼稱呼它。之後,發送郵件(根據郵件消息的結構自動爲您設置多部分內容類型)。

附::使用SendAsync()或郵件寫自己的SMTP服務器的本地拾取隊列,否則你綁你的ASP.NET輔助線程。連接到遠程的SMTP服務器/網絡服務等需要花費相當長的時間(與請求執行時間)和工作線程坐在那裏等待,無法服務於其他傳入的請求。

0

你應該使用System.Net.Mail。創建一個MailMessage,然後添加一個附件並使用SmtpClient發送。

+0

他想要的形象被內聯,而不是顯示爲附件,所以這是不行的。 – Oded 2009-12-04 15:08:43

0

檢查您的文本文件 - 它可能缺少預期的行結束(Cr + Lf)。

+0

使用程序員記事本我可以看到,行尾是CR + LF,就像你期望的那樣。我看不到重新編碼在哪裏...... – 2009-12-04 15:12:26

+0

它是一個ASCII文件嗎? .NET將在內部使用UTF-8。 – Oded 2009-12-04 15:13:48

+0

@Oded,很好的問題。程序員記事本報告其UTF-8 ...會電子郵件喜歡Unix行結束? – 2009-12-04 15:16:30

0

更改while循環從:

while ((input = objStreamReader.ReadLine()) != null) 
{ 
    sEmailTemplate = sEmailTemplate + input; 
} 

要:

sEmailTemplate = sEmailTemplate + objStreamReader.ReadToEnd(); 
+0

這只是給出了相同的結果。 – 2009-12-04 15:43:24

+0

你確定你的代碼正在拾取正確的文本文件嗎?它是否在根路徑上? – Oded 2009-12-04 15:48:09

+0

這是一個公平的問題。是的,我只是通過重命名來檢查。我只是讀= 3D是某種MIME編碼,我想知道模板是否正在編碼,因爲我將它設置爲消息正文? – 2009-12-04 15:52:36

-1

底線是,你不能用System.Net.Mail做到這一點。

這是您遇到的問題。

  1. 編碼。

    你的原始郵件是用quoted-printable編碼保存的(因此你看到的是「= 3D」)當你重新讀入這條消息時,它們會得到雙重編碼。正在使用編碼來保護SMTP傳輸過程中的消息。

  2. 邊界。

    創建消息時,標題中會使用邊界來告知郵件客戶端消息不同部分的邊界。您試圖對一條消息進行限制,並將它們合併爲一條新消息。由於System.Net.Mail沒有給你足夠的內部界限控制,所以你不能這樣做。

    如果要使用System.Net.Mail發送嵌入式圖像,則需要使用鏈接資源創建消息。下面是更多的鏈接:

http://systemnetmail.com/faq/4.4.aspx