使用Outlook express的MAPI收信(200分)

D

delphi1

Unregistered / Unconfirmed
GUEST, unregistred user!
把Windows 98自带的OutLook express设置为默认的 Simple MAPI 客户
程序后,可以使用MAPISendMail进行发信,但使用
var
AHandle: THandle;
MAPILogon(Handle, nil, nil, MAPI_FORCE_DOWNLOAD
orMAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @AHandle);
没有响应,不能收到信。
如何使用OutLook Express的MAPI收信?
 
//返回值=0表示登录成功,否则认为登录不成功
function LogOn(UserName : String;PassWord : String) : Cardinal;
var
ul : Cardinal;
begin
if lhSession <> 0 then LogOff;
//如果UserName为空,就让用户选择
if Trim(UserName) = '' then
ul := MAPILogOn(0,nil,nil,MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@lhSession)
else
ul := MAPILogOn(0,Pchar(UserName),Pchar(PassWord),MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@lhSession);
if ul <> SUCCESS_SUCCESS then lhSession := 0;
Result := ul;
end;

function LogOff: Cardinal;
var
ul : Cardinal;
begin
ul := MAPILogOff(lhSession,0,0,0);
lhSession := 0;
Result := ul;
end;

在这两个函数中lhSession是全局变量(Mapi会话句柄)
 
Logon总是返回成功,但并不收信,MAPILogon加MAPI_FORCE_DOWNLOAD 也一样。
UserName为空也不会提示选择用户名,大概因为OutLook Express的账号设置
中选中“记住用户名和密码”

问题是要收信。这样就可以编程拨号上网自动收信。
 
用MAPIFindNext试一试查找是否有Message
 
Sorry,我以为你问的是Logon的问题
收信跟Logon没有直接关系,MapiFindNext是查看是否有信,MapiReadMail是收信
////////////////////////////////////////////////////////////////////////
//功能:
// 收一封信(调用时,如果返回值为Success_success,可以在调用,直到把信收完为止)
//
//参数:
// TmpDir:存放Attach的目录
// Subject:返回收到邮件的Subject
// BodyStr:返回收到邮件的内容
// AttachList:返回所有的Attach的文件名称
//返回值:
// -1--会话已断开;
// 0:成功收到一封信;
// 1--没有信;
// 2--其它情况;
///////////////////////////////////////////////////////////////////////
function RecExMail(TmpDir : String;var Subject: String;var BodyStr: String;var AttachList: TStringList): Integer;
var
i,ulResult : Integer;
lpStr : PChar;
lpMsg : PMapiMessage;
PathName,FileName : String;
ThisFileDesc : PMapiFileDesc;
begin
if lhSession = 0 then begin
Result := -1;
Exit;
end;
lpMsg := nil;
lpStr := PChar( Allocmem( 512 * Sizeof(Char)));
ulResult := MapiFindNext(lhSession,0,nil,nil,0,0,lpStr);
case ulResult of
SUCCESS_SUCCESS : begin
if MapiReadMail(lhSession,0,lpStr,0,0,lpMsg) = SUCCESS_SUCCESS then begin
Subject := lpMsg.lpszSubject;
BodyStr := lpMsg.lpszNoteText;
for i := 0 to lpMsg.nFileCount - 1 do begin
ThisFileDesc := PMapiFileDesc( PChar(lpMsg.lpFiles) + i * Sizeof(MapiFileDesc) );
PathName := ThisFileDesc.lpszPathName;
ShowMessage('PathName'+PathName);
FileName := ExtractFileName( PathName );
CopyFile( PChar(PathName) ,PChar( TmpDir + FileName ),False);
AttachList.Add( TmpDir + FileName );
end;
end;
MapiDeleteMail(lhSession,0,lpStr,0,0);
ulResult:=0;
end;
MAPI_E_NO_MESSAGES : ulResult := 1;
else
ulResult := 2;
end;

SysFreemem(lpStr);
if lpMsg <> nil then SysFreemem(lpMsg);
Result := ulResult ;
end;

顺便说一句,收发信件用Mapi并不是一个好方法,找一个好的Smtp控件和Pop3控
件要方便得多.言下之意:Delphi的Smtp和Pop3控件是可以用的垃圾
 
dubhe:
不好意思,可能我还是没有把问题说清除。你的代码是正确的,可以读取OutLook 收件箱中的所有邮件。
只是我忘了把MApiDeleteMail调用删除,结果把邮件彻底删除了,而不是放入已删除邮件文件夹,能够恢复吗?
我只需要能够从Outlook设置所有账号的POP3服务器<B>下载</B>所有邮件到<B>OutLook Express 收件箱</B>中,然后返回即可。
否则我只需要使用不较好用的Delphi的POP3“垃圾“就可以了。
因为如果使用POP3收信,对于非特殊情况,需要自己来管理收到的东西,我不是想再编写一个FoxMail。
如果MAPI无法实现,其它程序实现方法也是可取的。使用MAPI的话,就也适用于Netscape Messenger
 
你的要求涉及到Message Store的管理,Simple Mapi实现不了.
你要是有劲的话,可以去啃Extended Mapi(我没有啃过)
www.developer.com有一本<<MAPI, SAPI, AND TAPI DEVELOPER'S GUIDE>>可以
拉下来看看.还有一本<<Visual C++ 4 Unleashed>>也提到了Mapi编程.
以下这句话摘自该书:"Extended MAPI is a large, complex object-oriented
programming interface to all aspects of MAPI" :)
 
下载所有邮件到收件箱中是OutLook的功能,只是不知道其提供的Simple MAPI是否提供了接口。按照Win32 Help,MAPILogon时的MAPI_FORCE_DOWNLOAD:
Indicates an attempt should be made to download all of the user's messages before returning. If the MAPI_FORCE_DOWNLOAD flag is not set, messages may be downloaded in the background after the function call returns.
如果我没有理解错的话,调用MAPILogon是理应进行邮件下载的,但是没有。不知道dubhe能做何解释。
不知道OutLook Express有没有提供OLE接口,我只希望能启动Outlook express,执行邮件下载,然后退出(返回我的程序)。
 
如果消息存储在远程计算机上,便可以指定标志MAPI_FORCE_DOWNLOAD来访问
它们。此标志会使MAPI在返回MAPILogon之前下载所有的远程消息。

大概你是想自动下载邮件到Outlook Express收件箱中。这与我以前做的工作
不同,我以前是从Exchange Server上取出邮件然后由自己的程序管理,所以用
的是MapiReadMail.

建议你使用Microsoft Exchange和OutLook97,Exchange会为你安装一个本地
邮局,需要在控制面板中配置.




 
多人接受答案了。
 
顶部