delphi如何调用默认邮件发送程序(200分)

  • 主题发起人 主题发起人 yj8888
  • 开始时间 开始时间
Y

yj8888

Unregistered / Unconfirmed
GUEST, unregistred user!
如:ShellExecute(Handle,"open", "mailto:", NULL, NULL, SW_SHOWNORMAL);打开新邮件窗口。
这样的没有用,因为不能自动发送.
我主要想调用Outlook Express实现这样的功能: (注意是Outlook Express,不需要安装office outlook的)
aaa@aaaa.com 2008-5-30 13:01 发送
bbb@bbb.com 2008-5-30 13:02 发送
ccc@ccc.com 2008-5-30 13:03 发送
就是实现批量发送邮件功能.发送的内容为一样,收件人不一样.
 
给你一段代码,看着改吧
procedure TForm1.M_sendmail_byoutlook(M_filename: string);
//参数为附件路径
TYPE
TAttachAccessArray = ARRAY [0..0] OF TMapiFileDesc;
PAttachAccessArray = ^TAttachAccessArray;
VAR
MapiMessage : TMapiMessage;
Receip : TMapiRecipDesc;
Attachments : PAttachAccessArray;
AttachCount : INTEGER;
iCount : INTEGER;
FileName : STRING;
Mail : TStringlist;
begin
Mail:= Tstringlist.Create;
mail.values['to'] := '';
mail.values['subject'] := '';
mail.values['body'] := '';
mail.values['attachment0'] := M_filename;//附件路径要存在
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']));
//MapiSendMail(0, Handle, MapiMessage,MAPI_DIALOG*Ord(Handle <> 0) OR MAPI_LOGON_UI OR MAPI_NEW_SESSION, 0);
MapiSendMail(0, Application.Handle, MapiMessage,
MAPI_DIALOG 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);
*)
//MapiSendMail(0, Handle, MapiMessage,MAPI_DIALOG*Ord(Handle <> 0) OR MAPI_LOGON_UI OR MAPI_NEW_SESSION, 0);
mail.Free;
end;
 
to: ufo!,
不好意思,我比较菜,看不懂,
可否,改写成这样的函数给我
SendMail555(Email, Subject : string;
Body : Widestring ;
Filename : string): boolean;

还有就是如何控制 定时 发送邮件
 
你要的这些数据写这里就行了啊
Mail:= Tstringlist.Create;
mail.values['to'] := '';
mail.values['subject'] := '';
mail.values['body'] := '';
mail.values['attachment0'] := M_filename;//附件路径要存在
我那里是为空的,你写上就是了。
或者,你要发送邮件,也可以试试邮件直接发送到对方服务器,不过,很多服务器会作为垃圾邮件拒绝,邮件特快专递,我这里有个源码
http://ufo2003.ys168.com 的“我的delphi源码”文件夹下的 DirectEmail.rar
 
To:ufo!
你好!我拷贝了你的代码,可以运行了,但他只是 打开outlook邮件窗口 ,并没有直接发送,
要我按outlook express 的发送按钮才可以发送.
 
outlook express 这个是实现不到的.不可能用程序来控制.
但是outlook可以,office里带的.
 
你改改MapiSendMail 的参数
就可以不显示窗口,但估计还是达不到你要的效果,因为
outlook会提示“某程序将发送邮件,是否发送”
 
To: ufo!,
MapiSendMail(0, Application.Handle, MapiMessage,
MAPI_DIALOG or MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
我把MAPI_DIALOG去掉就可以了,但不清楚具体的参数是什么意思,只是猜的,
outlook确实会提示“某程序将发送邮件,是否发送”,但在outlook express里 安全 可以设置去掉的, 谢谢!
还有怎么调用M_sendmail_byoutlook(M_filename: string);
(定时发送email)这样的程序怎么写:
aaa@aaaa.com 2008-5-30 13:01 发送
bbb@bbb.com 2008-5-30 13:02 发送
ccc@ccc.com 2008-5-30 13:03 发送
 
1.建立一个程序
2。用一个定时器控件,每隔1秒钟扫描一下任务列表
3。发现有时间匹配的任务,就发送
4。任务列表可以用一个动态数组来做,如果任务是固定的,也可以用静态数组
 
To: ufo!,
非常感谢!
还有个问题请教一下,mapisendmail不支持发送 html格式的email吗?
我用了一下 
商务快车(试用版的) http://www.suminfo.com/NewSuminfo/Main.asp?ID=611
,也是调用outlook express的却可以实现,
 
html格式可以的,你先研究一下邮件编码方面的内容
 
To: ufo! 谢谢!
我的另一个问题,已经不需要回答了.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3315441
你可以随便回个ok, 100分也送给你.
 
谢谢,我有一万多分了,现在也不需要分数问问题。
你把这分数给其他需要的朋友吧。
 
大狭,你真厉害,佩服.
 

Similar threads

D
回复
0
查看
857
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
815
DelphiTeacher的专栏
D
后退
顶部