3

我正在尝试使用SimpleMAPI在 C++ 应用程序(Borland C++ Builder 2006)中使用 Windows Mail 或 Thunderbird 在 Vista SP1 上显示带有附件的“写消息”对话框。我应该能够使用MAPISendMail来执行此操作。

我没有填写收件人地址,因为我希望用户在邮件客户端显示“写消息”对话框时这样做。我也没有填写发起人地址,因为我希望邮件客户端使用默认值。我已经尝试对它们进行硬编码,看看是否是问题所在,而事实并非如此。

我的代码如下所示:

HINSTANCE hMAPI;
LPMAPISENDMAIL pSendMail;
MapiMessage message;
MapiFileDesc file;

ZeroMemory( &message, sizeof( MapiMessage ) );
ZeroMemory( &file, sizeof( MapiFileDesc ) );

hMAPI = LoadLibraryA( "MAPI32.DLL" );

pSendMail = (LPMAPISENDMAIL)GetProcAddress( hMAPI, "MAPISendMail" );

// setup the attachment...
file.nPosition     = -1;
file.lpszPathName  = "C:\\my_attachment.dat";

// set up the message...
message.lpszSubject     = "My Subject";
message.lpszNoteText    = "My Message...";
message.lpszMessageType = "";
message.nRecipCount     = 0;
message.lpRecips        = NULL; // we don't know the recipient address(s)
message.nFileCount      = 1;
message.lpFiles         = &file;
message.lpOriginator    = NULL; // we don't know the users from address

dwResult = pSendMail( lhSessionNull, (DWORD)Application->Handle, &message, MAPI_LOGON_UI | MAPI_DIALOG, 0 );
if( dwResult == SUCCESS_SUCCESS )
{ 
  // ...yay! :)
}
else
{
  // ...we always fail here with: MAPI_E_FAILURE
}

它总是以错误代码 2 (MAPI_E_FAILURE) 失败。我究竟做错了什么?

提前谢谢了。

4

4 回答 4

2

This might interest you:

http://groups.google.com/group/microsoft.public.win32.programmer.messaging/browse_thread/thread/a601e68b95f20609/f0b0d80c99d4eba7?lnk=gst&q=Vista+Outlook+2007#f0b0d80c99d4eba7

Have you tried the code with your email client closed?

于 2009-01-29T11:31:16.070 回答
2

在 Delphi 中使用类似并发现它在线程内部不起作用。(Delphi TThread 组件)我使用了完全相同的代码,并且从线程内调用总是失败,即使我使用了同步

于 2009-11-12T17:49:07.230 回答
0

消息.lpRecips = NULL;// 我们不知道收件人地址

尝试分配 lpRecips 并将其 lpszAddress 设置为“SMTP:”

于 2009-10-12T14:01:45.427 回答
-2

您必须先登录到 MAPI 会话

LHANDLE hMapiSession;
status = lpMapiLogon(NULL, NULL, NULL, MAPI_NEW_SESSION | MAPI_LOGON_UI, 0, &hMapiSession);

然后,您可以调用 SendMail()。之后,您必须再次注销:

lpMapiLogoff(hMapiSession, NULL, 0, 0);
于 2009-01-27T19:50:09.063 回答