![](https://i-blog.csdnimg.cn/blog_migrate/0d6cd21a00e505e066256e329bdba477.jpeg)
在我们的邮箱里,经常收到HTML格式的邮件。每注册一个网站的时候,总会收到一些他们发来的邮件,打开一后发现和一个网页一样,有图片、链接、文字,甚至有的还有声音和视频和交互。那我们想知道我们怎么才可以给朋友发送这样的邮件?特别是我们想知道如何在后台程序里自动发送HTML格式的认证邮件?
![](https://i-blog.csdnimg.cn/blog_migrate/c51ff4b3de8897338c92a4e692fe4e12.png)
--阿里云用户调查邮件
一、Delphi 发送邮件的实现
Delphi 发送邮件,实际上使用的就是 Indy 的 TIdSMTP 控件,该控件可以实现通过SMTP邮件服务器发送邮件,网上有很多介绍使用 TIdSMTP 这个控件的示例,TIdSMTP 发送邮件有两个地方网上的示例介绍的很少完整:
-
支持SSL:
对于这个问题,比如腾讯的企业邮箱指定必须要支持SSL,事实上现在很多邮件服务器都需要支持SSL,不提供不支持SSL的邮箱服务。如果不支持SSL,那么服务器的端口号是25,否则就是465。
Delphi的 TIdSMTP 控件如果需要支持SSL,就需要使用到TIdSSLIOHandlerSocketOpenSSL对象,该对象位于 IdSSLOpenSSL.pas 单元中。
同时还需要 libeay32.dll 和 ssleay32.dll 连个动态链接库的支持。否则使用 TIdSMTP 无法实现SSL邮件的发送。
需要引用的Indy单元列表:
//indy 相关单元
IdSMTP,
IdSSLOpenSSL,
IdExplicitTLSClientServerBase,
IdMessage,
IdMessageBuilder,
IdAttachmentFile,
...
需要使用的Indy控件及对象:
//indy SMTP 对象
FSMTP : TIdSMTP;
FOpenSSLHandler : TIdSSLIOHandlerSocketOpenSSL;
FIdMessage : TIdMessage;
//2. 创建邮件发送控件
FSMTP := TIdSMTP.Create(nil);
FOpenSSLHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
FIdMessage := TIdMessage.Create(nil);
FOpenSSLHandler.SSLOptions.Method := sslvTLSv1; //sslvSSLv23 ;//sslvSSLv3;
FSMTP.IOHandler := FOpenSSLHandler;
FSMTP.Port := 465; //加密的端口号 使用SSL发送邮件
FSMTP.UseTLS := utUseImplicitTLS;
-
发送 HTML 格式邮件
如果需要发送 HTML 邮件,需要使用到 TIdMessageBuilderHtml 对象,该对象位于 IdMessageBuilder.pas 单元中。
var
builder : TIdMessageBuilderHtml; //IdMessageBuilder.pas
TIdSMTP 控件时支持纯文本邮件和 HTML 格式邮件的,如果是纯文本邮件,则邮件的Body内容直接输入文本内容即可,如果是 HTML 格式邮件,邮件整个消息都需要使用 TIdMessageBuilderHtml 对象来生成。
//1.4 邮件内容,包括附件
if FContentType = TContentType.ctPlainText then
begin
Body.Text := FContent; //邮件正文Body内容
....
end
else
begin //HTML 邮件
builder := TIdMessageBuilderHtml.Create;
....
//写入 HTML 邮件正文Body内容
builder.Html.Text := FContent ;
....
builder.Free;
end;
-
支持多个附件
通过TIdAttachmentFile对象,可以实现支持多个邮件附件文件。
-
发送邮件函数格式
提供两个函数,分别支持同步发送和异步(线程)发布,两个函数的入口参数完全一致,就是函数名不同。
//同步发送邮件
Send_Email_sync(SMTPServer,Account,Password,Subject,Content,.....);
//异步发送邮件
Send_Email(SMTPServer,Account,Password,Subject,Content,.......);
发送邮件函数参数详细说明:
序号 | 参数名称 | 参数样例 | 参数说明 |
1 | SMTPServer | SMTP邮件服务器地址 | |
2 | Account | 发送邮件账号 | |
3 | Password | ****** | 发送邮件账号密码 |
4 | Subject | 2023年5.1放假通知 | 邮件的标题 |
5 | Content | ...... | 如果发送纯文本,则这里就是纯文本的邮件正文内容,如果发送HTML格式文件,这里就是HTML格式的邮件正文内容 |
6 | Attachment | c:\ABC\1.txt | 附件文件名称,多个附件之间用英文逗号分隔 |
7 | Recipients | 收件人邮件地址,多个地址用英文逗号分隔 | |
8 | BccLsit | 抄送人邮件地址,多个地址用英文逗号分隔 | |
9 | isHTMLContent | True | 逻辑型
|
10 | OnSendCompleted | nil | 表示邮件发送结束的回调函数,通知邮件已经发送结束,参数SendSuccessfully如果为True,表示邮件已经成功发送(对方是否接收到不能确定),如果为False,表示邮件发送失败,比如账号不存在,密码不正确等等。 |
发送邮件函数调用:
var
SMTPServer : string; //邮件服务器
Account : string; //邮件账号
Password : string; //账号密码
Subject : string; //邮件主题
Content : string; //邮件内容(PlainText HTML)
Attachment : string; //邮件附件,多个用英文逗号分隔
Recipients : string; //接收邮件地址列表,多个用英文逗号分隔
BccLsit : string; //抄送邮件地址列表,多个用英文逗号分隔
ContentType : TContentType;
begin
SMTPServer := LabeledEdit_SMTPServer.Text;
Account := LabeledEdit_Account.Text;
Password := LabeledEdit_Password.Text;
Subject := LabeledEdit_EMail_Subject.Text;
Content := Memo2.Text;
Attachment := LabeledEdit_EMail_Attachment.Text;
Recipients := LabeledEdit_Email_Recipients.Text;
BccLsit := LabeledEdit_Email_BccLsit.Text;
Label_Result.Caption := '';
//异步发送函数
Send_Email(SMTPServer,Account,Password,Subject,Content,Attachment,Recipients,BccLsit,True, OnSendCompleted);
//同步发送邮件
//Send_Email_sync(SMTPServer,Account,Password,Subject,Content,Attachment,Recipients,BccLsit,True, OnSendCompleted);
end;
二、演示程序
-
功能
-
支持SSL发送邮件;
-
支持32位和64位程序;
-
支持纯文本邮件和 HTML 格式邮件;
-
支持同步发送邮件和异步(线程)发送邮件
-
支持发送结果回调;
-
只需要调用一个函数,使用简单;
-
界面
![](https://i-blog.csdnimg.cn/blog_migrate/cae57a36519b7b530aef38a4a23f7d16.png)
发送 HTML 样板如下:
三、程序下载
序号 | 说明 |
1 | |
2 |