Delphi 实现HTML邮件发送

news2025/7/17 10:03:46

在我们的邮箱里,经常收到HTML格式的邮件。每注册一个网站的时候,总会收到一些他们发来的邮件,打开一后发现和一个网页一样,有图片、链接、文字,甚至有的还有声音和视频和交互。那我们想知道我们怎么才可以给朋友发送这样的邮件?特别是我们想知道如何在后台程序里自动发送HTML格式的认证邮件?

--阿里云用户调查邮件

一、Delphi 发送邮件的实现

Delphi 发送邮件,实际上使用的就是 Indy 的 TIdSMTP 控件,该控件可以实现通过SMTP邮件服务器发送邮件,网上有很多介绍使用 TIdSMTP 这个控件的示例,TIdSMTP 发送邮件有两个地方网上的示例介绍的很少完整:

  1. 支持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;

  1. 发送 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;
  1. 支持多个附件

通过TIdAttachmentFile对象,可以实现支持多个邮件附件文件。

  1. 发送邮件函数格式

提供两个函数,分别支持同步发送和异步(线程)发布,两个函数的入口参数完全一致,就是函数名不同。

//同步发送邮件

Send_Email_sync(SMTPServer,Account,Password,Subject,Content,.....);

//异步发送邮件

Send_Email(SMTPServer,Account,Password,Subject,Content,.......);

发送邮件函数参数详细说明:

序号

参数名称

参数样例

参数说明

1

SMTPServer

smtp.exmail.qq.com

SMTP邮件服务器地址

2

Account

nnnn@qq.com

发送邮件账号

3

Password

******

发送邮件账号密码

4

Subject

2023年5.1放假通知

邮件的标题

5

Content

......

如果发送纯文本,则这里就是纯文本的邮件正文内容,如果发送HTML格式文件,这里就是HTML格式的邮件正文内容

6

Attachment

c:\ABC\1.txt

附件文件名称,多个附件之间用英文逗号分隔

7

Recipients

910731685@qq.com

收件人邮件地址,多个地址用英文逗号分隔

8

BccLsit

aaa@Gmail.com

抄送人邮件地址,多个地址用英文逗号分隔

9

isHTMLContent

True

逻辑型

  • True 表示发送的是HTML格式邮件

  • False 表示发送纯文本邮件

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;

二、演示程序

  1. 功能

  1. 支持SSL发送邮件;

  1. 支持32位和64位程序;

  1. 支持纯文本邮件和 HTML 格式邮件;

  1. 支持同步发送邮件和异步(线程)发送邮件

  1. 支持发送结果回调;

  1. 只需要调用一个函数,使用简单;

  1. 界面

发送 HTML 样板如下:

三、程序下载

序号

说明

1

执行程序下载(Send_Email.exe)

2

源程序下载,包含全部源代码,Delphi 11.2下开发(¥14.9)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/396429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【FLY】Java知识点总结

目录认识Java概念图名词解释历史版本基础知识编程规范关键字数据类型运算符数组Stringequals与流程控制引用数据结构常用数据结构HashMapLinkedHashMapWeakHashMapIdentityHashMapEnumMapTreeMapCopyOnWriteArrayList面向对象类反射注解IO异常线程EffectiveJava8JVM运行时数据区…

MXNet的机器翻译实践《编码器-解码器(seq2seq)和注意力机制》

机器翻译就是将一种语言翻译成另外一种语言,输入和输出的长度都是不定长的,所以这里会主要介绍两种应用,编码器-解码器以及注意力机制。编码器是用来分析输入序列,解码器用来生成输出序列。其中在训练时,我们会使用一些…

centos7安装教程

1.点击文件–新建虚拟机 2.根据图片一直下一步或者做一些改动 3. 点击自定义硬件,点击浏览选中下载好的ISO文件 4.配置完成后启动虚拟机 5.选择语言,中英文都可,按需求选择 6.进行设置目标位置,配置分区 7.选择网络和主机名 8.配置…

.net6 web api使用EF Core,根据model类自动生成表

1.安装EF Core和mysql数据库的nuget包 Microsoft.EntityFrameworkCore Pomelo.EntityFrameworkCore.MySql 2.创建models文件夹,在文件夹下创建实体类 public class Users{public int Id { get; set; }[Column(TypeName "varchar(200)"), Required]publ…

Streaming systems 第三章中文

Chapter 3. Watermarks GIthub链接,欢迎志同道合的小伙伴一起翻译 到目前为止,我们一直从pipeline设计者或数据科学家的角度来研究流处理。第二章介绍了水印,对事件时间处理中发生的位置和处理时间中结果何时输出的基本问题做了一部分回答。…

制造企业数字化工厂建设步骤的建议

随着工业4.0、中国制造2025的深度推进,越来越多的制造企业开始迈入智能制造的领域,那数字工厂要从何入手呢? 数字工厂规划的核心,也正是信息域和物理域这两个维度,那就从这两个维度来进行分析,看如何进行数…

MySQL架构篇

一、进阶学习环境说明 1.1 MySQL服务器环境 Linux虚拟机:CentOS 7 MySQL:MySQL5.7.30 在Linux服务器中安装MySQL: ps.如果有自己的云服务器,可忽略前两步,直接进行第三步 1.2 服务器日志文件说明 MySQL是通过文件系统对…

论文投稿指南——中文核心期刊推荐(经济管理)

【前言】 🚀 想发论文怎么办?手把手教你论文如何投稿!那么,首先要搞懂投稿目标——论文期刊 🎄 在期刊论文的分布中,存在一种普遍现象:即对于某一特定的学科或专业来说,少数期刊所含…

什么蓝牙耳机好用戴着舒适?佩戴舒适音质好的无线蓝牙耳机

戴耳机时间长会导致耳朵痛,时间长了对我们的听力还有影响。一款佩戴舒适的耳机更贴合耳朵的设计,能够带来更加优质的聆听体验,下面甄选出了几款佩戴比较舒适的耳机推荐,音质还非常出众。 一、南卡小音舱蓝牙耳机 单耳重量&#x…

Protobuf 使用和原理

文章目录1. protobuf 简介1.1. 发展背景1.2. 优缺点1.2.1. 优点1.2.2. 缺点2. 使用2.1. 消息类型2.1.1. 字段限制2.1.2. 数据类型2.1.3. 分配字段编号2.1.4. 保留字段2.1.5. 默认字段规则2.1.6. 枚举2.2. Protobuf 工作流程2.2.1 编译proto文件2.3. 使用建议3. 原理3.1. 编码格…

抓包工具fiddler详细使用教程

各位做测试的同学想必对抓包工具fiddler并不陌生,但是很多同学可能没有总结过它的用法,下面我总结了fiddler一些常用的用法。 Web端抓包配置 打开Fiddler,Tools -> Fiddler Options -> HTTPS 配置完后记得要重启Fiddler 选中Decrpt …

第2章 线程安全与共享资源竞争

第2章 线程安全与共享资源竞争 2.1 synchronized同步介绍 synchronized要解决的是共享资源冲突的问题。当共享资源被任务使用时,要对资源提前加锁。所有任务都采用抢占模式,即某个任务会抢先对共享资源加上第一把锁。如果这是一个排他锁,…

汇编指令学习(LOOP)

一、xor异或操作,相同为0,不同为1xor eax,eaxeax异或eax,相同为0,并把结果存放到eax,简单说该语句就是想eax寄存器清零。二、ECX,计数器mov ecx,0x3将ecx寄存器设置为3三、DEC减一操作dec ecxecx寄存器的值…

扬帆优配|昔日白马股濒临退市,却6天5涨停!ST股突然集体爆发

尽管再度重申“公司股票将被停止上市”,但3月8日早间,*ST辅仁股价仍是在开盘后快速封住涨停板。这已是该公司近6个买卖日来,第5次呈现涨停。 无独有偶,8日早间ST东瀛也在此前多次涨停后,再度呈现近4%的涨幅。而就在7日…

图像的读取与保存

图像是由一个个像素点组成,像素点就是颜色点,而颜色最简单的方式就是用RGB或RGBA表示图像保存图像将像素信息按照 一定格式,一定顺序(即编码) 存在硬盘上的 二进制文件 中保存图像需要以下必要信息:1. 文件…

ChatGPT的N种用法(持续更新中。。。)

目录前言一、语法更正二、文本翻译三、语言转换3-1、Python-->JAVA四、代码解释-1五、代码解释-2六、修复代码错误六、作为百科全书七、信息提取七、好友聊天八、创意生成器8-1、VR和密室结合8-2、再结合AR九、采访问题9-1、采访问题清单9-2、采访问题清单并给出相应答案十、…

优思学院|六西格玛管理的核心理念是什么?

六西格玛管理是一种基于数据分析的质量管理方法,旨在通过降低过程的变异性来达到质量稳定和优化的目的。该方法以希腊字母“σ”为名,代表标准差,是衡量过程变异性的重要指标。 六西格玛管理的核心理念是“以客户为中心、以数据为基础、追求…

【JAVA程序设计】【C00114】基于SSM+微信小程序的食堂订餐点餐管理系统——有文档

基于微信小程序的食堂订餐点餐管理系统项目简介项目获取开发环境项目技术运行截图项目简介 基于ssm框架管理前端使用vue,用户使用微信小程序的食堂订餐点餐小程序共分为三个角色:系统管理员、商家、用户 管理员角色包含以下功能: 首页展示、…

提升数字品牌的5个技巧

“品牌”或“品牌推广”的概念通常用于营销。因为建立您的企业品牌对于产品来说极其重要,品牌代表了您与客户互动的身份和声音。今天,让我们来看看在数字领域提升品牌的一些有用的技巧。如何在数字领域提升您的品牌?在了解这些技巧之前&#…

Android特别的数据结构(二)ArrayMap源码解析

1. 数据结构 public final class ArrayMap<K,V> implements Map<K,V> 由两个数组组成&#xff0c;一个int[] mHashes用来存放Key的hash值&#xff0c;一个Object[] mArrays用来连续存放成对的Key和ValuemHashes数组按非严格升序排列初始默认容量为0减容&#xff…