c语言outl函数,Outlook MAPI开发指南
0x00 前言
Outlook MAPI提供了一組訪問Outlook的接口,用來擴(kuò)展Outlook應(yīng)用程序的開發(fā),本文將會介紹Outlook MAPI的基本用法,開源一份Outlook MAPI的實(shí)現(xiàn)代碼mapi_tool,便于后續(xù)的二次開發(fā)。
0x01 簡介
本文將要介紹以下內(nèi)容:
·基本知識
·使用Outlook MAPI訪問Outlook資源
·開源代碼mapi_tool
·mapi_tool功能介紹
·多種環(huán)境下的利用思路
0x02 基本知識
參考資料:
https://docs.microsoft.com/en-us/office/client-developer/outlook/mapi/outlook-mapi-reference
Outlook MAPI的使用前提:需要安裝Outlook客戶端。
Outlook MAPI同EWS的區(qū)別:
·Outlook MAPI用來訪問Outlook客戶端中的資源
·EWS用來訪問Exchange服務(wù)器中的資源
關(guān)于EWS的使用可以參考之前的文章《Exchange Web Service(EWS)開發(fā)指南》。
Outlook客戶端中的用戶郵件存儲在后綴名為ost的文件中,和Exchange服務(wù)器中的數(shù)據(jù)庫保持一致
ost文件的默認(rèn)保存位置:%LOCALAPPDATA%\Microsoft\Outlook\
MAPI主要包括以下三個功能:
·Address Books,設(shè)置E-mail type、protocol等參數(shù)
·Transport,文件的發(fā)送和接收
·Message Store,發(fā)送接收等信息的處理
0x03 使用Outlook MAPI訪問Outlook資源
1.安裝Outlook客戶端并配置參數(shù)
2.啟動Outlook客戶端進(jìn)行用戶登錄
3.使用C Sharp開發(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
開發(fā)環(huán)境:VS2015
新建工程,選擇控制臺應(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對應(yīng)支持Outlook的版本,Product version對應(yīng)具體的Outlook版本,如下圖:
Product version對應(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í)行后將會列舉收件箱中的郵件,輸出以下內(nèi)容:
·收件箱郵件個數(shù)
·是否已讀
·主題
·發(fā)件人
·收件人
·抄送
·接收時間
·附件名稱
·正文內(nèi)容
·Outlook版本
·EntryID
代碼執(zhí)行后,Outlook客戶端會彈出警告,如下圖:
選擇允許后,成功獲得收件箱信息,如下圖:
彈出警告的原因:當(dāng)前系統(tǒng)的防病毒軟件處于非活動狀態(tài)或過期。
參考資料:
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.開啟并更新防病毒軟件
2.修改注冊表關(guān)閉警告
注冊表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\
64位操作系統(tǒng)安裝32位Office的注冊表位置:HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\
注冊表項(xiàng):ObjectModelGuard,類型:REG_DWORD,值為2。
在使用時需要注意的細(xì)節(jié)如下:
1.引用的Microsoft.Exchange.WebServices.dll要與Outlook客戶端的版本保持一致
2.默認(rèn)配置下,部分操作不會彈出警告
例如:
·列出收件箱郵件個數(shù)
·列出郵件主題
·列出郵件接收時間
·列出郵件附件名稱
3.如果后臺沒有運(yùn)行Outlook客戶端
通過程序可讀取當(dāng)前Outlook客戶端中的資源,但是獲取資源后還會彈框提示要求輸入憑據(jù),如下圖:
如果選擇了記住憑據(jù),那么后續(xù)操作不會要求輸入憑據(jù),關(guān)于憑據(jù)的使用可以參考之前的文章。
0x04 開源實(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
為了便于測試,我上傳了Office2010下的Microsoft.Office.Interop.Outlook.dll和Office2013下的Microsoft.Office.Interop.Outlook.dll
在功能實(shí)現(xiàn)上,對是否彈出安全提示做了區(qū)分,
不會彈出安全提示的功能:
·獲得所有文件夾中的郵件長度
·獲得配置信息,包括CurrentProfileName、ExchangeMailboxServerName、ExchangeMailboxServerVersion
·列出指定位置的郵件,包括郵件主題、接收時間、附件中的文件名稱和EntryID
·列出指定位置的未讀郵件,包括郵件主題、接收時間、附件中的文件名稱和EntryID
會彈出安全提示的功能:
·獲得配置信息,包括Account-DisplayName、Account-SmtpAddress、Account-AutoDiscoverXml、Account-AccountType
·獲得聯(lián)系人信息
·獲得GlobalAddress
·列出指定位置的郵件,包括郵件主題、發(fā)件人、收件人、抄送、接收時間、附件中的文件名稱、正文內(nèi)容、Outlook版本和EntryID
·列出指定位置的未讀郵件,包括郵件主題、發(fā)件人、收件人、抄送、接收時間、附件中的文件名稱、正文內(nèi)容、Outlook版本和EntryID
·保存指定郵件中的附件
在代碼開發(fā)上,需要注意以下細(xì)節(jié):
1.保存附件時需要使用絕對路徑
2.獲得聯(lián)系人列表時,數(shù)組開始的位置為1,而不是0
3.獲得配置信息時,數(shù)組開始的位置為1,而不是0
0x05 多種環(huán)境下的利用思路
1.正在運(yùn)行Outlook客戶端
通過mapi_tool可以對Outlook客戶端的資源進(jìn)行訪問,某些操作有可能會彈出安全提示。
關(guān)閉安全提示的兩種方法:
·開啟并更新防病毒軟件
·修改注冊表關(guān)閉警告
導(dǎo)出Outlook客戶端所有郵件信息的方法:
(1)獲得ost文件
ost文件的默認(rèn)保存位置:%LOCALAPPDATA%\Microsoft\Outlook\
無法直接復(fù)制,提示文件被占用。
可以使用Joe Bialek的NinjaCopy復(fù)制被占用的文件。
(2)將ost文件轉(zhuǎn)換成pst文件
工具有很多,這個提供一種:Advanced Exchange Recovery
(3)將pst文件導(dǎo)入Outlook客戶端
2.沒有啟動Outlook客戶端
通過mapi_tool可以對Outlook客戶端的資源進(jìn)行訪問,某些操作有可能會彈出安全提示。
如果執(zhí)行需要同服務(wù)器進(jìn)行交互的操作,例如獲取配置信息,會彈框提示要求輸入憑據(jù),如果憑據(jù)管理器已經(jīng)存儲了對應(yīng)的憑據(jù),就不會彈框提示。
查看已保存憑據(jù)的命令:
cmdkey /list
導(dǎo)出Outlook客戶端所有郵件信息的方法:
(1)獲得ost文件
可直接復(fù)制ost文件。
(2)將ost文件轉(zhuǎn)換成pst文件
方法同上。
(3)將pst文件導(dǎo)入Outlook客戶端
方法同上。
0x06 小結(jié)
本文介紹了使用Outlook MAPI訪問Outlook資源的方法,開源代碼mapi_tool,便于后續(xù)的二次開發(fā)。
總結(jié)
以上是生活随笔為你收集整理的c语言outl函数,Outlook MAPI开发指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在PS2主机上使用OPL通过网络加载PC
- 下一篇: XP系统任务栏的输入法图标不见了