1. SMTP简介
SMTP协议是邮件发送的应用层协议,被称为简单邮件传输协议,采用请求应答方式进行通讯,SMTP命令和响应是基于ASCII文本的,并且以回车换行符(CR和LF)结束,SMTP服务端的底层一般使用TCP协议,在掌握了TCP通讯的方法后,就可以自己实现一个简单的邮件发送客户端,关于TCP通讯的常用方法可以参见我上一篇博文鸿蒙网络编程系列3-TCP客户端通讯示例
SMTP的标准命令有14个,后来通过扩展命令又增加了一些,针对本文的示例,需要了解ehlo(问候信息)、auth login(登录)、mail from(发件人)、rcpt to(收件人)、data(邮件内容)、quit(登出)等命令,关于这些命令的详细解释可以查找相关文档,这些命令比较简单,不深入研究的话,光看看本文的具体示例也大概能明白用法。
2.邮件发送客户端示例
本示例演示登录腾讯邮箱SMTP服务器并发送邮件的过程,不同的邮件服务器对密码的定义可能不一样,在腾讯的邮件服务器里,密码是指授权码,可以登录官方网站了解生成方式。本示例成功登录并发送邮件后的截图如下所示:

对于应用界面,上部是邮箱服务器地址和用户名密码,腾讯邮箱服务器地址为smtp.qq.com,对应的ip地址为157.148.54.34;中部是要发送的邮件信息,包括收件人邮箱、标题、内容等部分;最下面是发送日志,把客户端和服务端交互的过程记录下来,方便调试分析。
下面详细介绍创建该应用的步骤。
步骤1:创建Empty Ability项目。
步骤2:在module.json5配置文件加上对权限的声明:
"requestPermissions": [
{
"name": "ohos.permission.INTERNET"
}
]
这里添加了访问互联网的权限。
步骤3:在Index.ets文件里添加如下的代码:
import socket from '@ohos.net.socket';
import util from '@ohos.util';
//执行TCP通讯的对象
let tcpSocket = socket.constructTCPSocketInstance();
@Entry
@Component
struct Index {
//连接、通讯历史记录
@State msgHistory: string = ''
//套接字是否已绑定本地地址
bindLocal: boolean = false
//服务器是否响应(发送数据到客户端)
isServerResponse: boolean = false
//服务端地址,smtp.qq.com的ip地址为157.148.54.34
@State serverAddr: string = "157.148.54.34"
//服务端端口,smtp.qq.com的端口为587
@State serverPort: number = 587
//用户名
@State userName: string = "用户名,一般是你的邮箱地址"
//密码,对于腾讯邮箱,这里是授权码
@State passwd: string = "you auth code or password"
//收件人邮箱列表(如果多个使用逗号分隔)
@State rcptList: string = "8888@qq.com,9999@gmail.com"
//邮件标题
@State mailTitle: string = "测试邮件标题"
//发件人邮箱
@State mailFrom: string = "你的邮箱"
//邮件内容
@State mailContent: string = "This is greeting from Harmony OS"
//是否可以登录
@State canLogin: boolean = false
//是否可以发送邮件
@State canSend: boolean = false
scroller: Scroller = new Scroller()
build() {
Row() {
Column() {
Text("邮件发送客户端")
.fontSize(14)
.fontWeight(FontWeight.Bold)
.width('100%')
.textAlign(TextAlign.Center)
.padding(10)
Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
Text("邮箱服务器地址:")
.width(120)
.fontSize(14)
.flexGrow(0)
TextInput({ text: this.serverAddr.toString() })
.onChange((value) => {
this.serverAddr = value
})
.width(110)
.fontSize(12)
.flexGrow(1)
}.width('100%')
.padding(5)
Flex({ justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center }) {
Text("邮箱服务器端口:")
.width(120)
.fontSize(14)

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



