我想通过Mapi从Outllok导入联系人.标准联系的第一步没有问题:
MAPIFolder contactObjects =
outlookObj.Session.GetDefaultFolder(OlDefaultFolders.olFolderContacts);
foreach (ContactItem contactObject in contactObjects.Items) {
... import contact ...
}
Run Code Online (Sandbox Code Playgroud)
在第二步中,我还想要导入共享联系人.我发现只有使用
OpenSharedItem(sharedContacts.vcf)
Run Code Online (Sandbox Code Playgroud)
但我不知道我想打开的文件(共享项)的名称.有人知道如何访问共享联系人并可以帮助我吗?
托比
更新:
感谢vcf-Files的提示.但是我在哪里可以找到它们?
UPDATE2:
我玩了OutlookSpy.我可以访问具有共享联系人的文件夹,但只能通过知道id(对于其他用户当然不同):
var ns = outlookObj.GetNamespace("MAPI");
var flr = ns.GetFolderFromID("00000000176A90DED92CE6439C1CB89AFE3668F90100D1AD8F66B576B54FB731302D9BB9F6C40007E4BAC5020000");
foreach (var contactObject in flr.Items) {
...
}
Run Code Online (Sandbox Code Playgroud)
如何在不知道ID的情况下访问该文件夹?
我的vbscript会自动向收件人发送电子邮件,但是有人知道如何向其中添加多个收件人吗?
...
Dim ToAddress
Dim FromAddress
Dim MessageSubject
Dim MyTime
Dim MessageBody
Dim MessageAttachment
Dim ol, ns, newMail
MyTime = Now
ToAddress = "email@address.com"
MessageSubject = "It works!."
MessageBody = "Good job on that script."
MessageAttachment = some attachment
Set ol = WScript.CreateObject("Outlook.Application")
Set ns = ol.getNamespace("MAPI")
Set newMail = ol.CreateItem(olMailItem)
newMail.Subject = MessageSubject
newMail.Body = MessageBody & vbCrLf & MyTime
newMail.RecipIents.Add(ToAddress)
newMail.Attachments.Add(MessageAttachment)
newMail.Send
Run Code Online (Sandbox Code Playgroud)
这就是我现在所拥有的.它工作正常.但是,我想拥有多个收件人.提前致谢.
newMail.CC = "person1@domain1.org;person2@domain2.org;person3@domain3.org"
Run Code Online (Sandbox Code Playgroud)
以上这条线工作了!
它与.BCC的工作方式相同,以防有人想要不显示联系人列表.
我们正在使用免费软件MAPI/SMAPI实现间歇性死锁.我怀疑实现是否有问题但是可能将登录标志更改为MapiLogon或Exchange上的配置设置可以解决此问题.
Result := MapiLogon(0, LogonProfile, LogonPassword, flLogonFlags, 0, @hSession);
Run Code Online (Sandbox Code Playgroud)
为@J 添加了cudo
不鼓励使用简单MAPI.正确的操作是开始使用扩展MAPI或Outlook对象模型.虽然我同意这一说法,但我没有任何影响力来实现这一点.
当前设置的解决方案或理解为什么会发生死锁的解决方案仍然很难实现.
简而言之
0b60调用MapiLogof08940894等待临界区036c036c被线程锁定0b60僵局
内核转储显示以下关键部分被线程锁定并拥有 b60
CritSec EMSMDB32!ScStatClose+17ac7 at 354650d0
WaiterWoken No
LockCount 1
RecursionCount 1
OwningThread b60
EntryCount 0
ContentionCount 1
*** Locked
线程的0b60调用堆栈
内核线程对象88a53758
注意KeWaitForSingleObjectwith参数87fc3c68是线程0894
b8b4fcec 8093b2e4 87fc3c68 00000006 00000001 nt!KeWaitForSingleObject+0x346 (FPO: [Non-Fpo])
b8b4fd50 8088b658 00000184 00000000 00000000 nt!NtWaitForSingleObject+0x9a (FPO: [Non-Fpo]) … 我花了一些时间来攻击MAPI,以便在服务器和客户端上创建流程自动化工具.与其他来源相比,我在线阅读的大部分资源要么缺乏细节和/或示例,要么充满了相互矛盾的信息.
假设我对C++,COM和.NET有所了解,哪些印刷或在线资源最适合入门并包含详细参考?
背景:我在Exchange 2003环境中工作.有一天我们可能会去Exchange 2007,但是没有推动.
查看MSDN MAPI文档页面时,它表示API现已弃用.如果是这种情况,这些天发送邮件的建议API是什么?
http://msdn.microsoft.com/en-us/library/dd296734.aspx
编辑:感谢所有的建议,管理的路线不适合我,因为我们正在使用MFC.
在过去,我使用MAPISendMail从带有文件附件的C++应用程序启动Outlook(或任何所需的MAPI电子邮件应用程序).(类似于Microsoft Word的发送电子邮件功能).
我需要在C#应用程序中执行相同的操作,并在XP,Vista,Server 2008(以及我认为的Windows 7)上运行时使其工作.
MAPISendMail在Vista/2008下是不可取的,因为它在Outlook运行时始终返回MAPI_ E_FAILURE并且托管代码中不支持MAPI.即使在检查此修复程序后:http: //support.microsoft.com/kb/939718 我无法让它可靠地工作.
我知道Microsoft Word和Adobe Reader 9都可以在Vista下使用附件启动Outlook.
AC#兼容解决方案将是首选,但我会对任何有效的(不必使用MAPI)感到满意.我似乎无法找到当前的"解决方案".Stack Overflow上现有的答案似乎也没有涵盖这一点.
编辑:
我知道MAPI和C#不能一起工作,所以当不以管理员身份运行时,我将采用在Vista和Server 2008中运行的C/C++解决方案.请参阅Adobe Reader 9和Microsoft Word作为有效的示例.
我正在尝试从使用其他电子邮件地址发送的电子邮件中获取发件人电子邮件地址.outlook中显示的发件人代表用户名[user.name@domain.com]为ditribution-lists@domain.com.该MAPI对象有一个SentOnBehalfOfName返回"用户名"但不返回电子邮件地址的方法.有谁知道如何收到user.name@domain.com字段?
我正在为outlook 2007编写一个插件,我想阅读一个MailItem的属性.
特别是我想知道我的附件的所有内容类型.现在,我现在这样做的方式是这样的:
Outlook.MailItem item = OutlookItem as Outlook.MailItem;
Outlook.Attachments itt = item.Attachments;
foreach (Outlook.Attachment t in item.Attachments)
{
textBox1.Text += t.PropertyAccessor.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x370E001F");
}
Run Code Online (Sandbox Code Playgroud)
但我宁愿只是打电话.
t.PropertyAccessor.GetProperty(PR_ATTACH_MIME_TAG);
Run Code Online (Sandbox Code Playgroud)
我不能让你以后的选择工作,但是在msdn文档中提到了这个属性.(http://msdn.microsoft.com/en-us/library/ms879575.aspx).有没有人知道如何在不使用字符串而是使用常量的情况下很好地检索属性?
我有一个C#应用程序,它读取.msg文件并提取正文和附件.但是当我尝试加载.eml文件时,应用程序崩溃了.我正在加载这样的文件:
MailItem mailItem = (MailItem)outlookApp.CreateItemFromTemplate(msgFileName);
mailItem.SaveAs(fullFilename, OlSaveAsType.olHTML); // save body in html format
for(int i = 0; i < mailItem.Attachments.Count; i++)
mailItem.Attachments[i].SaveAsFile(filename); // save attachments
Run Code Online (Sandbox Code Playgroud)
这适用于.msg文件,但它不适用于.eml文件.我不明白为什么.eml文件不起作用,因为我可以在Outlook 2010中打开.eml文件.
如何使用Outlook 主Interop程序集加载.eml文件?
我可以拉电子邮件,浏览它们,将它们标记为已读,甚至排序.但是,当我试图通过ReceivedTime进行限制时,它似乎不起作用.无论我输入什么日期/时间,我什么也得不回.我知道当我删除限制时,基于Sort工作,ReceivedTime是有效的.有什么建议?
Application app = new Application();
NameSpace outlookNs = app.GetNamespace("MAPI");
Microsoft.Office.Interop.Outlook.Folders folders = outlookNs.Folders[ohOptions.PSTName].Folders
Microsoft.Office.Interop.Outlook.Items items = folders["Inbox"].Items;
DateTime dt = DateTime.Now.Subtract(new TimeSpan(1,0,0));
items = items.Restrict("[ReceivedTime] > '" + dt.ToString("MM/dd/yyyy hh:mm:ss tt") + "'");
items.Sort("[ReceivedTime]", OlSortOrder.olAscending);
foreach (MailItem item in items)
{
String from = item.SenderEmailAddress;
}
Run Code Online (Sandbox Code Playgroud)