Hotmail (現 Outlook.com) 歷史上不提供標準郵件協定,但 Outlook Express 能直連,因為它使用微軟私有的 HTTPMail 協定——基於 HTTP/1.1 擴展的 WebDAV 實作。本文示範用 C# + MSXML2.XMLHTTP (COM) 實作收發信。
using MSXML2; // 需加入 COM 參考 "Microsoft XML, v6.0"
XMLHTTP _xmlHttp = new XMLHTTP();
優點:支援同步/非同步、自動處理重導向、Cookie、Basic/Digest 認證、自訂 HTTP Header。
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
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 (負載平衡),必須動態解析。
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);
}
}
}
public string DownloadMail(string mailUrl)
{
_xmlHttp.open("GET", mailUrl, false, null, null);
_xmlHttp.send(null);
return _xmlHttp.responseText; // 郵件原始內容 (RFC822/Multipart MIME)
}
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);
}
| 方案 | 適用性 | 說明 |
|---|---|---|
| Exchange Web Services (EWS) | 企業/Office 365 | 官方支援、功能完整 |
| Microsoft Graph API | Outlook.com / Office 365 | REST、OAuth2、現代標準 |
| IMAP/SMTP | Outlook.com 現已支援 | 標準協定、通用庫 |
| HTTPMail (本文) | Legacy Hotmail | 已棄用、不建議新專案使用 |