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发送邮件的更多相关文章

  1. Delphi发送邮件...

    ///首先在控件栏定位到:Indy Clients加入控件IdSMTP ///再定位到:Indy Misc加入控件IdMessage ///发送邮件函数 procedure TForm1.SendMa ...

  2. Delphi 发送邮件 通过Office Outlook

    Delphi 发送邮件 通过Office Outlook 网上搜到的Delphi邮件发送系统,绝大多数是使用SMTP协议来发送. 但是事实上它们已经过时了,大多数邮件服务器已经屏蔽了Delphi In ...

  3. delphi 调用QQ邮箱发送邮件

    procedure TForm1.FormCreate(Sender: TObject); begin try IdSMTP1.AuthenticationType := atLogin; IdSMT ...

  4. 在Delphi中使用indy SMTP发送gmail邮件[转]

    在Delphi中使用indy SMTP发送gmail邮件[转] 2012-01-01 22:44:30|  分类: Delphi |  标签: |举报 |字号大中小 订阅     在Delphi中发送 ...

  5. delphi2010发送邮件—中文显示为乱码解决

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGVsbG9fbXlob21l/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  6. 技术笔记:Indy控件发送邮件

    工作中有个需求需要发送邮件,因为使用的delphi6,所以自然就选择了indy组件,想想这事挺简单的.实现的过程倒是简单,看着Indy的demo很快就完了,毕竟也不是很复杂的功能. 功能要求: 1.压 ...

  7. delphi一些小技巧 从别处看到

    开发环境--------    Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件.安装好Delphi ...

  8. (转载)Delphi开发经验谈

    Delphi开发经验谈 开发环境-------- Delphi 7是一个很经典的版本,在Win2000/XP下推荐安装Delphi 7来开发软件,在Vista下推荐使用Delphi 2007开发软件. ...

  9. Delphi引用C对象文件

    C语言应用非常广泛,并在世界各地拥有大量的代码库.这些代码库与Delphi的可比性较小,因此如果我们无需转换为Delphi代码而可以直接使用这些库的部分代码就完美了.幸运的是,Delphi允许连接到C ...

随机推荐

  1. <位运算> 任意二进制数 异或两个相同的二进制数 还是原本的值

    二进制,即0与1. 因为两个相同的二进制 异或必为0.(类似于不进位加法) 二进制里与0异或为其原本的0与1.. 可得任意二进制数 异或两个相同的二进制数 还是原本的值. 可用于交换和加密.

  2. Codeforces Round #620 (Div. 2) E

    LCA的倍增 模板: ], depth[maxn]; int dist[maxn],head[maxn]; void add(int u,int v,int dist0){ a[tot].next=h ...

  3. windows centos php-beast 安装

    https://github.com/imaben/php-beast-binaries windows下 可以直接在这里下载dll 根据自己的php版本  还有是不是线程安全的 来选择下载对应的 放 ...

  4. HTML使用链接调用本地exe文件

    一,win+r打开注册表,输入regedit进入注册表 二,在注册表左边最上面HKEY_CLASSES_ROOT那个树右键新建项.该项的名称自己命名,其实该名称也是协议的名称. 我们调用的时候就是根据 ...

  5. C#加密解密(AES)-AESHelper

    原文地址:https://ken.io/note/csharp-aesencrypt using System; namespace Encrypt { public class AESHelper ...

  6. Windows事件ID

    51 Windows 无法找到网络路径.请确认网络路径正确并且目标计算机不忙或已关闭.如果 Windows 仍然无法找到网络路径,请与网络管理员联系. 52 由于网络上有重名,没有连接.请到“控制面板 ...

  7. WLC HA-维护模式(Maintenance Mode)

    为什么会进入维护模式?试想一下,当一个HA组网中的两个控制器,发生了故障,两个WLC都为active,是否会出现问题?可以想象AP是什么情况,所以,WLC进入维护模式是为了避免脑裂的情况,为了避免这种 ...

  8. 三年以上php开发经验常见面试题

    01 一般有三年以上php开发经验去百度.腾讯面试,常会接触的面试题小总结一下: 02 0.简单做一下自我介绍,?  然后谈一下近三年来你的得意之作? 03 1.面试官看过你的简历,会问一些你做的项目 ...

  9. Docker 之registry私有仓库搭建

    Docker 之registry私有仓库搭建 官方提供的私有仓库docker registry用法 https://yeasy.gitbooks.io/docker_practice/reposito ...

  10. Git三招

    一.Git提交指令 git init git第一次使用在当前文件夹初始化一个git仓库,第二次不需要 git add . 把当前文件夹所有文件添加到缓存区中. 可以选特定的文件夹或文件.将后面的.改变 ...