目录

一、目标介绍

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编码后才能有效传输。

/*
* 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命令发送邮件

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

telnet smtp.qq.com 25

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

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图形界面进行SMTP交互发邮件

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

1、编写客户端类

/*
* 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();
}
}
}

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

这里很容易发现,与之前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

Java网络编程:QQ邮件发送客户端程序设计的更多相关文章

  1. Java实现QQ邮件发送客户端

    目录 一.前言:QQ邮件发送程序 二.封装SMTP操作 三.实现多线程接收 四.QQ邮件客户端界面设计 1.连接按钮 2.发送按钮 五.QQ邮件发送效果演示 六.总结 一.前言:QQ邮件发送程序 在上 ...

  2. java网络编程,简单的客户端和服务器端

    1.服务器端 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import ...

  3. 20145215实验五 Java网络编程及安全

    20145215实验五 Java网络编程及安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验步骤 本次实验我的结对编程对象是20145208蔡野,我负责编写客 ...

  4. 20145205 《Java程序设计》实验报告五:Java网络编程及安全

    20145205 <Java程序设计>实验报告五:Java网络编程及安全 实验要求 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.客户端中输入明文,利用DES算法加密,D ...

  5. 20145206《Java程序设计》实验五Java网络编程及安全

    20145206<Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验步骤 我和201451 ...

  6. 20145225《Java程序设计》 实验五 Java网络编程及安全

    20145225<Java程序设计> 实验五 Java网络编程及安全 实验报告 一.实验内容 基于Java Socket实现安全传输. 基于TCP实现客户端和服务器,结对编程一人负责客户端 ...

  7. 20155227 《Java程序设计》实验五 Java网络编程及安全实验报告

    20155227 <Java程序设计>实验五 Java网络编程及安全实验报告 实验内容 任务一: 编写MyBC.java实现中缀表达式转后缀表达式的功能. 编写MyDC.java实现从上面 ...

  8. 20155230 《Java程序设计》实验五 Java网络编程及安全

    20155230 <Java程序设计>实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验1 两人一组结对编程 ...

  9. 20155235 《Java程序设计》 实验五 Java网络编程及安全

    20155235 <Java程序设计> 实验五 Java网络编程及安全 实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 实验要求 没有Linu ...

随机推荐

  1. 生成微博授权url接口

    1.创建apps/oauth模块进行oauth认证 '''2.1 在apps文件夹下新建应用: oauth''' cd syl/apps python ../manage.py startapp oa ...

  2. .Net Core官方的 JWT 授权验证

    什么是JWT? JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象.由于此信息是经过数字签名的,因此可以被验 ...

  3. eNSP VLAN划分基础配置及Trunk接口

    跨交换机实现VLAN通信拓扑图: 一.配置PC机 ip 并测试相互能否ping通 PC名称 IP 子网掩码 网关 PC1 10.1.1.1 255.255.255.0 10.1.1.254 PC2 1 ...

  4. C语言const和define的区别

    const 定义的是变量不是常量,只是这个变量的值不允许改变是常变量!带有类型.编译运行的时候起作用存在类型检查. define 定义的是不带类型的常数,只进行简单的字符替换.在预编译的时候起作用,不 ...

  5. celery异步发送短信

    1.使用celery异步发送短信 1.1 在 celery_task/mian.py 中添加发送短信函数 # celery项目中的所有导包地址, 都是以CELERY_BASE_DIR为基准设定. # ...

  6. 基于CefSharp开发(三)浏览器头部优化

    一.上文回顾 上编实现了简单的网页加载功能包括URL输入.打开空标签页.网页链接中新页面处理等 本编将对网页的Title绑定.前进.后退.刷新等事件处理 二.Title绑定处理 当打开网页时Title ...

  7. 第15.30节 PyQt编程实战:通过eventFilter监视QScrollArea的widget()的Paint消息画出scrollAreaWidgetContents的范围矩形

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 在<PyQt(Python+Qt)学习随笔:QScrollArea滚动区域详解> ...

  8. 快速排序(c++,递归)quick_sort

    放上c++代码,模板 1 #include <iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 5 in ...

  9. ajax的五种状态

    ajax的五种状态(readyState ) 0 - (未初始化)还没有调用send()方法 1 - (载入)已调用send()方法,正在发送请求 2 - (载入完成)send()方法执行完成,已经接 ...

  10. shell--数据库备份脚本

    #!/bin/bash #数据库的完全备份 #把日期显示为170605(这个是当前的时间)的格式 date=$(date +%y%m%d) #计算下这个备份的数据库文件的大小 size=$(du -s ...