调用系统默认邮件程序发送邮件(200分)

  • 主题发起人 主题发起人 iseek
  • 开始时间 开始时间
I

iseek

Unregistered / Unconfirmed
GUEST, unregistred user!
如题。
我在网上找到了几段代码,试过之后,惊讶地发现没有一个能成功。我不懂网络编程,
请大虾帮忙。
注意:1。不是用ShellExecute调出程序。
2。可以发送附件。
在线等待。程序运行OK即发分。
 
留下eamil,我发
 
用 MAPI?
我没有用过,不过可以给你找找代码。
 
来自:terry_lzs, 时间:2001-6-6 10:09:58, ID:555554
测试过的,可以用,你在form上放一个button
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses mapi;
{$R *.DFM}
FUNCTION SendEMail(Handle : THandle;
Mail : TStrings):Cardinal;
TYPE
TAttachAccessArray = ARRAY [0..0] OF TMapiFileDesc;
PAttachAccessArray = ^TAttachAccessArray;
VAR
MapiMessage : TMapiMessage;
Receip : TMapiRecipDesc;
Attachments : PAttachAccessArray;
AttachCount : INTEGER;
iCount : INTEGER;
FileName : STRING;
begin

fillChar(MapiMessage, SizeOf(MapiMessage), #0);
Attachments := NIL;
fillChar(Receip,SizeOf(Receip), #0);
IF Mail.Values['to'] <> ''
then

begin

Receip.ulReserved := 0;
Receip.ulRecipClass := MAPI_TO;
Receip.lpszName := StrNew(PChar(Mail.Values['to']));
Receip.lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['to']));
Receip.ulEIDSize := 0;
MapiMessage.nRecipCount := 1;
MapiMessage.lpRecips := @Receip;
end;

AttachCount := 0;
FOR iCount := 0 TO MaxInt
do

begin
IF Mail.Values['attachment' + IntToStr(iCount)] = ''
then

BREAK;
AttachCount := AttachCount + 1;
end;

IF AttachCount > 0
then
begin

GetMem(Attachments,SizeOf(TMapiFileDesc) * AttachCount);
FOR iCount := 0 TO (AttachCount - 1)
do
begin

FileName := Mail.Values['attachment' + IntToStr(iCount)];
Attachments[iCount].ulReserved := 0;
Attachments[iCount].flFlags := 0;
Attachments[iCount].nPosition := ULONG($FFFFFFFF);
Attachments[iCount].lpszPathName := StrNew(PChar(FileName));
Attachments[iCount].lpszFileName := StrNew(PChar(ExtractFileName(FileName)));
Attachments[iCount].lpFileType := NIL;
end;

MapiMessage.nFileCount := AttachCount;
MapiMessage.lpFiles := @Attachments^;
end;

IF Mail.Values['subject'] <> ''
then

MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
IF Mail.Values['body'] <> ''
then

MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));

Result := MapiSendMail(0, Handle, MapiMessage,MAPI_DIALOG*Ord(Handle <> 0) OR MAPI_LOGON_UI OR MAPI_NEW_SESSION, 0);

FOR iCount := 0 TO (AttachCount - 1)
do
begin

strDispose(Attachments[iCount].lpszPathName);
strDispose(Attachments[iCount].lpszFileName);
end;

IF assigned(MapiMessage.lpszSubject)
then

strDispose(MapiMessage.lpszSubject);
IF assigned(MapiMessage.lpszNoteText)
then

strDispose(MapiMessage.lpszNoteText);
IF assigned(Receip.lpszAddress)
then

strDispose(Receip.lpszAddress);
IF assigned(Receip.lpszName)
then
strDispose(Receip.lpszName);
end;


procedure TForm1.Button1Click(Sender: TObject);
VAR
mail : TStringList ;
begin
mail := TStringList.Create;
mail.values['to'] := 'delphi2000@8848.net';
mail.values['subject'] := 'A subject';
mail.values['body'] := 'Some body text (line 1)';
mail.values['body'] := 'Some more body text (line 2)';
mail.values['attachment0'] := 'f:/a.txt';//附件路径要存在
sendEMail(Application.Handle, mail);
mail.Free;
end;

end.
 
不过这个我测试也没有成功,我再看看。
你找到的话也说一声。
 
谢谢Sterntaler,我正在试.好像还没有结果.
quejian,我的Email:wwxxjj@163.net.谢谢.
 
Sterntaler,我刚才调试时发现:
1。mail.values['body']应该相加,否则永远只有一行;
2。不能自动发送出去,必须手动按发送按钮。
 
是的,有这个问题。我是转贴的,没有测试成功就贴上来了。
你那边可以发送邮件吗?只是不是自动的?那样的话在窗体 onShow() 事件里面发送,
或者在定时器里面发送?
 
Sterntaler,我这里可以发送,但是先调出系统默认的邮件程序后,必须再点击邮件程序的
“发送”按钮.
 
是这样吗?原来我误会了。
好像还不能用模拟按键实现?看来要等高手来帮忙了,我就那么点力气了。
 
to quejian
一直等你的mail,好辛苦,好着急。
麻烦你快点传给我。谢谢。
 
Sterntaler,拖了好久了,200分给你.
 
后退
顶部