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