c语言outl函数,Outlook MAPI开发指南
0x00 前言
Outlook MAPI提供了一組訪問(wèn)Outlook的接口,用來(lái)擴(kuò)展Outlook應(yīng)用程序的開(kāi)發(fā),本文將會(huì)介紹Outlook MAPI的基本用法,開(kāi)源一份Outlook MAPI的實(shí)現(xiàn)代碼mapi_tool,便于后續(xù)的二次開(kāi)發(fā)。
0x01 簡(jiǎn)介
本文將要介紹以下內(nèi)容:
·基本知識(shí)
·使用Outlook MAPI訪問(wèn)Outlook資源
·開(kāi)源代碼mapi_tool
·mapi_tool功能介紹
·多種環(huán)境下的利用思路
0x02 基本知識(shí)
參考資料:
https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/outlook-mapi-reference
Outlook MAPI的使用前提:需要安裝Outlook客戶端。
Outlook MAPI同EWS的區(qū)別:
·Outlook MAPI用來(lái)訪問(wèn)Outlook客戶端中的資源
·EWS用來(lái)訪問(wèn)Exchange服務(wù)器中的資源
關(guān)于EWS的使用可以參考之前的文章《Exchange Web Service(EWS)開(kāi)發(fā)指南》。
Outlook客戶端中的用戶郵件存儲(chǔ)在后綴名為ost的文件中,和Exchange服務(wù)器中的數(shù)據(jù)庫(kù)保持一致
ost文件的默認(rèn)保存位置:%LOCALAPPDATA%\Microsoft\Outlook\
MAPI主要包括以下三個(gè)功能:
·Address Books,設(shè)置E-mail type、protocol等參數(shù)
·Transport,文件的發(fā)送和接收
·Message Store,發(fā)送接收等信息的處理
0x03 使用Outlook MAPI訪問(wèn)Outlook資源
1.安裝Outlook客戶端并配置參數(shù)
2.啟動(dòng)Outlook客戶端進(jìn)行用戶登錄
3.使用C Sharp開(kāi)發(fā)程序,實(shí)現(xiàn)讀取收件箱郵件的功能
參考資料:
https://docs.microsoft.com/en-us/dotnet/api/microsoft.office.interop.outlook?view=outlook-pia
https://docs.microsoft.com/en-us/office/vba/api/outlook.namespace
開(kāi)發(fā)環(huán)境:VS2015
新建工程,選擇控制臺(tái)應(yīng)用程序,引用文件:Microsoft.Office.Interop.Outlook.dll
注:
安裝Outlook客戶端后,可在C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Outlook\下獲得Microsoft.Office.Interop.Outlook.dll。
Microsoft.Office.Interop.Outlook.dll要同Outlook的版本保持一致。
Microsoft.Office.Interop.Outlook.dll的文件屬性-Details-Product name對(duì)應(yīng)支持Outlook的版本,Product version對(duì)應(yīng)具體的Outlook版本,如下圖:
Product version對(duì)應(yīng)具體的Outlook版本可參考:
https://docs.microsoft.com/en-us/Exchange/new-features/build-numbers-and-release-dates?redirectedfrom=MSDN&view=exchserver-2019
C Sharp代碼示例:
using System;
using Microsoft.Office.Interop.Outlook;
namespace ConsoleApplication3
{
class Program
{
static void Main(string[] args)
{
Microsoft.Office.Interop.Outlook.Application app = new Microsoft.Office.Interop.Outlook.Application();
Microsoft.Office.Interop.Outlook.NameSpace ns = app.GetNamespace("MAPI");
Microsoft.Office.Interop.Outlook.MAPIFolder inbox = ns.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderInbox);
Microsoft.Office.Interop.Outlook.Items items = inbox.Items;
Console.WriteLine("Size:" + inbox.Items.Count);
foreach (var item in items)
{
var mail = item as Microsoft.Office.Interop.Outlook.MailItem;
if (mail != null)
{
if(mail.UnRead==true)
Console.WriteLine("[+] UnRead Mail");
else
Console.WriteLine("[+] Mail");
Console.WriteLine("[*] Subject:" + mail.Subject);
Console.WriteLine("[*] From:" + mail.SenderName);
Console.WriteLine("[*] To:" + mail.To);
Console.WriteLine("[*] CC:" + mail.CC);
Console.WriteLine("[*] ReceivedTime:" + mail.ReceivedTime);
if(mail.Attachments.Count>0)
{
Console.WriteLine("[>] Attachments:" + mail.Attachments.Count);
Microsoft.Office.Interop.Outlook.Attachments attachments = mail.Attachments;
foreach (Microsoft.Office.Interop.Outlook.Attachment att in attachments)
{
Console.WriteLine(" Name:" + att.FileName);
}
}
Console.WriteLine("[*] Body:\r\n" + mail.Body);
Console.WriteLine("[*] OutlookVersion:" + mail.OutlookVersion);
Console.WriteLine("[*] EntryID:" + mail.EntryID);
}
}
}
}
}
代碼執(zhí)行后將會(huì)列舉收件箱中的郵件,輸出以下內(nèi)容:
·收件箱郵件個(gè)數(shù)
·是否已讀
·主題
·發(fā)件人
·收件人
·抄送
·接收時(shí)間
·附件名稱
·正文內(nèi)容
·Outlook版本
·EntryID
代碼執(zhí)行后,Outlook客戶端會(huì)彈出警告,如下圖:
選擇允許后,成功獲得收件箱信息,如下圖:
彈出警告的原因:當(dāng)前系統(tǒng)的防病毒軟件處于非活動(dòng)狀態(tài)或過(guò)期。
參考資料:
https://support.microsoft.com/en-us/help/3189806/a-program-is-trying-to-send-an-e-mail-message-on-your-behalf-warning-i
兩種關(guān)閉方法:
1.開(kāi)啟并更新防病毒軟件
2.修改注冊(cè)表關(guān)閉警告
注冊(cè)表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\
64位操作系統(tǒng)安裝32位Office的注冊(cè)表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\
注冊(cè)表項(xiàng):ObjectModelGuard,類型:REG_DWORD,值為2。
在使用時(shí)需要注意的細(xì)節(jié)如下:
1.引用的Microsoft.Exchange.WebServices.dll要與Outlook客戶端的版本保持一致
2.默認(rèn)配置下,部分操作不會(huì)彈出警告
例如:
·列出收件箱郵件個(gè)數(shù)
·列出郵件主題
·列出郵件接收時(shí)間
·列出郵件附件名稱
3.如果后臺(tái)沒(méi)有運(yùn)行Outlook客戶端
通過(guò)程序可讀取當(dāng)前Outlook客戶端中的資源,但是獲取資源后還會(huì)彈框提示要求輸入憑據(jù),如下圖:
如果選擇了記住憑據(jù),那么后續(xù)操作不會(huì)要求輸入憑據(jù),關(guān)于憑據(jù)的使用可以參考之前的文章。
0x04 開(kāi)源實(shí)現(xiàn)代碼mapi_tool
代碼地址:https://github.com/3gstudent/Homework-of-C-Sharp/blob/master/mapi_tool.cs
在編譯上面,為了增加通用性,代碼支持使用csc.exe進(jìn)行編譯,
支持.Net 3.5或更高版本,編譯命令:
C:\Windows\Microsoft.NET\Framework64\v3.5\csc.exe mapi_tool.cs /r:Microsoft.Office.Interop.Outlook.dll
or
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\csc.exe mapi_tool.cs /r:Microsoft.Office.Interop.Outlook.dll
為了便于測(cè)試,我上傳了Office2010下的Microsoft.Office.Interop.Outlook.dll和Office2013下的Microsoft.Office.Interop.Outlook.dll
在功能實(shí)現(xiàn)上,對(duì)是否彈出安全提示做了區(qū)分,
不會(huì)彈出安全提示的功能:
·獲得所有文件夾中的郵件長(zhǎng)度
·獲得配置信息,包括CurrentProfileName、ExchangeMailboxServerName、ExchangeMailboxServerVersion
·列出指定位置的郵件,包括郵件主題、接收時(shí)間、附件中的文件名稱和EntryID
·列出指定位置的未讀郵件,包括郵件主題、接收時(shí)間、附件中的文件名稱和EntryID
會(huì)彈出安全提示的功能:
·獲得配置信息,包括Account-DisplayName、Account-SmtpAddress、Account-AutoDiscoverXml、Account-AccountType
·獲得聯(lián)系人信息
·獲得GlobalAddress
·列出指定位置的郵件,包括郵件主題、發(fā)件人、收件人、抄送、接收時(shí)間、附件中的文件名稱、正文內(nèi)容、Outlook版本和EntryID
·列出指定位置的未讀郵件,包括郵件主題、發(fā)件人、收件人、抄送、接收時(shí)間、附件中的文件名稱、正文內(nèi)容、Outlook版本和EntryID
·保存指定郵件中的附件
在代碼開(kāi)發(fā)上,需要注意以下細(xì)節(jié):
1.保存附件時(shí)需要使用絕對(duì)路徑
2.獲得聯(lián)系人列表時(shí),數(shù)組開(kāi)始的位置為1,而不是0
3.獲得配置信息時(shí),數(shù)組開(kāi)始的位置為1,而不是0
0x05 多種環(huán)境下的利用思路
1.正在運(yùn)行Outlook客戶端
通過(guò)mapi_tool可以對(duì)Outlook客戶端的資源進(jìn)行訪問(wèn),某些操作有可能會(huì)彈出安全提示。
關(guān)閉安全提示的兩種方法:
·開(kāi)啟并更新防病毒軟件
·修改注冊(cè)表關(guān)閉警告
導(dǎo)出Outlook客戶端所有郵件信息的方法:
(1)獲得ost文件
ost文件的默認(rèn)保存位置:%LOCALAPPDATA%\Microsoft\Outlook\
無(wú)法直接復(fù)制,提示文件被占用。
可以使用Joe Bialek的NinjaCopy復(fù)制被占用的文件。
(2)將ost文件轉(zhuǎn)換成pst文件
工具有很多,這個(gè)提供一種:Advanced Exchange Recovery
(3)將pst文件導(dǎo)入Outlook客戶端
2.沒(méi)有啟動(dòng)Outlook客戶端
通過(guò)mapi_tool可以對(duì)Outlook客戶端的資源進(jìn)行訪問(wèn),某些操作有可能會(huì)彈出安全提示。
如果執(zhí)行需要同服務(wù)器進(jìn)行交互的操作,例如獲取配置信息,會(huì)彈框提示要求輸入憑據(jù),如果憑據(jù)管理器已經(jīng)存儲(chǔ)了對(duì)應(yīng)的憑據(jù),就不會(huì)彈框提示。
查看已保存憑據(jù)的命令:
cmdkey /list
導(dǎo)出Outlook客戶端所有郵件信息的方法:
(1)獲得ost文件
可直接復(fù)制ost文件。
(2)將ost文件轉(zhuǎn)換成pst文件
方法同上。
(3)將pst文件導(dǎo)入Outlook客戶端
方法同上。
0x06 小結(jié)
本文介紹了使用Outlook MAPI訪問(wèn)Outlook資源的方法,開(kāi)源代碼mapi_tool,便于后續(xù)的二次開(kāi)發(fā)。
總結(jié)
以上是生活随笔為你收集整理的c语言outl函数,Outlook MAPI开发指南的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 在PS2主机上使用OPL通过网络加载PC
- 下一篇: OSChina 周五乱弹 —— 程序猿真