首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

C# 直連 Hotmail:HTTPMail/WebDAV 協定與 XMLHTTP 實作全解析

     編輯:關於C#

背景:Hotmail 無 POP3/SMTP 支援

Hotmail (現 Outlook.com) 歷史上不提供標準郵件協定,但 Outlook Express 能直連,因為它使用微軟私有的 HTTPMail 協定——基於 HTTP/1.1 擴展的 WebDAV 實作。本文示範用 C# + MSXML2.XMLHTTP (COM) 實作收發信。

核心元件:MSXML2.XMLHTTP


using MSXML2; // 需加入 COM 參考 "Microsoft XML, v6.0"

XMLHTTP _xmlHttp = new XMLHTTP();

優點:支援同步/非同步、自動處理重導向、Cookie、Basic/Digest 認證、自訂 HTTP Header。

步驟 1:連線 HTTPMail 閘道並取得資料夾 URL


string gateway = "https://services.msn.com/svcs/hotmail/httpmail.asp";
string user = "your@hotmail.com", pwd = "password";

// PROPFIND 取得資料夾屬性
string propfind = @"

  
    
    
  
";

_xmlHttp.open("PROPFIND", gateway, false, user, pwd);
_xmlHttp.setRequestHeader("Content-Type", "text/xml");
_xmlHttp.send(propfind);

string response = _xmlHttp.responseText;
// 解析 XML 取得 inboxUrl、sendUrl

步驟 2:解析 XML 回應 (XmlTextReader)


string inboxUrl = null, sendUrl = null;
using (var reader = new StringReader(response))
using (var xml = new XmlTextReader(reader))
{
    while (xml.Read())
    {
        if (xml.NodeType == XmlNodeType.Element)
        {
            if (xml.Name == "hm:inbox") { xml.Read(); inboxUrl = xml.Value; }
            else if (xml.Name == "hm:sendmsg") { xml.Read(); sendUrl = xml.Value; }
        }
    }
}

每次登入會取得不同的伺服器 URL (負載平衡),必須動態解析。

步驟 3:列舉收件箱郵件清單


string query = @"

  
    
  
";

_xmlHttp.open("PROPFIND", inboxUrl, false, null, null); // 已認證,無需再傳帳密
_xmlHttp.send(query);
string folderXml = _xmlHttp.responseText;

// 解析每封信基本資訊
var mails = new List();
using (var reader = new StringReader(folderXml))
using (var xml = new XmlTextReader(reader))
{
    MailItem current = null;
    while (xml.Read())
    {
        if (xml.NodeType == XmlNodeType.Element)
        {
            if (xml.Name == "D:response") current = new MailItem();
            else if (xml.Name == "D:href") { xml.Read(); current.Url = xml.Value; }
            else if (xml.Name == "hm:read") { xml.Read(); current.IsRead = xml.Value == "1"; }
            else if (xml.Name == "m:from") { xml.Read(); current.From = xml.Value; }
            else if (xml.Name == "m:subject") { xml.Read(); current.Subject = xml.Value; }
            // ... 其他欄位
        }
        else if (xml.NodeType == XmlNodeType.EndElement && xml.Name == "D:response")
        {
            if (current != null) mails.Add(current);
        }
    }
}

步驟 4:下載完整郵件內容 (GET)


public string DownloadMail(string mailUrl)
{
    _xmlHttp.open("GET", mailUrl, false, null, null);
    _xmlHttp.send(null);
    return _xmlHttp.responseText; // 郵件原始內容 (RFC822/Multipart MIME)
}

步驟 5:發送郵件 (POST 到 sendmsg URL)


public void SendMail(string from, string fromName, string to, string subject, string body)
{
    string msg = $"MAIL FROM:<{from}>\r\nRCPT TO:<{to}>\r\n\r\n" +
                 $"From: \"{fromName}\" <{from}>\r\n" +
                 $"To: <{to}>\r\n" +
                 $"Subject: {subject}\r\n" +
                 $"Date: {DateTime.Now:ddd, dd MMM yyyy HH:mm:ss} +0000\r\n\r\n" +
                 body;

    _xmlHttp.open("POST", sendUrl, false, null, null);
    _xmlHttp.setRequestHeader("Content-Type", "message/rfc821");
    _xmlHttp.send(msg);
}

現代替代方案

總結

HTTPMail 是 WebDAV 在郵件領域的應用,透過 PROPFIND/GET/POST 操作資源。雖然 Hotmail 早已轉型支援標準協定,但理解此架構有助於掌握 WebDAV、XMLHTTP、同步非同步 HTTP 程式設計核心概念。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
方案適用性說明
Exchange Web Services (EWS)企業/Office 365官方支援、功能完整
Microsoft Graph APIOutlook.com / Office 365REST、OAuth2、現代標準
IMAP/SMTPOutlook.com 現已支援標準協定、通用庫
HTTPMail (本文)Legacy Hotmail已棄用、不建議新專案使用