Java实现QQ邮件发送客户端程序设计
目录
一、前言:QQ邮件发送程序
二、封装SMTP操作
三、实现多线程接收
四、QQ邮件客户端界面设计
1、连接按钮
2、发送按钮
五、QQ邮件发送效果演示
六、总结
一、前言:QQ邮件发送程序
!!!本项目上传微信公众号,可获取啦:关注我的博客下方微信公众号,发送“邮件客户端”获取。
在上一篇《Java网络编程:实现QQ邮件发送客户端》,我们解决了telnet终端发送邮件误操作带来的麻烦,实现了自己的简单Java界面进行发送QQ邮件,界面可直接与smtp.qq.com服务器端建立连接,通过命令方式发送邮件信息。
这一篇为QQ邮件发送客户端程序设计的下篇,将实现更加完善的功能,不用命令发送方式,类似日常发送邮件,直接编写邮件标题、内容,然后直接发送即可,基本实现了QQ邮件发送客户端的功能,操作更加简便,实现自己的QQ邮件发送端,以后就用这个啦。
Java实现socket通信网络编程系列文章:
- 基于UDP协议网络Socket编程(java实现C/S通信案例)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
- 基于TCP协议网络socket编程(java实现C/S通信)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
- Java多线程实现TCP网络Socket编程(C/S通信)【Java多线程实现TCP网络Socket编程(C/S通信)_陆海潘江小C的博客-CSDN博客_socket tcp 多线程发送】
- Java多线程实现多用户与服务端Socket通信【Java多线程实现多用户与服务端Socket通信_陆海潘江小C的博客-CSDN博客_java socket 多用户】
- Java进阶:基于TCP的网络实时聊天室(socket通信案例)【Java进阶:基于TCP的网络实时聊天室(socket通信案例)_陆海潘江小C的博客-CSDN博客】
- 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通信网络编程系列文章:
- 基于UDP协议网络Socket编程(java实现C/S通信案例)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
- 基于TCP协议网络socket编程(java实现C/S通信)【基于UDP协议网络Socket编程(java实现C/S通信案例)_陆海潘江小C的博客-CSDN博客_基于udp的socket编程。编写一个基于udp协议的socket网络通信应用程序,实现如下功】
- Java多线程实现TCP网络Socket编程(C/S通信)【Java多线程实现TCP网络Socket编程(C/S通信)_陆海潘江小C的博客-CSDN博客_socket tcp 多线程发送】
- Java多线程实现多用户与服务端Socket通信【Java多线程实现多用户与服务端Socket通信_陆海潘江小C的博客-CSDN博客_java socket 多用户】
- Java进阶:基于TCP的网络实时聊天室(socket通信案例)【Java进阶:基于TCP的网络实时聊天室(socket通信案例)_陆海潘江小C的博客-CSDN博客】
- Java网络编程:实现QQ邮件发送客户端【Java网络编程:实现QQ邮件发送客户端_陆海潘江小C的博客-CSDN博客】
我的CSDN博客:Java实现QQ邮件发送客户端程序设计_陆海潘江小C的博客-CSDN博客_如何编写一个qq邮件客户端
Java实现QQ邮件发送客户端程序设计相关推荐
- Java网络编程:实现QQ邮件发送客户端
目录 一.目标介绍 1.认识SMTP(邮件传输协议) 2.POP3(邮件接收协议) 二.基于Base64编码邮箱及授权码 1.开通QQ邮箱SMTP/POP3服务 2.Java编写BASE64编码程序 ...
- Java实现QQ邮件发送
QQ邮件发送 可以发送文本,图片,附件,同时可以将它们进行拼接发送. 功能代码被分成了4个方法,每个方法分别代表不同的发送方式,选择自己需要的方法即可. **实现发送邮件之前,先准备好QQ授权码.** ...
- Java实现QQ邮件发送原理和实现
电子邮件 在网络中实现邮件发送和接收的功能,就必须要有专门的邮件服务器(使用SMTP协议).我们发送一封邮件,先要经过各层路由,交换机,基站,然后存到该邮件服务器,(不同的邮件有不同的邮件服务器,比如 ...
- 利用python发送邮件_利用python实现简单的邮件发送客户端示例
脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...
- python实现邮件客户端_利用python实现简单的邮件发送客户端示例
脚本过于简单,供学习和参考.主要了解一下smtplib库的使用和超时机制的实现.使用signal.alarm实现超时机制. #!/usr/bin/env python # -*- coding: ut ...
- 最简单Java实现QQ邮箱发送验证码
Java使用QQ邮箱发送验证码 1. 开启服务,获取授权码 需登录自己的QQ邮箱,打开 POP3/SMTP 服务,并获取授权码. 具体操作: 登录邮箱 邮箱首页 "设置" 选择 & ...
- 通过QQ邮件发送文档到kindle,kindle收不到的问题
问题描述:通过QQ邮件发送文档到kindle,kindle收不到,已经按照网上的教程设置了,检查了好几遍,但就是发送不过去 问题原因:通过查看已发邮件发现发件人邮箱地址不是自己记的那个299XXX@q ...
- qq邮箱格式的Java代码_Java实现QQ邮件发送
首先我们需要两个jar包,点击下面即可下载这两个包: 我们这里采用QQ邮箱发送邮件为例,代码如下: package ddd; import java.util.Properties; import j ...
- java实现邮件发送_基于JavaMail的Java实现简单邮件发送功能
电子邮件的应用非常广泛,例如在某网站注册了一个账户,自动发送一封欢迎邮件,通过邮件找回密码,自动批量发送活动信息等.但这些应用不可能和我们自己平时发邮件一样,先打开浏览器,登录邮箱,创建邮件再发送.本 ...
最新文章
- securecrt 自动登录的设置
- 推荐算法 之协同过滤
- linux软件包管理 pdf,vSphere Storage Appliance 安装和管理 PDF
- qt5.13.2输出中文乱码
- 诗和远方:无题(五十一)
- linux多线程学习(七)——实现“生产者和消费者”
- this command with --force, or --legacy-peer-deps
- 阿里云服务器ECS建站教程
- php调查问卷数据库,关于一个问卷调查的程序,如何插入数据库
- http协议相关内容,C/S与B/S,ip报文,TCP,UDP
- 1、什么是实际的电压源与电流源?
- 去除水印PNAS-latex
- Android通讯录(联系人)-ContentProvider
- 国际知名营养品牌排行榜前十位
- 《人工智能杂记》人工智能简史
- [爬虫架构] 如何在分布式爬虫架构中动态维护一个代理IP池(付费代理)
- web系统开发中关于企业里各种系统分类
- 软件行业排名前100名的企业大全
- linux 查看主机的公网ip
- WinLogon登录管理和GINA简介 (转)