查看MSDN MAPI文档页面时,它表示API现已弃用.如果是这种情况,这些天发送邮件的建议API是什么?
http://msdn.microsoft.com/en-us/library/dd296734.aspx
编辑:感谢所有的建议,管理的路线不适合我,因为我们正在使用MFC.
我有一个用Delphi编写的应用程序,用于在outlook中添加/更新联系人.我遇到的问题是,如果在Outlook中删除了联系人,代码仍会找到联系人并对其进行更新 - 并且联系人仍然会被删除.有没有办法可以确定联系人是否被删除或取消删除联系人?
大致代码看起来像:
OutlookApp := CreateOleObject('Outlook.Application');
Mapi := OutlookApp.GetNameSpace('MAPI');
//.....
try
if ContactOutlookEntryID.AsString <> '' then
aContact := Mapi.GetItemFromID(ContactOutlookEntryID.AsString);
except
end;
//try to locate the contact if they have been synchro'd before
if VarIsEmpty(aContact) then //if not found
aContact := Contacts.Items.Add(2); //add a new contact to outlook
aContact.LastName := ContactSurname.AsString;
//.....
Run Code Online (Sandbox Code Playgroud) 我想执行以下任务:将TRichEdit内容(rtf文本)转换为非纯文本电子邮件正文.
MAPI不支持rtf,但有没有办法可以使用Indy?
问题是rtf是rtf,电子邮件是纯文本或HTML.
有人可以建议一招吗?是否可以使用TWebBrowser将rtf转换为文本?
基本上情况是:
1)用户以delphi形式写电子邮件,
2)然后将电子邮件与MAPI一起发送到默认邮件客户端(因此生成一个新的电子邮件窗口,并且邮件正文与delphi形式的邮件正文相同) )
3)用户从邮件客户端发送电子邮件
无论如何MAPI只接受纯文本.
更新:
尝试与Indy我写了这个,但它仍然没有用,因为我发送邮件到我的Gmail帐户我收到一个空身和NONAME假附件的消息.
uses IdMessageBuilder;
procedure SendMail;
var
MBuilder: TIdMessageBuilderRtf;
MyMemoryStream: TMemoryStream;
begin
try
MBuilder := TIdMessageBuilderRtf.Create;
MyMemoryStream := TMemoryStream.Create;
MBuilder.RtfType := idMsgBldrRtfRichtext;
// RichEdit1 has PlainText set to False
// at design time I pasted some formatted text onto it
RichEdit1.Lines.SaveToStream(MyMemoryStream);
MBuilder.Rtf.LoadFromStream(MyMemoryStream);
MBuilder.FillMessage(IdMessage1);
IdSMTP1.Connect;
IdSMTP1.Send(IdMessage1);
IdSMTP1.Disconnect;
finally
MyMemoryStream.Free;
MBuilder.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud) 我需要在电子邮件中嵌入图像并在Outlook中发送之前预览电子邮件.CDO和赎回不是一种选择.
我尝试了以下代码,但图像只显示为一个小块.
procedure AddAttachment(FullFileName: String; Attachments: Outlook2000.Attachments; CID: String);
const
PR_ATTACH_CONTENT_ID = $3712001E;
PR_ATTACH_CONTENT_ID_W = $3712001F; // Unicode
PR_ATTACH_MIME_TAG = $370E001E;
PR_ATTACH_ENCODING = $37020102;
var
IAttach: IMAPIProp;
Prop: PSPropValue;
AAttachment: Outlook2000.Attachment;
FileName: String;
PropValue: TSPropValue;
Prop1: TSPropTagArray;
begin
FileName := ExtractFileName(FullFileName);
Prop := nil;
try
AAttachment := Attachments.Add(FullFileName, olByValue, 1, FileName);
IAttach := AAttachment.MAPIOBJECT as IMAPIProp;
if Assigned(IAttach) then
try
PropValue.ulPropTag := PR_ATTACH_MIME_TAG;
PropValue.Value.lpszA := 'image/jpeg';
HrSetOneProp(IAttach, @PropValue);
PropValue.ulPropTag := PR_ATTACH_CONTENT_ID;
PropValue.Value.lpszA := PAnsiChar(AnsiString(CID));
HrSetOneProp(IAttach, @PropValue);
finally
if Assigned(Prop) then …Run Code Online (Sandbox Code Playgroud) MS Exchange / Outlook 消息使用 MAPI 存储数据。一个常见的 MAPI 属性包含消息正文的富文本版本(0x1009、PR_RTF_COMPRESSED、PidTagRtfCompressed)。如果富文本字符串具有无效结构,则 Outlook 2003 及更早版本将无法显示任何正文内容。
例如,这个 RTF 代码省略了一个结束的“}”。
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 asdfasdf\par
Run Code Online (Sandbox Code Playgroud)
正确的版本是
{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}
{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 asdfasdf\par
}
Run Code Online (Sandbox Code Playgroud)
是否有可用于测试 RTF 代码是否有效的 .NET 方法或库?如果没有,我对 C++ 和 Java 或 COM 库持开放态度。如果没有,是否有应用程序报告 RTF 字符串中的违规行为?
理想的解决方案是报告包含不规则的行号。一个适当的解决方案将报告整个 RTF 是否有效且格式良好。
此问题在 MAPI 之外是相关的。例如,如果将上面指定的无效 RTF 字符串写入 .RTF 文件,它会在 WordPad 5.1 中正确打开,但 Word 2007 会报告错误并请求我修复该文件。
一个建议是我将 RTF 流式传输到富文本框中。我试过这个代码:
private void button1_Click(object sender, EventArgs e)
{
string aaa = richTextBox1.Rtf;
richTextBox1.Rtf = @"{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fcharset0 Arial;}}{\*\generator Msftedit 5.41.15.1515;}\viewkind4\uc1\pard\f0\fs20 asdfasdf\par}";
richTextBox1.Refresh(); …Run Code Online (Sandbox Code Playgroud) 我们的应用程序的 32 位版本无法在MAPISendMail安装了 64 位 Outlook 的情况下发送电子邮件。它返回一个错误 0x80004005,除了它似乎是 MAPI 初始化错误之外,我几乎找不到关于它的信息。
根据此 MSDN 文档,这MAPISendMail是 32 位应用程序不能使用 64 位 MAPI 规则的一个例外。然而它不起作用(至少在 XP 和 Vista 中——我们还没有测试过 Win7/8)。
任何人都可以对此有所了解吗?
TIA
我正在尝试获取联系人的头像图像。
using Microsoft.Office.Interop.Outlook;
public sealed class OutlookAvatarFetcher
{
private static void FetchAvatars()
{
var outlook = new Application();
var folder = outlook.GetNamespace("MAPI").GetDefaultFolder(OlDefaultFolders.olFolderContacts);
var items = folder.Items;
for (var i = 0; i < items.Count; ++i)
{
var contact = items[i + 1] as ContactItem;
if (contact == null)
continue;
if (contact.HasPicture)
{
// TODO store the picture somehow.
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但不幸的是我找不到图片访问器。
给定一些文件(或 shell 文件对象),我如何使用.MAPIMail它们调用注册的 shell 扩展处理程序?
我的计算机上有一些文件:
C:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141174.pdfC:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141173.pdfC:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141171.pdf我想做的编程相当于将它们放在.MAPIMail注册的处理程序上:

发送到文件夹的邮件收件人选项实际上是一个特殊的注册.MAPIMail扩展:

这是在系统上注册的文件类型:
HKEY_CLASSES_ROOT\.mapimail
Run Code Online (Sandbox Code Playgroud)
如何调用临时.mapimail文件上的放置?
现在,我可能是一个糟糕的开发人员,并且拼写了注册表,该条目的.mapimail默认值:
CLSID\{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}
Run Code Online (Sandbox Code Playgroud)
提取 clsid {9E56BE60-C50F-11CF-9A2C-00A0C90A90CE},并确认该类已注册:
HKEY_CLASSES_ROOT\CLSID\{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}
(default) = Desktop Shortcut
\InProcServer32
(default) = %SystemRoot%\System32\sendmail.dll
Run Code Online (Sandbox Code Playgroud)
并用于CoCreateInstance创建该 COM 对象:
IUnknown unk = CreateComObject("{9E56BE60-C50F-11CF-9A2C-00A0C90A90CE}");
Run Code Online (Sandbox Code Playgroud)
然后我处于一个无文档、不受支持的世界,我不知道我必须使用什么接口QueryInterface,也不知道以什么顺序调用什么方法。
我想要的是可能涉及外壳的东西(伪代码):
IShellFolder desktop;
OleCheck(SHGetDesktopFolder(out desktop));
List<pidl> pidls = new List<pidl>();
ULONG chEaten = 0;
ULONG dwAttributes = …Run Code Online (Sandbox Code Playgroud) 我知道在COM对象的AddRef和Release方法内部使用了互锁API来增加/减少引用计数线程的安全性.但我试图理解这里是使用Interlock API还是我们需要某种其他同步对象,例如Mutex.到目前为止,我见过的所有示例代码都只使用了Interlock API.
场景 - 假设我已经实现了消息对象的AddRef和Release方法,如下所示.假设线程A访问消息对象,因此m_lRef count为1.一旦完成消息对象使用线程A调用Release方法
内部释放方法 - 第9行 - m_lRef = 1第10行 - m_lRef = 0,lRef = 0
线程A在第10行暂停,另一个线程B访问相同的消息,因此它调用AddRef方法,该方法将第3行的m_lRef值设置为1.现在,线程B被挂起,线程A在第11行恢复 - m_lRef = 1,lRef = 0.线程A将删除该对象.现在,如果线程B试图访问同一个对象; 崩溃是不可避免的.
我的问题 - 我的情况有效吗?如果m_lRef = 1则理想情况下没有其他线程应该等待访问该对象.但是为了防止在这种意外情况下发生崩溃,我们不应该用互斥锁或CS保护整个释放方法吗?
1. STDMETHODIMP_(ULONG) CMapiMsg::AddRef()
2. {
3. LONG lRef = InterlockedIncrement(&m_lRef);
4. return lRef;
5. }
6.
7. STDMETHODIMP_(ULONG) CMapiMsg::Release()
8. {
9. LONG lRef = InterlockedDecrement(&m_lRef);
10. if(0 == lRef)
11. {
12. delete this;
13. }
14. return lRef;
15. }
Run Code Online (Sandbox Code Playgroud)
我想为 Windows 编写一个自定义的发送邮件处理程序,包括一个简单的 MAPI 提供程序。
在 Windows 上,当前的 MAPI 提供程序存储在
HKCU/SOFTWARE/Clients/Mail
Run Code Online (Sandbox Code Playgroud)
和
HKLM/SOFTWARE/Clients/Mail
Run Code Online (Sandbox Code Playgroud)
(前者压倒后者)。但我发现没有 Windows 10 UI 可以更改此注册表设置。特别是,当用户更改设置 -> 默认应用程序 -> 电子邮件时,Windows 会更改作为单独设置的 mailto 关联,但 MAPI 注册表项保持不变。当用户选择不同的默认电子邮件应用程序时,是否有任何方法可以更改 MAPI 提供程序或执行自定义代码?
这些是我安装的注册表项,以使 Windows 知道我的 MAPI 提供程序:
HKLM\SOFTWARE\Classes\CustomMapi.Mailto Type="string" Value="URL:MailTo Protocol"/>
HKLM\SOFTWARE\Classes\CustomMapi.Mailto Name="URL Protocol" Type="string" Value=""/>
HKLM\SOFTWARE\Classes\CustomMapi.Mailto\DefaultIcon Type="string" Value="[TARGETDIR]mailtohandler.exe,-1"/>
HKLM\SOFTWARE\Classes\CustomMapi.Mailto\shell\open\command Type="string" Value='"[TARGETDIR]mailtohandler.exe" "%1"'/>
HKLM\SOFTWARE\RegisteredApplications Name="CustomMapi" Type="string" Value="SOFTWARE\Clients\Mail\CustomMapi\Capabilities"/>
HKLM\SOFTWARE\Clients\Mail\CustomMapi Type="string" Value="CustomMapi"/>
HKLM\SOFTWARE\Clients\Mail\CustomMapi Name="DllPath" Type="string" Value="[TARGETDIR]custommapi.dll"/>
HKLM\SOFTWARE\Clients\Mail\CustomMapi\Capabilities Name="ApplicationName" Type="string" Value="CustomMapi"/>
HKLM\SOFTWARE\Clients\Mail\CustomMapi\Capabilities Name="ApplicationDescription" Type="string" Value="A custom MAPI provider."/>
HKLM\SOFTWARE\Clients\Mail\CustomMapi\Capabilities\StartMenu Name="Mail" Type="string" Value="CustomMapi"/>
HKLM\SOFTWARE\Clients\Mail\CustomMapi\Capabilities\URLAssociations Name="mailto" Type="string" Value="CustomMapi.Mailto"/> …Run Code Online (Sandbox Code Playgroud)