目录

一、前言:QQ邮件发送程序

二、封装SMTP操作

三、实现多线程接收

四、QQ邮件客户端界面设计

1、连接按钮

2、发送按钮

五、QQ邮件发送效果演示

六、总结


一、前言:QQ邮件发送程序

!!!本项目上传微信公众号,可获取啦:关注我的博客下方微信公众号,发送“邮件客户端”获取

在上一篇《Java网络编程:实现QQ邮件发送客户端》,我们解决了telnet终端发送邮件误操作带来的麻烦,实现了自己的简单Java界面进行发送QQ邮件,界面可直接与smtp.qq.com服务器端建立连接,通过命令方式发送邮件信息。

这一篇为QQ邮件发送客户端程序设计的下篇,将实现更加完善的功能,不用命令发送方式,类似日常发送邮件,直接编写邮件标题、内容,然后直接发送即可,基本实现了QQ邮件发送客户端的功能,操作更加简便,实现自己的QQ邮件发送端,以后就用这个啦。

Java实现socket通信网络编程系列文章:

  1. 基于UDP协议网络Socket编程(java实现C/S通信案例)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
  2. 基于TCP协议网络socket编程(java实现C/S通信)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
  3. Java多线程实现TCP网络Socket编程(C/S通信)【Java多线程实现TCP网络Socket编程(C/S通信)_陆海潘江小C的博客-CSDN博客_socket tcp 多线程发送】
  4. Java多线程实现多用户与服务端Socket通信【Java多线程实现多用户与服务端Socket通信_陆海潘江小C的博客-CSDN博客_java socket 多用户】
  5. Java进阶:基于TCP的网络实时聊天室(socket通信案例)【Java进阶:基于TCP的网络实时聊天室(socket通信案例)_陆海潘江小C的博客-CSDN博客】
  6. Java网络编程:实现QQ邮件发送客户端【Java网络编程:实现QQ邮件发送客户端_陆海潘江小C的博客-CSDN博客】

二、封装SMTP操作

原来的终端发送逐步操作如下:

HELO hostname   //回车,hostname可以是IP或其他随意别名
AUTH LOGIN //回车后,先粘贴base64程序编码的完整邮箱名并回车;再粘贴base64编码的授权码并回车MAIL FROM:<czh_charzeus@qq.com>   //在这里填写自己的邮箱地址,用于发送邮件(注意冒号后面别有空格)
RCPT TO:<czh_charzeus@qq.com>  //接收方的邮箱,在这里暂时填写和上面一样的邮箱地址,即自己发送邮件给自己,验证是否成功
DATA       //回车,接下来开始发送邮件头相关内容
Subject: the simple mail     // 邮件的标题,回车
//在这里再多发送一行空行,来分隔邮件内容,下面就是邮件正文内容
Hello,the mail content!
测试发送邮件!   //控制台中中文会变成?的乱码,但不影响接受者接收到中文内容
.   //在邮件正文发送完毕后,单独用一行输入一个小圆点,作为结束标志,然后回车
QUIT   //结束通信(含4次握手断开)

因此,我们要避免这种繁琐的命令形式,只需要将每个语句封装到发送程序里面,在用户界面则无需进行命令的输入,只需要输入内容。

实现的方法很简单,只需要在发送按钮中,把命令加进去就可以,如下:

tcpMailClient.send("HELO friend");
tcpMailClient.send("auth login");String userNameBase64= encode(senderMail);
tcpMailClient.send(userNameBase64);
String authCode = encode("你的授权码");
tcpMailClient.send(authCode);
String msg = "mail from:<"+senderMail+">";
tcpMailClient.send(msg);msg = "rcpt to:<"+receiverMail+">";
tcpMailClient.send(msg);tcpMailClient.send("data");msg="from:"+senderMail;
tcpMailClient.send(msg);msg="to:"+receiverMail;
tcpMailClient.send(msg);msg="subject:"+sub;
tcpMailClient.send(msg);tcpMailClient.send("\n");
//                tcpMailClient.send("这是一封测试java客户端自动发送功能的邮件。");
tcpMailClient.send(content);tcpMailClient.send(".");tcpMailClient.send("quit");

从代码可以看到,当发送按钮一点击后,程序会执行所有语句,我们从上一篇知道,邮件服务器也会返回信息,所以QQ客户端需要使用多线程的技术,来处理返回信息,避免单线程阻塞导致发送不成功。

三、实现多线程接收

根据前面分析,将客户端接收的功能交给一个线程处理,就能够达到目的,不会因为接收语句阻塞使得主进程卡住。

所以,将线程放到连接按钮里面为好,在成功连接服务器之后,程序就启动线程,时机正好。连接按钮中的线程代码如下:

//用于接收服务器信息的单独线程
readThread = new Thread(()->{String receiveMsg=null;//从服务器接收一串字符while ((receiveMsg=tcpMailClient.receive())!=null){String msgTemp = receiveMsg;Platform.runLater(()->{taDisplay.appendText(msgTemp+"\n");});}Platform.runLater(()->{taDisplay.appendText("对话已关闭!\n");});
});readThread.start();

程序执行发送每一条命令语句的速度比我们自己输入发送要快许多,为了避免QQ邮件接收服务器无法及时响应出错,程序自动发送过程中需要设置一定的睡眠等待时间,在send方法设置等待200ms或者500ms。

QQ邮件客户端实现代码可见上一篇Java网络编程:实现QQ邮件发送客户端,这里不再重复介绍。

public void send(String msg){//输出字符流,由socket调用系统底层函数,经网卡发送字节流pw.println(msg);try {//进行邮件交互,发送smtp指令之间应该暂停一段时间Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}

四、QQ邮件客户端界面设计

界面的设计与以往类似,可以根据自己的需求设计不同的界面风格,可参考本文前言或者总结部分的系列文章进行实现。这里给出关键按钮的完整代码。

1、连接按钮

//连接按钮
btConn.setOnAction(event -> {String ip=ipAddress.getText().trim();String port=tfport.getText().trim();try {tcpMailClient = new TCPMailClient(ip, port);//成功连接服务器,接受服务器发来的第一条欢迎信息String firstMsg=tcpMailClient.receive();taDisplay.appendText(firstMsg+"\n");//用于接收服务器信息的单独线程readThread = new Thread(()->{String receiveMsg=null;//从服务器接收一串字符while ((receiveMsg=tcpMailClient.receive())!=null){//lambda表达式不能直接访问外部非final类型局部变量,需要定义一个临时变量//若将receiveMsg定义为类成员变量,则无需临时变量String msgTemp = receiveMsg;Platform.runLater(()->{taDisplay.appendText(msgTemp+"\n");});}Platform.runLater(()->{taDisplay.appendText("对话已关闭!\n");});});readThread.start();} catch (IOException e) {e.printStackTrace();}});

2、发送按钮

//发送按钮
btnSend.setOnAction(event -> {String senderMail = mail.getText().trim();String receiverMail = toMail.getText().trim();String sub = subject.getText();String content = tfSend.getText();try {tcpMailClient.send("HELO friend");tcpMailClient.send("auth login");String userNameBase64= encode(senderMail);tcpMailClient.send(userNameBase64);String authCode = encode("你的授权码");tcpMailClient.send(authCode);String msg = "mail from:<"+senderMail+">";tcpMailClient.send(msg);msg = "rcpt to:<"+receiverMail+">";tcpMailClient.send(msg);tcpMailClient.send("data");msg="from:"+senderMail;tcpMailClient.send(msg);msg="to:"+receiverMail;tcpMailClient.send(msg);msg="subject:"+sub;tcpMailClient.send(msg);tcpMailClient.send("\n");
//      tcpMailClient.send("这是一封测试java客户端自动发送功能的邮件。");tcpMailClient.send(content);tcpMailClient.send(".");tcpMailClient.send("quit");}catch (Exception e){taDisplay.appendText("服务器连接失败!"+e.getMessage()+"\n");}
});

QQ客户端的程序可以沿用之前的内容,详见这篇:基于TCP协议网络socket编程(java实现C/S通信)

五、QQ邮件发送效果演示

细心的读者可以发现,在我点击发送之后,程序卡断了一会,其实就是因为我设置发送睡眠1000ms,实际可以发送成功,建议设置200ms或以上!

发送到自己QQ邮箱:

发送到自己的126邮箱进行测试:

六、总结

这一篇为QQ邮件发送客户端程序设计的下篇,记录了实现的关键部分,不用命令发送方式,类似日常发送邮件,直接编写邮件标题、内容,然后直接发送即可,基本实现了QQ邮件发送客户端的功能,操作更加简便。根据本篇的知识内容,后面可以实现更加完善的QQ邮件发送小程序,增加一系列小功能!

!!!本项目上传微信公众号,可获取啦:关注我的博客下方微信公众号,发送“邮件客户端”获取

如果觉得不错欢迎“一键三连”哦,点赞收藏关注,有问题直接评论,交流学习!

Java实现socket通信网络编程系列文章:

  1. 基于UDP协议网络Socket编程(java实现C/S通信案例)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
  2. 基于TCP协议网络socket编程(java实现C/S通信)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
  3. Java多线程实现TCP网络Socket编程(C/S通信)【Java多线程实现TCP网络Socket编程(C/S通信)_陆海潘江小C的博客-CSDN博客_socket tcp 多线程发送】
  4. Java多线程实现多用户与服务端Socket通信【Java多线程实现多用户与服务端Socket通信_陆海潘江小C的博客-CSDN博客_java socket 多用户】
  5. Java进阶:基于TCP的网络实时聊天室(socket通信案例)【Java进阶:基于TCP的网络实时聊天室(socket通信案例)_陆海潘江小C的博客-CSDN博客】
  6. Java网络编程:实现QQ邮件发送客户端【Java网络编程:实现QQ邮件发送客户端_陆海潘江小C的博客-CSDN博客】

我的CSDN博客:Java实现QQ邮件发送客户端程序设计_陆海潘江小C的博客-CSDN博客_如何编写一个qq邮件客户端

Java实现QQ邮件发送客户端程序设计相关推荐

  1. Java网络编程:实现QQ邮件发送客户端

    目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...

  2. Java实现QQ邮件发送

    QQ邮件发送 可以发送文本,图片,附件,同时可以将它们进行拼接发送. 功能代码被分成了4个方法,每个方法分别代表不同的发送方式,选择自己需要的方法即可. **实现发送邮件之前,先准备好QQ授权码.** ...

  3. Java实现QQ邮件发送原理和实现

    电子邮件 在网络中实现邮件发送和接收的功能,就必须要有专门的邮件服务器(使用SMTP协议).我们发送一封邮件,先要经过各层路由,交换机,基站,然后存到该邮件服务器,(不同的邮件有不同的邮件服务器,比如 ...

  4. 利用python发送邮件_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  5. python实现邮件客户端_利用python实现简单的邮件发送客户端示例

    脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...

  6. 最简单Java实现QQ邮箱发送验证码

    Java使用QQ邮箱发送验证码 1. 开启服务,获取授权码 需登录自己的QQ邮箱,打开 POP3/SMTP 服务,并获取授权码. 具体操作: 登录邮箱 邮箱首页 "设置" 选择 & ...

  7. 通过QQ邮件发送文档到kindle,kindle收不到的问题

    问题描述:通过QQ邮件发送文档到kindle,kindle收不到,已经按照网上的教程设置了,检查了好几遍,但就是发送不过去 问题原因:通过查看已发邮件发现发件人邮箱地址不是自己记的那个299XXX@q ...

  8. qq邮箱格式的Java代码_Java实现QQ邮件发送

    首先我们需要两个jar包,点击下面即可下载这两个包: 我们这里采用QQ邮箱发送邮件为例,代码如下: package ddd; import java.util.Properties; import j ...

  9. java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能

    电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...

最新文章

  1. securecrt 自动登录的设置
  2. 推荐算法 之协同过滤
  3. linux软件包管理 pdf,vSphere Storage Appliance 安装和管理 PDF
  4. qt5.13.2输出中文乱码
  5. 诗和远方:无题(五十一)
  6. linux多线程学习(七)——实现“生产者和消费者”
  7. this command with --force, or --legacy-peer-deps
  8. 阿里云服务器ECS建站教程
  9. php调查问卷数据库,关于一个问卷调查的程序,如何插入数据库
  10. http协议相关内容,C/S与B/S,ip报文,TCP,UDP
  11. 1、什么是实际的电压源与电流源?
  12. 去除水印PNAS-latex
  13. Android通讯录(联系人)-ContentProvider
  14. 国际知名营养品牌排行榜前十位
  15. 《人工智能杂记》人工智能简史
  16. [爬虫架构] 如何在分布式爬虫架构中动态维护一个代理IP池(付费代理)
  17. web系统开发中关于企业里各种系统分类
  18. 软件行业排名前100名的企业大全
  19. linux 查看主机的公网ip
  20. WinLogon登录管理和GINA简介 (转)

热门文章

  1. IDEA debug 终止当前方法,避免运行接下来的代码造成资源错误
  2. 【2020年度征文】以梦为马,不负韶华
  3. 6.1 项目进度管理
  4. matlab二维图绘制分析总结
  5. \\老老实实用百度博客吧,HOHO、
  6. Pandas实现excel的透视表
  7. 软件构造Lab2实验总结
  8. uniapp radio如何实现取消选中
  9. 下一次工业革命:机器人如何帮助人类实现智能化变革
  10. 火车最少钢轨数目问题