2011-08-11 194 views
0

我正在使用Rohit Joshi's IMAP library訪問IMAP電子郵件帳戶。IMAP編碼電子郵件

到目前爲止,我有一個程序連接到郵件服務器,檢索所有未讀郵件並將它們保存在XML文件中。我的問題是,一些消息回來可讀,一些回捲編碼,無法閱讀。

讀:

<Part ID="1"> 
- <Part ID="1.1"> 
    <DATA>Please respond if you receive this =20 Thanks =20 =20 *******=20 *************=20 =20 </DATA> 

不可讀:

<Part ID="1"> 
    <DATA>SGVsbG8gRGVhbGVyIENhciBTZWFyY2gsCgogV2UgaGF2ZSBiZWVuIHJlcXVlc3RlZCBieSBMT1cg Q09VTlRSWSBNT1RPUlMgdG8gcmVjZWl2ZSB0aGVpciB2ZWhpY2xlCmludmVudG9yeSBkYXRhIGZy b20geW91IGZvciBFdmVyeUNhckxpc3RlZC5jb20uCiBEYXRhIHNob3VsZCBiZSBzZW50IHRvIHlv dXIgRE1pIERhdGEgJiBNZWRpYSBTdG9yZSAoYWthIC0gRGVhbGVyIFBvcnRhbCkKZnRwIGFjY291 bnQuCgogKioqKiogKioqKioKCiAqKiogKioqCgogSWYgcG9zc2libGUsIHBsZWFzZSBzZW5kIGFs bCBhdmFpbGFibGUgdmVoaWNsZSBpbnZlbnRvcnkgZGF0YSBhdCB0aGlzCnRpbWUuIFRoaXMgd2ls bCBhbGxvdyB1cyB0byBlbnN1cmUgYW55IGZ1dHVyZSBhZGp1c3RtZW50cyB0byB0aGUgZGF0YSB3 ZQpleHBvcnQgYXJlIGVhc2lseSBhY2NvbXBsaXNoZWQgd2l0aG91dCBoYXZpbmcgdG8gcmVxdWVz dCBhIGNoYW5nZSB0byB5b3VyCmV4cG9ydC4gUGxlYXNlIGRvIG5vdCBzZW5kIGltYWdlcyB1bmxl c3MgaW1hZ2VzIGFyZSByZXF1ZXN0ZWQgYmVsb3cuCgogRGVhbGVyIFBvcnRhbCBJRDogRFAzNzgy NQogTE9XIENPVU5UUlkgTU9UT1JTCiAxIEJsdWZmdG9uIFJkLgogQmx1ZmZ0b24sIFNDIDI5OTEw CgoKIENvbnRhY3QgSW5mb3JtYXRpb24gb24gUmVjb3JkCiBDb250YWN0IE5hbWU6IE1pa2UgQ29k eQogQ29udGFjdCBQaG9uZTogODQzLTgxNS01MTAwCiBDb250YWN0IEUtTWFpbDogbG93Y291bnRy eW1vdG9yc0B5YWhvby5jb20KCiBSZXF1ZXN0aW5nIFByb2plY3Q6IEV2ZXJ5Q2FyTGlzdGVkLmNv bQogSW1hZ2VzIFJlcXVlc3RlZDogKipZZXMqKgogRXhwb3J0IFdlYnNpdGU6IGV2ZXJ5Y2FybGlz dGVkLmNvbQoKIFdoaWxlIHRoZSBkYXRhIGlzIGluaXRpYWxseSByZXF1ZXN0ZWQgZm9yIEV2ZXJ5 Q2FyTGlzdGVkLmNvbSwgdGhlIGRhdGEKbWF5IHBvdGVudGlhbGx5IGJlIHNlbnQgdG8gYW55IHBy b2plY3Qgc2VydmljZWQgYnkgb3VyIERhdGEgJgpNZWRpYSBTdG9yZQplbnZpcm9ubWVudCBpbiB0 aGUgZnV0dXJlLgoKIElmIHBvc3NpYmxlIHBsZWFzZSBsZXQgdXMga25vdyB3aGVuIHdlIHNob3Vs ZCBleHBlY3QgZGF0YSBmb3IgdGhpcwpkZWFsZXJzaGlwLgogVGhhbmsgeW91LAoKIERpZ2l0YWwg TW90b3J3b3JrcywgSW5jLgogRGF0YSAmIE1lZGlhIFN0b3JlL0RlYWxlciBQb3J0YWwgL1RoaXJk IFBhcnR5IFN1cHBvcnQKW0xJTks6IG1haWx0bzp0aGlyZHBhcnR5c3VwcG9ydEBkaWdpdGFsbW90 b3J3b3Jrcy5jb21dCnRoaXJkcGFydHlzdXBwb3J0QGRpZ2l0YWxtb3RvcndvcmtzLmNvbQogKDUx MikgNDkzLTg4MzMKClRoaXMgbWVzc2FnZSBhbmQgYW55IGF0dGFjaG1lbnRzIGFyZSBpbnRlbmRl ZCBvbmx5IGZvciB0aGUgdXNlIG9mIHRoZSBhZGRyZXNzZWUgYW5kIG1heSBjb250YWluIGluZm9y bWF0aW9uIHRoYXQgaXMgcHJpdmlsZWdlZCBhbmQgY29uZmlkZW50aWFsLiBJZiB0aGUgcmVhZGVy IG9mIHRoZSBtZXNzYWdlIGlzIG5vdCB0aGUgaW50ZW5kZWQgcmVjaXBpZW50IG9yIGFuIGF1dGhv cml6ZWQgcmVwcmVzZW50YXRpdmUgb2YgdGhlIGludGVuZGVkIHJlY2lwaWVudCwgeW91IGFyZSBo ZXJlYnkgbm90aWZpZWQgdGhhdCBhbnkgZGlzc2VtaW5hdGlvbiBvZiB0aGlzIGNvbW11bmljYXRp b24gaXMgc3RyaWN0bHkgcHJvaGliaXRlZC4gSWYgeW91IGhhdmUgcmVjZWl2ZWQgdGhpcyBjb21t dW5pY2F0aW9uIGluIGVycm9yLCBwbGVhc2Ugbm90aWZ5IHVzIGltbWVkaWF0ZWx5IGJ5IGUtbWFp bCBhbmQgZGVsZXRlIHRoZSBtZXNzYWdlIGFuZCBhbnkgYXR0YWNobWVudHMgZnJvbSB5b3VyIHN5 c3RlbS4K </DATA> 

這裏是我的代碼。任何幫助,我需要做什麼來獲得電子郵件的可讀性,將不勝感激。

//Connect to the Mail Server 
Imap oImap = new Imap(); 
oImap.Login(ConfigurationSettings.AppSettings["emailServer"], ConfigurationSettings.AppSettings["emailUser"], ConfigurationSettings.AppSettings["emailPass"]); 

//Select the INBOX Folder 
oImap.SelectFolder("INBOX"); 

//Get all Unread messages 
ArrayList msgList = new ArrayList(); 
string[] searchData = new string[1]; 
searchData[0] = "unseen"; 

oImap.SearchMessage(searchData, false, msgList); 

MemoryStream stm = new MemoryStream(); //using a memory stream buffer for XmlTextWrite to write 
XmlTextWriter oXmlWriter = new XmlTextWriter(stm, System.Text.Encoding.UTF8); 
oXmlWriter.Formatting = Formatting.Indented; 
oXmlWriter.WriteStartDocument(true); 
oXmlWriter.WriteStartElement("Emails"); 

for (int i = 1; i < msgList.Count; i++) 
{     
    oXmlWriter.WriteStartElement("Message"); 
    oXmlWriter.WriteAttributeString("UID", msgList[i].ToString()); 

    try 
    { 
     oImap.FetchMessage(msgList[i].ToString(), oXmlWriter, true);   
    } 
    catch (Exception e) 
    { 
    } 

    oXmlWriter.WriteEndElement();     
} 
oXmlWriter.WriteEndElement(); 
oXmlWriter.WriteEndDocument(); 
oXmlWriter.Flush(); 

stm.Seek(0, SeekOrigin.Begin); //have to move the offset to zero to read from the beginning of the memory stream 

XmlTextReader xr = new XmlTextReader(stm); 
XmlDocument xmldoc = new XmlDocument(); 
xmldoc.Load(xr); 
stm.Flush(); 
xr.Close(); 
stm.Close(); 
oXmlWriter.Close(); 
oXmlWriter = null; 

xmldoc.Save("email.xml"); 
Console.WriteLine(xmldoc.ToString()); 

oImap.LogOut(); 

回答

1

該文本在Base64中編碼。你可以使用下面的函數對其進行解碼:

public string DecodeBase64(string s) 
{ 
    byte[] buf = Convert.FromBase64String(s); 
    return System.Text.Encoding.UTF8.GetString(buf); 
} 

還要注意的是,電子郵件包含換行符這不是一個Windows格式,但你可以解決這樣的:

resultStr = DecodeBase64(emailStr).Replace("\n", System.Environment.NewLine); 
+0

是啊,而已。但是@ jkruer01注意到電子郵件也可以包含很多其他的MIME類型,所以這個解決方案不適用於* all *消息,只是Base64編碼的消息。 – ewall

+1

確實!但是,在不瞭解他用於IMAP訪問的組件的情況下,很難說他應該如何去做這些改變。 –