当前位置:宁波企业邮 » 企业目录 » 重庆 » 文章详细

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

目录

一、目标介绍

1、认识SMTP(邮件传输协议)

 2、POP3(邮件接收协议)

二、基于Base64编码邮箱及授权码

1、开通QQ邮箱SMTP/POP3服务

2、Java编写BASE64编码程序

三、telnet命令发送邮件

四、Java图形界面进行SMTP交互发邮件

1、编写客户端类

2、创建QQ邮件发送图形界面 

五、总结及下篇预告


一、目标介绍

这篇博文记录学习使用Java实现类似QQ发送邮件的客户端,打算分为上下两篇完成,上篇从零开始学习,认识计算机网络邮件传输协议(SMTP、POP3),并开通QQ邮箱的smtp/pop3服务,为之后程序设计做准备,自行实现简单的Java GUI,通过命令方式发送邮件;下篇基于前面的基础,实现基本完整功能的,类似我们平时QQ邮件发送的客户端,图形化界面简便了发送操作,另外增加了接收服务器反馈信息的功能,以后就可以使用自己写的邮件发送程序给其他人发邮件啦,更快更方便๑乛◡乛๑

1、认识SMTP(邮件传输协议

SMTP(简单邮件传输协议,RFC821)是一种提供可靠且有效的电子邮件传输协议。SMTP是建立在FTP文件传输服务上的一种邮件服务,主要用于系统之间的邮件信息传递,并提供有关来信的通知

 2、POP3(邮件接收协议)

POP3,全名为Post Office Protocol - Version 3,即邮局协议版本3。是TCP/IP协议族中的一员,由RFC1939 定义。本协议主要用于支持使用客户端远程管理在服务器上的电子邮件。

二、基于Base64编码邮箱及授权码

服务邮件发送的服务器其端口为25,服务邮件接收的服务器端口为110。

邮箱设置开启smtp/pop3服务,目前大部分邮箱开启服务时,需要设置第三方客户端使用的授权码,该授权码就是代替密码使用,目的是防止密码泄露。操作如下:

1、开通QQ邮箱SMTP/POP3服务

登录邮箱,点击设置----账户。

往下拉,找到POP3/SMTP服务,点击开启,完成验证之后点击生成授权码,记得复制保存,后续用到哦

2、Java编写BASE64编码程序

要成功地发送和接收邮件,用户名和密码(邮箱和授权码)需要BASE64编码后才能有效传输。

  1. /*
  2. * BASE64.java
  3. * Copyright (c) 2020-12-09
  4. * author : Charzous
  5. * All right reserved.
  6. */
  7. import sun.misc.BASE64Decoder;
  8. import sun.misc.BASE64Encoder;
  9. import java.io.IOException;
  10. public class BASE64 {
  11. public static void main(String[] args) throws IOException {
  12. String userName="你的邮箱";
  13. String authCode="生成的授权码";
  14. //显示邮箱名的base64编码结果
  15. System.out.println(encode(userName));
  16. //显示授权码的base64编码结果
  17. System.out.println(encode(authCode));
  18. }
  19. public static String encode(String str){
  20. return new BASE64Encoder().encode(str.getBytes());
  21. }
  22. }

最后生成类似字符串:

Y3poX2NoYXJ6ZXVzQHFxLmNvbQ==

三、telnet命令发送邮件

1、打开命令提示符,输入

telnet smtp.qq.com 25

 2、按顺序输入,举例如下:

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

 发送成功结果:

四、Java图形界面进行SMTP交互发邮件

使用终端发送时,存在许多不方便的地方,比如输入错误,不能回退修改,只能回车输入,所以编写简单的Java界面来避免这些误操作带来的麻烦。用自己的程序代替telnet,来验证smtp发送给邮件的过程。

1、编写客户端类

  1. /*
  2. * TCPMailClient.java
  3. * Copyright (c) 2020-12-09
  4. * author : Charzous
  5. * All right reserved.
  6. */
  7. import java.io.*;
  8. import java.net.Socket;
  9. public class TCPMailClient {
  10. private Socket socket;
  11. private PrintWriter pw;
  12. private BufferedReader br;
  13. /**
  14. * @param ip
  15. * @param port
  16. * @return
  17. * @author Charzous
  18. * @date 2020/12/9 11:19
  19. *
  20. */
  21. public TCPMailClient(String ip, String port) throws IOException{
  22. //主动向服务器发起连接,实现TCP三次握手
  23. //不成功则抛出错误,由调用者处理错误
  24. socket =new Socket(ip,Integer.parseInt(port));
  25. //得到网络流输出字节流地址,并封装成网络输出字符流
  26. OutputStream socketOut=socket.getOutputStream();
  27. //参数true表示自动flush数据
  28. pw=new PrintWriter(new OutputStreamWriter(socketOut,"utf-8"),true);
  29. //得到网络输入字节流地址,并封装成网络输入字符流
  30. InputStream socketIn=socket.getInputStream();
  31. br=new BufferedReader(new InputStreamReader(socketIn,"utf-8"));
  32. }
  33. public void send(String msg){
  34. //输出字符流,由socket调用系统底层函数,经网卡发送字节流
  35. pw.println(msg);
  36. try {
  37. //进行邮件交互,发送smtp指令之间应该暂停一段时间
  38. Thread.sleep(1000);
  39. } catch (InterruptedException e) {
  40. e.printStackTrace();
  41. }
  42. }
  43. public String receive(){
  44. String msg=null;
  45. try {
  46. //从网络输入字符流中读取信息,每次只能接受一行信息
  47. //不够一行时(无行结束符),该语句阻塞
  48. //直到条件满足,程序往下运行
  49. msg=br.readLine();
  50. }catch (IOException e){
  51. e.printStackTrace();
  52. }
  53. return msg;
  54. }
  55. public void close(){
  56. try {
  57. if (socket!=null)
  58. socket.close();
  59. }catch (IOException e){
  60. e.printStackTrace();
  61. }
  62. }
  63. }

2、创建QQ邮件发送图形界面 

 这里很容易发现,与之前TCP通信类似,只需要连接到QQ邮件的发送服务器smtp.qq.com。

界面的创建使用JavaFx,可参考我的文章自行实现,相对简单。

参考文章:

1、《基于TCP协议网络socket编程(java实现C/S通信)

2、《Java进阶:基于TCP的网络实时聊天室(socket通信案例)

五、总结及下篇预告

本篇详细记录了使用Java网络编程的技术思想,初步实现QQ邮件发送客户端。从零开始学习,认识计算机网络邮件传输协议(SMTP、POP3),并开通QQ邮箱的smtp/pop3服务,为之后程序设计做准备,自行实现简单的Java GUI,通过命令方式发送邮件。

可以发现,现在只能通过命令发送请求,向服务器发送信息,所以还是不太方便,所以下篇将实现非命令模式发送邮件,更好的用户体验,避免的繁琐的命令输入,等待下一篇的内容更新!

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

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

  1. 基于UDP协议网络Socket编程(java实现C/S通信案例)https://blog.csdn.net/Charzous/article/details/109016215
  2. 基于TCP协议网络socket编程(java实现C/S通信)https://blog.csdn.net/Charzous/article/details/109016215
  3. Java多线程实现TCP网络Socket编程(C/S通信)https://blog.csdn.net/Charzous/article/details/109283697
  4. Java多线程实现多用户与服务端Socket通信https://blog.csdn.net/Charzous/article/details/109440277
  5. Java进阶:基于TCP的网络实时聊天室(socket通信案例)https://blog.csdn.net/Charzous/article/details/109540279

我的CSDN博客:<>https://blog.csdn.net/Charzous/article/details/110913974



阅读:153
日期:2021-01-21

打印 】 【 关闭 】  【 字体: 】 
上一篇: 跟着团子学SAP-云端企业知识库SEN SAP Enable Now
下一篇: 暗黑色系,讨论专区,Universe 2020 带来GitHub 全新体验
  >> 相关文章
 

服务热线

0574-55011290

微信二维码