delphi IdSMTP发送邮件
TIdPOP3组件简介
TIdPOP3 是用来接收邮件服务器的邮件信息到用户端的一个组件。它实现了RFC 1939协议。
在使用TIdPOP3组件时需设置它的几个成员属性。
Host :指定邮件服务器,一般为pop3邮件服务器的地址,如 pop3.126.com。
Username :用户名,也就是邮箱名,如billanking2002@126.com。
Password :邮箱密码,在进行收发邮件时组件需要凭密码进行登录。
其它成员属性
Connected:返回它与邮件服务器的连接状态,这true表示已经连接。
CheckMessages:邮件数,如果连接服务器成功,则可以获得服务器端的邮件数。
成员函数
procedure Connect(const ATimeout: Integer = IdTimeoutDefault);
与服务器连接函数。参数为无效连接时等待的毫秒数。
function RetrieveHeader(const MsgNum: Integer; AMsg: TIdMessage): Boolean;
接收邮件头信息,它有两个参数,MsgNum表示在接收第几个邮件,从1开始,AMsg为邮件消息组件实例。
function Retrieve(const MsgNum: Integer; AMsg: TIdMessage): Boolean;
接收邮件主体信息,它与 RetrieveHeader的参数是一样的。接收的邮件内容将保存在AMsg中。
function Delete(const MsgNum: Integer): Boolean;
删除邮件服务器中第几个邮件。从1开始。
procedure Disconnect; override;
关闭连接。
TIdMessage组件简介
TIdMessage用来支持邮件消息协议,如POP3,SMTP,NNTP等。TIdMessage支持多用途Internet邮件扩展(MIME)协议。
常用的TIdMessage的属性:
Subject:邮件主题,这个字符串经过BASE64编码的。所以在使用时需对它进行解码。
MessageParts:这是TIdMessageParts类的一个实例,它用来存储邮件的信息。如邮件内容及附件信息。在进行解析时需要判断它是否为附件或文本,如果为附件时,其文件名是经过BASE64编码的。判断常量分别为TIdText , TIdAttachment。
Body:这是个字符串列表,包含构成该邮件的正文内容。
Form:发送邮件者的地址信息。
Recipients:收件人地址信息。
BccList:抄送地址列表。
CharSet:指示邮件信息中使用的字符集。
ContentType:指定MIME媒体数据类型,描述正文中包含的数据,使用户代理决定如何显示数据,常用的有text/html,text/xml。
TIdSMTP组件简介
TIdSMTP是TIdMessageClient派生出的一个简单邮件传输协议和SMTP客户端。
它的主要功能是发送邮件信息。
常用的属性:
Host :SMTP邮件服务器的地址,如smtp.126.com。它与上面的POP3地址不一样。
AuthenticationType:服务器认证类型,它有atNone,atLogin两种,即不需要认证和需要凭用户名和密码进行认证。
Username:用户名,这里与TIdPOP3 有点不一样,即它不需要后缀,如billanking2002
Password:邮箱登录密码。如果AuthenticationType设置了atLongin则必须设置密码和用户名。
下面来看下程序源代码:
新建一个DELPHI工程,在窗口中加入TIdPOP3,TIdMessage,TIdSMTP三个组件
加入两个按钮,一个为收邮件,一个为发邮件。加入三个编辑框,一个为服务器地址,一个为用户名,一个为密码。和一个Memo,WebBrowser控件。
下面为其工程的源文件代码。
判断输入的字符串是不是为一个邮件地址。
function TForm1.IsEMail(EMail: String): Boolean;
var
s: String;
ETpos: Integer;
begin
ETpos:= pos('@',EMail); //主要判断有没有@符
if ETpos> 1 then
begin
s:= copy(EMail,ETpos+1,Length(EMail));
if (pos('.',s) > 1) and (pos('.',s) < length(s)) then Result:= true
else Result:= false;
end
else Result:= false;
end;
BASE64编码转换,这个很重要,因为邮件的标题,及附近的文件名都是经过了编码转换的。
function TForm1.Base64Decode(strInput:string):string;
var
strDecode : string;
posStart : Integer;
posEnd : Integer;
begin
while pos('=?gb2312?b?',lowercase(strInput))>0 do
begin
try
posStart:=pos('=?gb2312?b?',lowercase(strInput));
posEnd:=pos('?=',lowercase(strInput));
strDecode:=strDecode+copy(strInput,1,posStart-1)+IdDecoderMIME1.DecodeString (copy(strInput,posStart+11,posEnd-posStart-11));
strInput:=copy(strInput,posEnd+2,length(strInput)-posEnd-1);
finally
Application.ProcessMessages;
end;
end;
strDecode := strDecode + strInput;
result := strDecode;
end;
收邮件功能函数:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
i,j,mnnn,mailcount:integer;
tmp:string;
begin
IdPOP31.Host := e_address.text;
dPOP31.Username := e_username.text
dPOP31.Password := e_password.text;
while true do
begin
IdPOP31.Connect(); //连接到POP3服务器
if (IdPOP31.Connected = true) then
begin
break;
end
else begin
IdPOP31.Password :='gozhyflkmcfs';
end;
end;
mailcount := IdPOP31.CheckMessages; //得到邮箱中邮件的个数
mnnn := 0;
for i:=1 to mailcount do /遍历每一封邮件
begin
IdMessage1.Clear;
IdPOP31.retrieveHeader(i,IdMessage1); //得到邮件的头信息
tmp := IdMessage1.Subject; //得到邮件的标题
Memo1.Lines.Add('-----------------------------------------------------');
tmp := Base64Decode(tmp); //邮件标题BASE64解码
memo1.Lines.Add(tmp);
IdPOP31.Retrieve(i,IdMessage1); //接收到邮件所有内容
for j:=0 to idmessage1.MessageParts.Count-1 do
begin
try
if (IdMessage1.MessageParts.Items[j] is TIdAttachment) then
//匹配邮件条目是否是附件
Begin tmp:=Base64Decode(TIdAttachment(IdMessage1.MessageParts.tems[j]).FileName);
tmp := 'C:\'+tmp;
deletefile(tmp); TIdAttachment(IdMessage1.MessageParts.Items[j]).SaveToFile(tmp); //以原有文件名保存附件在指定目录
end
else begin
if (idmessage1.MessageParts.Items[j] is TidText) then
begin
if Message1.Body.Text<>'' then
sethtml(WebBrowser1,tidtext(idmessage1.MessageParts.Items[j]).Body.text)
else memo1.Lines.Add(tidtext(idmessage1.MessageParts.Items[j]).Body.text);
end;
end;
except
continue;
end;
end;
if checkbox1.Checked = true then
begin
try
idpop31.Delete(i); //删除收到的邮件
except
continue;
end;
end;
end;
idpop31.DisconnectSocket;
IdPOP31.Disconnect;
end;
发送邮件功能函数:
procedure TForm1.BitBtn2Click(Sender: TObject);
var
filename:string;
begin
IdSMTP1.Host := e_address.text;
idsmtp1.AuthenticationType := atLogin; //{atNone,atLogin}
IdSMTP1.Username := e_username.text;
IdSMTP1.Password := e_password.text;
filename := 'd:\comunition.rar1';
TIdattachment.Create(IdMessage1.MessageParts,filename); //加入附件
filename := 'd:\comunition.rar';
TIdattachment.Create(IdMessage1.MessageParts,filename); //加入多个附件
IdMessage1.From.Address := 'billanking2002@126.com'; //邮件来自哪里
IdMessage1.Recipients.EMailAddresses:='billanking2002@hotmail.com; //收件人
idMessage1.BccList.Add.Text := 'billanking2002@hotmail.com'; //抄送地址列表
idMessage1.BccList.Add.Text := 'billanking2002@yahoo.com.cn';
idMessage1.BccList.Add.Text := 'hyh@ctrl-tech.com';
IdMessage1.Subject:= '邮件客户端';
IdMessage1.Body.Text := Memo1.Text; //此处为邮件正文
IdMessage1.CharSet := 'gb2312'; //保证附件正文汉字的正常显示
idmessage1.ContentType := 'text/html'; //超文本方式传输
IdMessage1.Body.Assign(Memo1.Lines);
if IdSMTP1.AuthSchemesSupported.IndexOf('LOGIN')>-1 then
begin
IdSMTP1.AuthenticationType := atLogin;
//连接前要保存为Login 上面己设,此处不必要
IdSMTP1.Authenticate;
end;
try
IdSMTP1.Connect(); //连接SMTP服务器
IdSMTP1.Authenticate;
IdSMTP1.Send(IdMessage1); //向服务器发送邮箱
finally
if IdSMTP1.Connected then IdSMTP1.Disconnect; //断开与服务器的连接
end;
end;
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/billanking/archive/2010/12/18/6083616.aspx
delphi IdSMTP发送邮件的更多相关文章
- Delphi发送邮件...
///首先在控件栏定位到:Indy Clients加入控件IdSMTP ///再定位到:Indy Misc加入控件IdMessage ///发送邮件函数 procedure TForm1.SendMa ...
- Delphi 发送邮件 通过Office Outlook
Delphi 发送邮件 通过Office Outlook 网上搜到的Delphi邮件发送系统,绝大多数是使用SMTP协议来发送. 但是事实上它们已经过时了,大多数邮件服务器已经屏蔽了Delphi In ...
- delphi 调用QQ邮箱发送邮件
procedure TForm1.FormCreate(Sender: TObject); begin try IdSMTP1.AuthenticationType := atLogin; IdSMT ...
- 在Delphi中使用indy SMTP发送gmail邮件[转]
在Delphi中使用indy SMTP发送gmail邮件[转] 2012-01-01 22:44:30| 分类: Delphi | 标签: |举报 |字号大中小 订阅 在Delphi中发送 ...
- delphi2010发送邮件—中文显示为乱码解决
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVsbG9fbXlob21l/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...
- 技术笔记:Indy控件发送邮件
工作中有个需求需要发送邮件,因为使用的delphi6,所以自然就选择了indy组件,想想这事挺简单的.实现的过程倒是简单,看着Indy的demo很快就完了,毕竟也不是很复杂的功能. 功能要求: 1.压 ...
- delphi一些小技巧 从别处看到
开发环境-------- Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件.安装好Delphi ...
- (转载)Delphi开发经验谈
Delphi开发经验谈 开发环境-------- Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件. ...
- Delphi引用C对象文件
C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C ...
随机推荐
- 命令行选项解析函数getopt()
1.定义: int getopt(int argc, char * const argv[], const char *optstring); 2.描述: getopt是用来解析命令行选项参数的,但是 ...
- mysql错误问题处理
问题1.mysql 黑窗口出现错误 无法启动此应用程序 ,计算机中丢失MSVCP120.DLL,请重新安装 因为是从虚拟机上安装的新的系统,所以dos窗口输入mysql -v的时候出现了上述的错误,之 ...
- mybatis Plus 多表联合查询
//实体类package com.sk.skkill.entity; import com.baomidou.mybatisplus.annotation.TableField;import com. ...
- js中substr、substring、indexOf、lastIndexOf的用法
substr substr(start,length)表示从start位置开始,截取length长度的字符串 var str="imgs/header_2.jpg"; consol ...
- 4_1 古老的密码(UVa1339)<排序>
古罗马帝国与各部门有一个强有力的政府系统,包括一个秘密服务部门.重要的文件以加密的形式发送防止窃听.在那个时代最流行的密码被称为替代密码和置换密码.例如,应用替代密码,改变所有字母“A”到“Y”字母表 ...
- Java后台技术IBATIS入门
做过.net后台开发的同志一定用过Entity FrameWork,该框架实现了实体Entity到数据库行的映射,通过操作实体DataSet,就能够直接同步修改到数据库.但是Java暂时没有类似的技术 ...
- .NET中的字符串(3):字符串的比较
在.NET中,对字符串的比较操作并不仅仅是简单的比较二者的值,= =操作首先比较两个字符串的引用,如果引用相同,就直接返回True:如果不同再去比较它们的值.所以如果两个值相同的字符串的比较相对于引用 ...
- 【代码总结】PHP面向对象之类与对象
一.类和对象的关系 类的实体化结果是对象,而对象的抽象就是类.在开发过程中,我们通常都是先抽象(幻想)出一个类,再用该类去创建对象(实现幻想的内容).在程序中,直接使用的是我们(实现幻想)的对象,而不 ...
- 源代码管理工具(2)——SVN(2)——第一次用SVN遇到的问题
今天因为项目的需要第一次使用了svn来托管项目,第一使用svn遇到了几个问题. 这个安装的过程很简单,不再赘述.在安装完成之后,相信肯定有一部分第一次用这个的人直接到开始处打开这个软件,这时候就会弹出 ...
- Many Formulas
You are given a string S consisting of digits between 1 and 9, inclusive. You can insert the letter ...