标签: mapi

如何在Windows上发送邮件(MAPI除外)

查看MSDN MAPI文档页面时,它表示API现已弃用.如果是这种情况,这些天发送邮件的建议API是什么?

http://msdn.microsoft.com/en-us/library/dd296734.aspx

编辑:感谢所有的建议,管理的路线不适合我,因为我们正在使用MFC.

windows email mapi winapi

6
推荐指数
1
解决办法
3759
查看次数

取消删除Outlook中的联系人

我有一个用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)

delphi mapi outlook

5
推荐指数
1
解决办法
478
查看次数

在delphi中发送包含rtf文本的电子邮件

我想执行以下任务:将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)

delphi mapi rtf sendmail indy

5
推荐指数
1
解决办法
3978
查看次数

使用扩展的mapi函数将图像嵌入到Outlook中

我需要在电子邮件中嵌入图像并在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)

embed delphi mapi outlook

5
推荐指数
1
解决办法
1366
查看次数

验证富文本结构 RTF

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)

mapi rtf richtext

5
推荐指数
1
解决办法
4094
查看次数

带有 64 位 Outlook 的 32 位 MAPI 应用程序

我们的应用程序的 32 位版本无法在MAPISendMail安装了 64 位 Outlook 的情况下发送电子邮件。它返回一个错误 0x80004005,除了它似乎是 MAPI 初始化错误之外,我几乎找不到关于它的信息。

根据此 MSDN 文档,这MAPISendMail是 32 位应用程序不能使用 64 位 MAPI 规则的一个例外。然而它不起作用(至少在 XP 和 Vista 中——我们还没有测试过 Win7/8)。

任何人都可以对此有所了解吗?

TIA

windows mapi outlook mapisendmail

5
推荐指数
1
解决办法
2万
查看次数

如何获取outlook联系人的头像?

我正在尝试获取联系人的头像图像。

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)

但不幸的是我找不到图片访问器。

.net c# mapi outlook interop

5
推荐指数
1
解决办法
2909
查看次数

如何将文件拖放到 .MAPIMail 上

给定一些文件(或 shell 文件对象),我如何使用.MAPIMail它们调用注册的 shell 扩展处理程序?


问题

我的计算机上有一些文件:

  • C:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141174.pdf
  • C:\Users\ian\AppData\Local\Temp\Contoso_Invoice_141173.pdf
  • C:\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,也不知道以什么顺序调用什么方法。

所以我们只剩下 shell 编程了

我想要的是可能涉及外壳的东西(伪代码):

IShellFolder desktop;
OleCheck(SHGetDesktopFolder(out desktop));

List<pidl> pidls = new List<pidl>();

ULONG chEaten = 0;
ULONG dwAttributes = …
Run Code Online (Sandbox Code Playgroud)

mapi winapi windows-shell

5
推荐指数
1
解决办法
2714
查看次数

COM(C++)Interlock API是否足以支持AddRef和Release中的Thread Saftey?

我知道在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)

参考计数规则

c++ windows com mapi winapi

5
推荐指数
1
解决办法
909
查看次数

Windows 10 中是否有任何 UI 可以更改当前的 MAPI 提供程序?

我想为 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)

windows mailto email mapi

5
推荐指数
1
解决办法
1012
查看次数

标签 统计

mapi ×10

outlook ×4

windows ×4

delphi ×3

winapi ×3

email ×2

rtf ×2

.net ×1

c# ×1

c++ ×1

com ×1

embed ×1

indy ×1

interop ×1

mailto ×1

mapisendmail ×1

richtext ×1

sendmail ×1

windows-shell ×1