我有一个遗留应用程序,用于创建带附件的电子邮件.代码使用MAPI接口来创建消息.这段代码已经工作了很长时间.
当应用程序在Windows 7 64位计算机上运行时,对MAPILogon的调用失败,并显示一般错误代码.
是否与MAPI和Win7 64不兼容?或者是否有一些我不知道的COM问题?
我有一个 Outlook 文件夹,我们称之为LoremIpsum,其中有 1000 多个电子邮件草稿,我想对其进行枚举并通过 PowerShell 进行一些过滤。我可以使用以下脚本访问该文件夹并查看电子邮件:
Function HandleRemaining {
[CmdletBinding()]
Param()
BEGIN {
Clear-Host
}
PROCESS {
$outlook = New-Object -ComObject outlook.application
$mapi = $outlook.getnamespace("MAPI");
$email = $mapi.Folders.Item(1).Folders.Item('LoremIpsum').Items(1)
foreach ($recip in $email.Recipients) {
$recip
}
$email.To
$email.CC
}
END {
}
}
HandleRemaining
Run Code Online (Sandbox Code Playgroud)
问题是,既不$recip也不$email.To返回的电子邮件地址To或者CC是电子邮件,而不是我得到这个人的解析名称,例如:
Application : Microsoft.Office.Interop.Outlook.ApplicationClass
Class : 4
Session : Microsoft.Office.Interop.Outlook.NameSpaceClass
Parent : System.__ComObject
Address : /o=ExchangeLabs/ou=Exchange Administrative Group (ALPHA-NUMERIC)/cn=Recipients/cn=LONG-ALPHANUMERIC-HERE
AddressEntry : System.__ComObject
AutoResponse :
DisplayType : …Run Code Online (Sandbox Code Playgroud) 我们的一些用户有时会遇到此异常(不是针对每个联系人):
System.Runtime.InteropServices.COMException (0x800706BE):
The remote procedure call failed. (Exception from HRESULT: 0x800706BE)
at Microsoft.Office.Interop.Outlook._ContactItem.get_LastName()
Run Code Online (Sandbox Code Playgroud)
当我们尝试获取联系人的姓氏(ContactItem类型)时会发生这种情况.
有谁知道问题是什么?
任何帮助,将不胜感激.谢谢!
我的问题是我需要使用 C# 将文件附加到默认邮件客户端并将其显示给用户,就像使用mailto:.
我读过这篇关于这个主题的文章,但有几个问题:
mailto因为附件不受官方支持。那么,有没有其他简单的方法来解决这个问题呢?是否有另一种简单的方法来弹出默认邮件客户端,其中附件预先填充有 .NET?也许是另一种 MAPI 包装器,但许可证非常宽松?
关于IPM,我有几个问题。如果有人能消除我的疑虑,那就太好了
1)什么是IPM.Note?那是一个日志文件吗?很少的详细信息,以便我能理解
2)当我键入IPM时,在Windows搜索中请注意,它显示了我所有在MS Outlook中的电子邮件。但是我看不到IPM这个词,请注意任何地方。我如何搜索IPM.Note,我如何获取所有email.msg文件
3)IPM是否有可能。注意将在Exchange Server 2007中,还是在本地计算机中?
4)我们将如何从IPM中获悉。请注意所有邮件或未读状态。
5)我们将如何从IPM获悉请注意我们已回复的所有邮件
提前致谢
mapi exchange-server exchange-server-2007 exchangewebservices
我有一个java程序,它发送一些当前使用SMTP的电子邮件.我有一个客户的公司网络被锁定,只允许通过MAPI1和MAPI4协议发送电子邮件.
浏览互联网后,我无法找到从Java程序发送MAPI电子邮件的任何示例.如果我们必须支付一些第三方组件,它不是世界末日,但免费显然更好:)
另一点需要补充的是,如果C#中的任务更容易,则可以在C#中创建发送电子邮件功能,并从Java主应用程序调用C#程序.
如果您需要更多信息,请告诉我.
在我看来,MAPI(Windows Mail API)存在UTF8问题(或者我做错了).
代码示例:
HMODULE m_hLib = LoadLibraryA("MAPI32.DLL");
if (m_hLib == NULL)
return SEND_MAIL_CANCELED;
LPMAPISENDMAIL SendMail;
SendMail = (LPMAPISENDMAIL) GetProcAddress(m_hLib, "MAPISendMail");
if (!SendMail)
return;
MapiFileDesc fileDesc;
ZeroMemory(&fileDesc, sizeof(fileDesc));
fileDesc.nPosition = (ULONG) -1;
fileDesc.lpszPathName = (LPSTR) filePath.toUtf8();
fileDesc.lpszFileName = (LPSTR) fileName.toUtf8();
MapiRecipDesc recipientData;
ZeroMemory(&recipientData, sizeof(recipientData));
recipientData.lpszName = (LPSTR) recipient.toUtf8();
recipientData.ulRecipClass = MAPI_TO;
MapiMessage message;
ZeroMemory(&message, sizeof(message));
message.ulReserved = CP_UTF8;
message.lpszSubject = (LPSTR) title.toUtf8();
message.nFileCount = 1;
message.lpFiles = &fileDesc;
message.nRecipCount = 1;
message.lpRecips = &recipientData;
int nError = SendMail(0, NULL, &message, …Run Code Online (Sandbox Code Playgroud) 目前正在使用Add-in Express开发Outlook加载项,我必须恢复一些纯MAPI函数来读取MAPI属性.
将此P/Invoke包装器添加到HrGetOneProp函数中:
[DllImport(@"MAPI32.DLL")]
static extern int HrGetOneProp(IntPtr pmp, uint ulPropTag, out IntPtr ppProp);
Run Code Online (Sandbox Code Playgroud)
我正在尝试将类型的Outlook附件对象IMAPIProp作为第一个参数传递给函数.
我目前失败的是如何将该对象"转换"为一个,IntPtr以便我可以将它作为函数的第一个参数传递给我.我试图使用,Marshal.StructureToPtr但显然这失败了一个例外,因为我没有传递结构,而只是一个非托管COM对象的引用.
所以我的问题是:
如何HrGetOneProp通过传递COM对象成功调用该方法?
我有三个程序 -
程序1:另外使用MAPI的Microsoft Outlook加载项.
程序2:不使用MAPI 的独立exe
程序3:确实使用MAPI 的独立exe .
这三个程序都是用C#编写的,并且在某些时候使用WinForms RichTextBox.
在使用Office 365程序"1"和"3"的x64 Windows 8安装上没有问题,但只要使用以下堆栈构造RichTextBox控件,程序"2"就会崩溃:
System.IO.FileNotFoundException : C:\Program Files (x86)\Common Files\Microsoft Shared\Office15\riched20.dll
at System.Diagnostics.FileVersionInfo.GetVersionInfo(String fileName)
at System.Windows.Forms.RichTextBox.get_CreateParams()
at System.Windows.Forms.Control..ctor(Boolean autoInstallSyncContext)
at System.Windows.Forms.TextBoxBase..ctor()
at System.Windows.Forms.RichTextBox..ctor()
<snip>
Run Code Online (Sandbox Code Playgroud)
反汇编RichTextBox.get_CreateParams()显示它在'riched20.dll'上调用LoadLibrary,然后在加载的模块上调用GetModuleFileName.
对于程序2,Visual Studio告诉我它已从路径"C:\ Program Files\Microsoft Office 15\root\vfs\ProgramFilesCommonX86\Microsoft Shared\OFFICE15\RICHED20.DLL"加载了riched20.dll.
然后调用FileVersionInfo.GetVersionInfo()失败,因为它给出的路径不存在.
但是 - 程序1(outlook-addin)也从同一路径加载了riched20.dll - 但不知何故成功了!
程序2没有加载MAPI工作正常,它从C:\ Windows\syswow62加载riched20.dll
程序3在创建富文本框之前初始化MAPI,我知道某些MAPI函数会将当前工作目录更改为MAPI目录.这可能解释了为什么程序3加载office的riched20.dll并且程序2加载system32副本.
我怀疑程序1工作和程序3失败的区别在于路径中的vfs代表"虚拟文件系统",因此作为Outlook插件运行的程序1可以某种方式使用不具有的路径找到riched20.dll确实存在.
这三个程序都适用于以前版本的办公室.
作为一种解决方法,在初始化MAPI之前自己调用'LoadLibrary("riched20.dll")会使问题消失 - 但感觉就像一个可怕的黑客.
我也找不到有关此'vfs'文件路径的任何信息以及它在Internet上的含义.
对于我自己的教育,是否有人能够更好地解释这里发生了什么?
更新:我已经解决了与"点击运行"功能有关的问题.
是否有正式支持的方法将项目ID从Outlook RESTAPI转换为MAPIEntryID?
我说的GET是邮箱端点上http的json响应中返回的项目的“ Id”字段,如下所示:
https://outlook.office365.com/api/v2.0/me/messages
Id字段包含base64值。当我将其转换为十六进制并将其PR_ENTRY_ID与相同项目的值进行比较时,例如使用MFCMAPI,我可以发现EntryID包含在Id字段的十六进制版本中。
有官方文档如何在id格式之间转换?
还是要调用的API?希望使用本地转换函数来避免其他REST往返。
感谢您的任何提示SvenC
mapi ×10
c# ×4
.net ×3
email ×3
outlook ×3
pinvoke ×2
64-bit ×1
com ×1
comexception ×1
email-client ×1
java ×1
json ×1
loadlibrary ×1
powershell ×1
rest ×1
richtextbox ×1
unicode ×1
winapi ×1
windows ×1
windows-7 ×1