目录html
1、目标介绍java
一、开通QQ邮箱SMTP/POP3服务socket
一、编写客户端类测试
这篇博文记录学习使用Java实现相似QQ发送邮件的客户端,打算分为上下两篇完成,上篇从零开始学习,认识计算机网络邮件传输协议(SMTP、POP3),并开通QQ邮箱的smtp/pop3服务,为以后程序设计作准备,自行实现简单的Java GUI,经过命令方式发送邮件;下篇基于前面的基础,实现基本完整功能的,相似咱们平时QQ邮件发送的客户端,图形化界面简便了发送操做,另外增长了接收服务器反馈信息的功能,之后就可使用本身写的邮件发送程序给其余人发邮件啦,更快更方便๑乛◡乛๑
SMTP(简单邮件传输协议,RFC821)是一种提供可靠且有效的电子邮件传输协议。SMTP是创建在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知。
POP3,全名为Post Office Protocol - Version 3,即邮局协议版本3。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。
服务邮件发送的服务器其端口为25,服务邮件接收的服务器端口为110。
邮箱设置开启smtp/pop3服务,目前大部分邮箱开启服务时,须要设置第三方客户端使用的受权码,该受权码就是代替密码使用,目的是防止密码泄露。操做以下:
登陆邮箱,点击设置----帐户。
往下拉,找到POP3/SMTP服务,点击开启,完成验证以后点击生成受权码,记得复制保存,后续用到哦!
要成功地发送和接收邮件,用户名和密码(邮箱和受权码)须要BASE64编码后才能有效传输。
/* * BASE64.java * Copyright (c) 2020-12-21 * author : Charzous * All right reserved. */ import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import java.io.IOException; public class BASE64 { public static void main(String[] args) throws IOException { String userName="你的邮箱"; String authCode="生成的受权码"; //显示邮箱名的base64编码结果 System.out.println(encode(userName)); //显示受权码的base64编码结果 System.out.println(encode(authCode)); } public static String encode(String str){ return new BASE64Encoder().encode(str.getBytes()); } }
最后生成相似字符串:
Y3poX2NoYXJ6ZXVzQHFxLmNvbQ==
一、打开命令提示符,输入
telnet smtp.qq.com 25
二、按顺序输入,举例以下:
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次握手断开)
发送成功结果:
使用终端发送时,存在许多不方便的地方,好比输入错误,不能回退修改,只能回车输入,因此编写简单的Java界面来避免这些误操做带来的麻烦。用本身的程序代替telnet,来验证smtp发送给邮件的过程。
/* * TCPMailClient.java * Copyright (c) 2020-12-09 * author : Charzous * All right reserved. */ import java.io.*; import java.net.Socket; public class TCPMailClient { private Socket socket; private PrintWriter pw; private BufferedReader br; /** * @param ip * @param port * @return * @author Charzous * @date 2020/12/9 11:19 * */ public TCPMailClient(String ip, String port) throws IOException{ //主动向服务器发起链接,实现TCP三次握手 //不成功则抛出错误,由调用者处理错误 socket =new Socket(ip,Integer.parseInt(port)); //获得网络流输出字节流地址,并封装成网络输出字符流 OutputStream socketOut=socket.getOutputStream(); //参数true表示自动flush数据 pw=new PrintWriter(new OutputStreamWriter(socketOut,"utf-8"),true); //获得网络输入字节流地址,并封装成网络输入字符流 InputStream socketIn=socket.getInputStream(); br=new BufferedReader(new InputStreamReader(socketIn,"utf-8")); } public void send(String msg){ //输出字符流,由socket调用系统底层函数,经网卡发送字节流 pw.println(msg); try { //进行邮件交互,发送smtp指令之间应该暂停一段时间 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } public String receive(){ String msg=null; try { //从网络输入字符流中读取信息,每次只能接受一行信息 //不够一行时(无行结束符),该语句阻塞 //直到条件知足,程序往下运行 msg=br.readLine(); }catch (IOException e){ e.printStackTrace(); } return msg; } public void close(){ try { if (socket!=null) socket.close(); }catch (IOException e){ e.printStackTrace(); } } }
这里很容易发现,与以前TCP通讯相似,只须要链接到QQ邮件的发送服务器smtp.qq.com。
界面的建立使用JavaFx,可参考个人文章自行实现,相对简单。
本篇详细记录了使用Java网络编程的技术思想,初步实现QQ邮件发送客户端。从零开始学习,认识计算机网络邮件传输协议(SMTP、POP3),并开通QQ邮箱的smtp/pop3服务,为以后程序设计作准备,自行实现简单的Java GUI,经过命令方式发送邮件。
能够发现,如今只能经过命令发送请求,向服务器发送信息,因此仍是不太方便,因此下篇将实现非命令模式发送邮件,更好的用户体验,避免的繁琐的命令输入,等待下一篇的内容更新!
若是以为不错欢迎“一键三连”哦,点赞收藏关注,有问题直接评论,交流学习!
个人博客园:https://www.cnblogs.com/chenzhenhong/p/14168140.html
个人CSDN博客:https://blog.csdn.net/Charzous/article/details/110913974