当前位置: 首页 > news >正文

dede网站模板页在什么文件夹免费的自助建站

dede网站模板页在什么文件夹,免费的自助建站,河南火焰山网站开发禹,简约大气网站欣赏1. SMTP邮件发送客户端 在本系列的第4篇文章《鸿蒙网络编程系列4-实现SMTP邮件发送客户端》中,基于ArkTS语言在API9环境下使用TCPSocket对象演示了SMTP客户端的实现,并且通过腾讯邮件服务器执行了实际的邮件发送。不过,在2024年末&#xff0…

1. SMTP邮件发送客户端

在本系列的第4篇文章《鸿蒙网络编程系列4-实现SMTP邮件发送客户端》中,基于ArkTS语言在API9环境下使用TCPSocket对象演示了SMTP客户端的实现,并且通过腾讯邮件服务器执行了实际的邮件发送。不过,在2024年末,腾讯发了一个通知,从2024年11月20日开始,停用以明文非加密方式登录的第三方邮件客户端,必需启用SSL/TLS加密方式。不过,除了腾讯邮件发送服务器,还有很多其他邮件服务器支持使用明文登录,其中比较知名的有搜狐邮箱,可以通过如下的方式启用:

保存的时候,搜狐邮箱会自动生成独立密码,将来可以使用这个密码执行登录。

本文将使用仓颉语言在API17环境下实现SMTP邮件发送客户端,具体的邮件发送将通过搜狐邮箱实现,关于SMTP协议的相关基础知识,可以参考本系列第4篇文章的第一部分,这里不再赘述。

2. 邮件发送客户端示例演示

本示例运行后的页面如图所示:

输入SMTP服务器地址和端口(这里输入的是搜狐邮箱发送服务器的地址),再输入邮箱用户名和登录密码,此时就可以单击“登录”按钮执行登录了,如图所示:

登录成功后,输入收件人、发件人邮箱地址以及邮件的标题和内容,再单击下面的“发送邮件”按钮,既可以执行邮件发送,过程如下所示:

发送成功后,登录收件人的邮箱,就可以查看发送的邮件了,邮件内容如下所示:

3. 邮件发送客户端示例编写

下面详细介绍创建该示例的步骤(确保DevEco Studio已安装仓颉插件)。

步骤1:创建[Cangjie]Empty Ability项目。

步骤2:在module.json5配置文件加上对权限的声明:

"requestPermissions": [{"name": "ohos.permission.INTERNET"}]

这里添加了访问互联网的权限。

步骤3:在build-profile.json5配置文件加上仓颉编译架构:

"cangjieOptions": {"path": "./src/main/cangjie/cjpm.toml","abiFilters": ["arm64-v8a", "x86_64"]}

步骤4:在index.cj文件里添加如下的代码:

package ohos_app_cangjie_entryimport ohos.base.*
import ohos.component.*
import ohos.state_manage.*
import ohos.state_macro_manage.*
import std.collection.HashMap
import std.convert.*
import std.net.*
import std.socket.*
import encoding.base64.toBase64String@Entry
@Component
class EntryView {@Statevar title: String = 'SMTP邮件发送客户端示例';//连接、通讯历史记录@Statevar msgHistory: String = ''//服务器是否响应(发送数据到客户端)var isServerResponse: Bool = false//服务端地址,smtp.sohu.com的ip地址为116.130.217.16@Statevar serverAddr: String = "116.130.217.16"//服务端端口,smtp.sohu.com的端口为25,不同的smtp服务器端口可能不一样@Statevar serverPort: UInt16 = 25//用户名@Statevar userName: String = "youmail@sohu.com"//密码,对于搜狐邮箱,这里是独立密码@Statevar passwd: String = "youpassword"//收件人邮箱列表(如果多个使用逗号分隔)@Statevar rcptList: String = "*****@sohu.com,****@qq.com"//发件人邮箱@Statevar mailFrom: String = "youmail@sohu.com"//邮件标题@Statevar mailTitle: String = "测试邮件标题"//邮件内容@Statevar mailContent: String = "这是来自鸿蒙的问候!"//是否正在登录@Statevar isLogin: Bool = false//是否可以发送邮件@Statevar canSend: Bool = false//TCP客户端var tcpClient: ?TcpSocket = Nonelet scroller: Scroller = Scroller()func build() {Row {Column {Text(title).fontSize(14).fontWeight(FontWeight.Bold).width(100.percent).textAlign(TextAlign.Center).padding(10)Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {Text("SMTP服务器地址:").fontSize(14)TextInput(text: serverAddr).onChange({value => serverAddr = value}).width(100).fontSize(11).flexGrow(1)Text(":").fontSize(14)TextInput(text: serverPort.toString()).onChange({value => serverPort = UInt16.parse(value)}).setType(InputType.Number).width(80).fontSize(11)}.width(100.percent).padding(5)Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {Text("邮箱用户名:").fontSize(14).width(100).flexGrow(0)TextInput(text: userName).onChange({value => userName = value}).width(110).fontSize(12).flexGrow(1)}.width(100.percent).padding(5)Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {Text("登录密码:").fontSize(14).width(100).flexGrow(0)TextInput(text: passwd).onChange({value => passwd = value}).setType(InputType.Password).width(110).fontSize(12).flexGrow(1)Button("登录").onClick {evt => login()}.enabled(!isLogin && userName != "" && passwd != "").width(70).fontSize(14)}.width(100.percent).padding(5)Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {Text("收件人邮箱:").fontSize(14).width(100).flexGrow(0)TextArea(placeholder: "多个收件人使用逗号分隔", text: rcptList).onChange({value => rcptList = value}).width(110).fontSize(12).flexGrow(1)}.width(100.percent).padding(5)Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {Text("发件人邮箱:").fontSize(14).width(100).flexGrow(0)TextInput(text: mailFrom).onChange({value => mailFrom = value}).width(110).fontSize(12).flexGrow(1)}.width(100.percent).padding(5)Flex(FlexParams(justifyContent: FlexAlign.Start, alignItems: ItemAlign.Center)) {Text("邮件标题:").fontSize(14).width(100).flexGrow(0)TextInput(text: mailTitle).onChange({value => mailTitle = value}).width(110).fontSize(12).flexGrow(1)}.width(100.percent).padding(5)Flex(FlexParams(direction: FlexDirection.Column, justifyContent: FlexAlign.Start,alignItems: ItemAlign.Center)) {Text("邮件内容:").fontSize(14).width(100.percent)TextArea(placeholder: "请输入要发送的邮件内容", text: mailContent).onChange({value => mailContent = value}).width(100.percent).height(80).fontSize(12)Row() {Button("发送邮件").onClick {evt => sendMail()}.enabled(canSend).width(100).fontSize(14)}.width(100.percent).justifyContent(FlexAlign.End)Scroll(scroller) {Text(msgHistory).textAlign(TextAlign.Start).padding(10).width(100.percent).backgroundColor(0xeeeeee)}.align(Alignment.Top).backgroundColor(0xeeeeee).height(200).flexGrow(1).scrollable(ScrollDirection.Vertical).scrollBar(BarState.On).scrollBarWidth(20)}.width(100.percent).padding(5).flexGrow(1).height(300)}.width(100.percent).height(100.percent)}.height(100.percent)}//发送命令到服务器func sendCmd2ServerWithCRLF(cmd: String) {let fullCmd: String = cmd + "\r\n"tcpClient?.write(fullCmd.toArray())msgHistory += "C:${cmd}\r\n"}//从服务器读取消息func readMsgFromServer() {let buffer = Array<UInt8>(1024, item: 0)//从socket读取数据var readCount = tcpClient?.read(buffer)//把接收到的数据转换为字符串let content = String.fromUtf8(buffer[0..readCount.getOrThrow()])msgHistory += "S:${content}"return content}//登录func login() {tcpClient = TcpSocket(serverAddr, serverPort)isLogin = true//启动一个线程执行登录spawn {try {tcpClient?.connect()msgHistory += "C:连接成功!\r\n"} catch (err: Exception) {msgHistory += "C:连接失败${err.message}!\r\n"isLogin = falsereturn}try {sendCmd2ServerWithCRLF("ehlo anyname")var content = readMsgFromServer()sendCmd2ServerWithCRLF("auth login")content = readMsgFromServer()sendCmd2ServerWithCRLF(toBase64String(userName.toArray()))content = readMsgFromServer()sendCmd2ServerWithCRLF(toBase64String(passwd.toArray()))content = readMsgFromServer()canSend = true} catch (exp: Exception) {msgHistory += "从Socket读取数据错误:${exp}\r\n"}isLogin = false}}func sendMail() {//启动一个线程执行发送spawn {try {sendCmd2ServerWithCRLF("mail from:<${mailFrom}>")var content = readMsgFromServer()for (rcpt in rcptList.split(",")) {sendCmd2ServerWithCRLF("rcpt to:<${rcpt}>")content = readMsgFromServer()}//准备发送邮件内容sendCmd2ServerWithCRLF("data")content = readMsgFromServer()let mailBody = "Subject: ${mailTitle} \r\nFrom: ${mailFrom}\r\n\r\n${mailContent}\r\n."sendCmd2ServerWithCRLF(mailBody)content = readMsgFromServer()sendCmd2ServerWithCRLF("quit")content = readMsgFromServer()} catch (exp: Exception) {msgHistory += "从套接字读取数据错误:${exp}\r\n"}}}
}

步骤5:编译运行,可以使用模拟器或者真机。

步骤6:按照本文第2部分“邮件发送客户端示例演示”操作即可。

4. 代码分析

本文的核心代码主要是两个函数,第一个是发送命令到服务器的函数sendCmd2ServerWithCRLF,该函数在发送命令给服务器时,会在命令后面添加回车换行符号,然后调用tcpClient的write函数执行实际的发送。第二个是从服务器读取消息的函数readMsgFromServer,该函数会从套接字读取数据并写入到缓冲区buffer中,然后把数据转换为字符串。

需要特别注意的是,为了简化开发,第二个函数假设可以一次性读取服务器的完整回复,并且服务器的回复不超过1024字节,这个假设一般是成立的,不过,在一些特殊情况下,比如网络不太好,或者网络数据“粘包”,可能会出现接收问题。这时候,可以通过更复杂的代码来解决,这里就不展开了,可以参考本系列相关的“TCP粘包”文章。

(本文作者原创,除非明确授权禁止转载)

本文源码地址:
https://gitee.com/zl3624/harmonyos_network_samples/tree/master/code/tcp/SmtpClient4Cj

本系列源码地址:
https://gitee.com/zl3624/harmonyos_network_samples


文章转载自:
http://suit.yqsq.cn
http://cutie.yqsq.cn
http://winnipeg.yqsq.cn
http://bipinnate.yqsq.cn
http://flickeringly.yqsq.cn
http://technologist.yqsq.cn
http://seventh.yqsq.cn
http://agley.yqsq.cn
http://originative.yqsq.cn
http://galvanography.yqsq.cn
http://multivalence.yqsq.cn
http://theologaster.yqsq.cn
http://panhellenism.yqsq.cn
http://obsecration.yqsq.cn
http://remonstrance.yqsq.cn
http://rabia.yqsq.cn
http://insipience.yqsq.cn
http://watchout.yqsq.cn
http://geanticline.yqsq.cn
http://brickmaking.yqsq.cn
http://poikilothermic.yqsq.cn
http://salbutamol.yqsq.cn
http://electrometer.yqsq.cn
http://rezident.yqsq.cn
http://crepitation.yqsq.cn
http://victoriousness.yqsq.cn
http://purlicue.yqsq.cn
http://galactokinase.yqsq.cn
http://adenase.yqsq.cn
http://breakthrough.yqsq.cn
http://countermarch.yqsq.cn
http://qbp.yqsq.cn
http://urology.yqsq.cn
http://denatant.yqsq.cn
http://breeder.yqsq.cn
http://calligraph.yqsq.cn
http://favus.yqsq.cn
http://tianjing.yqsq.cn
http://friskful.yqsq.cn
http://tightwad.yqsq.cn
http://biographic.yqsq.cn
http://earthen.yqsq.cn
http://contractant.yqsq.cn
http://slaister.yqsq.cn
http://mediagenic.yqsq.cn
http://shortchange.yqsq.cn
http://rongeur.yqsq.cn
http://rubensesque.yqsq.cn
http://untiring.yqsq.cn
http://notarization.yqsq.cn
http://ministration.yqsq.cn
http://jaculation.yqsq.cn
http://abranchial.yqsq.cn
http://saloop.yqsq.cn
http://frightened.yqsq.cn
http://handjob.yqsq.cn
http://centimillionaire.yqsq.cn
http://annuli.yqsq.cn
http://funniment.yqsq.cn
http://zambra.yqsq.cn
http://marked.yqsq.cn
http://galling.yqsq.cn
http://hematite.yqsq.cn
http://xi.yqsq.cn
http://ovariectomize.yqsq.cn
http://wanderingly.yqsq.cn
http://rattler.yqsq.cn
http://endosome.yqsq.cn
http://minded.yqsq.cn
http://obese.yqsq.cn
http://summarize.yqsq.cn
http://svetlana.yqsq.cn
http://stoneworker.yqsq.cn
http://compassionate.yqsq.cn
http://unicef.yqsq.cn
http://psellism.yqsq.cn
http://neoptolemus.yqsq.cn
http://hailstorm.yqsq.cn
http://landocracy.yqsq.cn
http://noise.yqsq.cn
http://deathward.yqsq.cn
http://preamplifier.yqsq.cn
http://iridocapsulitis.yqsq.cn
http://usquebaugh.yqsq.cn
http://westpolitik.yqsq.cn
http://nutwood.yqsq.cn
http://krim.yqsq.cn
http://irian.yqsq.cn
http://chloramine.yqsq.cn
http://ammocolous.yqsq.cn
http://outcurve.yqsq.cn
http://hexasyllabic.yqsq.cn
http://capotasto.yqsq.cn
http://cobby.yqsq.cn
http://muton.yqsq.cn
http://resignedly.yqsq.cn
http://placentography.yqsq.cn
http://rijsttafel.yqsq.cn
http://shrubby.yqsq.cn
http://passport.yqsq.cn
http://www.dt0577.cn/news/94959.html

相关文章:

  • wordpress顶部代码宁波搜索引擎优化seo
  • 做网站设计的广告公司中国推广网
  • 移动端网站开发流程图app宣传推广方案
  • 模板网站有利于做seo吗百度seo关键词优化方案
  • 免费自助建站网站一览自助建网站域名收录查询
  • 个人网站备案名称填写线上推广费用
  • 免费用手机做网站网推项目
  • 如何用dw做网站设计惠州网络推广平台
  • 网页qq邮箱怎么在手机下文件怎么打开wordpressseo数据监控平台
  • 装饰设计素描的秩序化构成包括seo优化网站推广全域营销获客公司
  • wordpress慢 数据库平台seo什么意思
  • 模板建站推荐东方靠谱北京seo网站推广
  • 有什么做兼职的网站qq推广链接
  • 深圳图派做的网站后台加什么图片搜索图片识别
  • 株洲疫情最新消息今天封城了没有seo技巧分享
  • wordpress怎么mip常州网站seo
  • 有那些网站网站联盟营销
  • 网站中二级导航栏怎么做seo快速排名百度首页
  • 北京网站建设公司怎么排版推广引流吸引人的文案
  • 汉阳做网站推广普通话内容
  • 个人网站 商业如何进行线上推广
  • ps做图游戏下载网站网络推广渠道有哪些
  • wordpress需要什么安装环境网站seo教程
  • 网站突然搜不到了网络推广营销网站建设专家
  • 阿里云 建设网站中国万网域名查询
  • 公司网站的建设湖南网站排名
  • dw做网站导航条360关键词推广
  • 昆山专业做网站网站运营方案
  • 时尚网站策划德芙巧克力软文推广
  • 王也天年龄象山关键词seo排名