电子邮件

在网络中实现邮件发送和接收的功能,就必须要有专门的邮件服务器(使用SMTP协议)。我们发送一封邮件,先要经过各层路由,交换机,基站,然后存到该邮件服务器,(不同的邮件有不同的邮件服务器,比如网易的邮箱服务器,QQ的邮箱服务器),然后发送的邮箱服务器(使用POP3协议)。又通过基站发送到对应的服务器中,这个时候作为收件人会有邮件到达的提醒,在你打开邮件的过程就是从邮件服务器中读取数据的过程。
SMTP服务器地址:一般是smtp.xxx.com,比如smtp.163.com,smtp.qq.com,电子邮箱的获得需要在邮件服务器中去申请。

下面是实现过程

1.首先在QQ邮箱获取授权码


这里需要验证密保方式,短信令牌都可以,我已经获取了,就不再演示了。

2.获取两个jar包(从maven 仓库可以很方便获取)

1.mail.jar
2.activition.jar

JavaMail是sun公司为方便java开发 人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,比如SMTP,POP3,IMAP,MIME等,在开发中只需要调用相应的api就可以,无需关心底层的实现。
在编写程序中主要有这四个核心类:

3.代码实现(简单文本)

    public static void main(String[] args) throws GeneralSecurityException, MessagingException {//这是我的授权码:bgqyouievmjubjaiProperties prop=new Properties();prop.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器prop.setProperty("mail.transport.protocol","smtp");//邮箱发送协议prop.setProperty("mail.stmp.auuuth","true");//需要验证用户名密码//设置SSL加密MailSSLSocketFactory sf=new MailSSLSocketFactory();sf.setTrustAllHosts(true);  prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);//1 创建定义整个应用程序所需环境信息的session 对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("415866969@qq.com","bgqyouievmjubjai");}});//开启debug模式,开启后会在控制台打印邮件发送过程中的参数信息,不开启则不显示session.setDebug(true);//2 通过session得到transport对象Transport ts = session.getTransport();//3 使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","415866969@qq.com","bgqyouievmjubjai");//4 创建邮件,写邮件MimeMessage message=new MimeMessage(session);//指明发件人message.setFrom(new InternetAddress("415866969@qq.com"));//收件人,我这里是自己给自己发送message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("415866969@qq.com")});//邮件主题message.setSubject("只包含文本"); //邮件内容message.setContent("你好你好啊,我是01","text/html;charset=UTF-8");//5 发送邮件ts.sendMessage(message,message.getAllRecipients());//6 关闭邮件ts.close();}

运行结果

"E:\Program Files\Java\jdk-14.0.1\bin\java.exe" "-javaagent:D:\Program Files\JetBrains\IntelliJ IDEA 2020.1.2\lib\idea_rt.jar=64935:D:\Program Files\JetBrains\IntelliJ IDEA 2020.1.2\bin" -Dfile.encoding=UTF-8 -classpath F:\IdeaProjects\mail-java\out\production\mail-java;F:\IdeaProjects\mail-java\lib\mail-1.4.7.jar;F:\IdeaProjects\mail-java\lib\activation-1.1.1.jar com.ycm.test.Test
DEBUG: setDebug: JavaMail version 1.4.7
DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
DEBUG SMTP: useEhlo true, useAuth false
DEBUG SMTP: trying to connect to host "smtp.qq.com", port 465, isSSL true
220 newxmesmtplogicsvrszc9.qq.com XMail Esmtp QQ Mail Server.
DEBUG SMTP: connected to host "smtp.qq.com", port: 465EHLO LAPTOP-RQ19S512
250-newxmesmtplogicsvrszc9.qq.com
250-PIPELINING
250-SIZE 73400320
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN
250-MAILCOMPRESS
250 8BITMIME
DEBUG SMTP: Found extension "PIPELINING", arg ""
DEBUG SMTP: Found extension "SIZE", arg "73400320"
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "AUTH=LOGIN", arg ""
DEBUG SMTP: Found extension "MAILCOMPRESS", arg ""
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM
DEBUG SMTP: AUTH LOGIN command trace suppressed
DEBUG SMTP: AUTH LOGIN succeeded
DEBUG SMTP: use8bit false
MAIL FROM:<415866969@qq.com>
250 OK.
RCPT TO:<415866969@qq.com>
250 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   415866969@qq.com
DATA
354 End data with <CR><LF>.<CR><LF>.
From: 415866969@qq.com
To: 415866969@qq.com
Message-ID: <1652149987.0.1595824848890.JavaMail.41586@smtp.qq.com>
Subject: =?UTF-8?B?5Y+q5YyF5ZCr5paH5pys?=
MIME-Version: 1.0
Content-Type: text/html;charset=UTF-8
Content-Transfer-Encoding: base645L2g5aW95L2g5aW95ZWK77yM5oiR5pivMDE=
.
250 OK: queued as.
QUIT
221 Bye.Process finished with exit code 0

下面是发送带图片的邮件,只需要修改几处就可以,只贴了代码

public static void main(String[] args) throws GeneralSecurityException, MessagingException{//这是我的授权码:bgqyouievmjubjaiProperties prop=new Properties();prop.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器prop.setProperty("mail.transport.protocol","smtp");//邮箱发送协议prop.setProperty("mail.stmp.auuuth","true");//需要验证用户名密码//设置SSL加密MailSSLSocketFactory sf=new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);//1 创建定义整个应用程序所需环境信息的session 对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("415866969@qq.com","bgqyouievmjubjai");}});//开启debug模式session.setDebug(true);//2 通过session得到transport对象Transport ts = session.getTransport();//3 使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","415866969@qq.com","bgqyouievmjubjai");//4 创建邮件,写邮件MimeMessage message=new MimeMessage(session);//指明发件人message.setFrom(new InternetAddress("415866969@qq.com"));//收件人,我这里是自己给自己发送message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("415866969@qq.com")});//邮件主题message.setSubject("包含图片的文件");//准备邮件数据//准备图片数据MimeBodyPart image=new MimeBodyPart();DataHandler dh=new DataHandler(new FileDataSource("F:\\IdeaProjects\\mail-java\\src\\logo.png"));image.setDataHandler(dh);image.setContentID("logo.png");//准备正文数据MimeBodyPart text=new MimeBodyPart();text.setContent("这是一封邮件带图片的<img src='cid:logo.png'>","text/html;charset=utf-8");//描述数据关系MimeMultipart mm=new MimeMultipart();mm.addBodyPart(text);mm.addBodyPart(image);mm.setSubType("related");//设置到下消息中保存修改message.setContent(mm);message.saveChanges();//5 发送邮件ts.sendMessage(message,message.getAllRecipients());//6 关闭邮件ts.close();}

下面在Java Web中实现邮件发送

前端是一个form表单,用于接收参数

<form action="/RegisterServlet.do" method="post">用户名:<input type="text" name="username"> <br>密码:<input type="password" name="password"> <br>邮箱:<input type="text" name="email"> <br><input type="submit" value="注册"></form>

servlet

public class RegisterServlet extends HttpServlet {protected void doPost(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {//接收参数String username = request.getParameter("username");String password = request.getParameter("password");String email = request.getParameter("email");//封装成实体类User user=new User(username,password,email);SendMail send=new SendMail(user);send.start();request.setAttribute("message","注册成功");request.getRequestDispatcher("info.jsp").forward(request,response);}protected void doGet(HttpServletRequest request, HttpServletResponse response) throws javax.servlet.ServletException, IOException {}
}

这个还有一个工具类,主要的功能就是发送邮件,通过接收前端传来的User对象封装数据。
需要指出的是,这个类的实例方法实现是用一个多线程来实现的,也就是说当点击发送邮件的时候,再开一个新的线程去执行,这样做的好处是可以优化用户体验,假设不用多线程来处理,当点击发送邮件,页面会停留在加载界面,直到文件发送成功。


/*** 在把发送邮件的任务再开一个线程去处理,* 避免当点击发送邮件的时候一直停留在网页等待的界面* 可以优化用户体验*/
public class SendMail extends Thread {//要发送的邮箱private String from="415866969@qq.com";//收信的邮箱private String username="415866969@qq.com";//邮箱密码private String password="bgqyouievmjubjai";//发送邮件的服务器地址private String host="smtp.qq.com";private User user;public SendMail(User user){this.user=user;}@Overridepublic void run() {try{//这是我的授权码:bgqyouievmjubjaiProperties prop=new Properties();prop.setProperty("mail.host","smtp.qq.com");//设置qq邮件服务器prop.setProperty("mail.transport.protocol","smtp");//邮箱发送协议prop.setProperty("mail.stmp.auuuth","true");//需要验证用户名密码//设置SSL加密MailSSLSocketFactory sf=new MailSSLSocketFactory();sf.setTrustAllHosts(true);prop.put("mail.smtp.ssl.enable","true");prop.put("mail.smtp.ssl.socketFactory",sf);//1 创建定义整个应用程序所需环境信息的session 对象Session session=Session.getDefaultInstance(prop, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("415866969@qq.com","bgqyouievmjubjai");}});//开启debug模式session.setDebug(true);//2 通过session得到transport对象Transport ts = session.getTransport();//3 使用邮箱的用户名和授权码连上邮件服务器ts.connect("smtp.qq.com","415866969@qq.com","bgqyouievmjubjai");//4 创建邮件,写邮件MimeMessage message=new MimeMessage(session);//指明发件人message.setFrom(new InternetAddress(from));//收件人,我这里是自己给自己发送message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress(user.getEmail())});//邮件主题message.setSubject("只包含文本");//邮件内容message.setContent("你好你好啊,我是01","text/html;charset=UTF-8");message.saveChanges();//5 发送邮件ts.sendMessage(message,message.getAllRecipients());//6 关闭邮件ts.close();} catch (Exception e) {e.printStackTrace();}}

Java实现QQ邮件发送原理和实现相关推荐

  1. Java实现QQ邮件发送客户端程序设计

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

  2. Java实现QQ邮件发送

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

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

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

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

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

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

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

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

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

  7. java发送消息_通过java给qq邮箱发送信息

    通过java程序给qq邮箱发送信息. 1.第一步:下载mail的jar包:javax.mail.jar 下载地址:https://javaee.github.io/javamail/#Latest_N ...

  8. java读取qq邮箱_通过java给qq邮箱发送信息

    通过java程序给qq邮箱发送信息. 1.第一步:下载mail的jar包:javax.mail.jar 下载地址:https://javaee.github.io/javamail/#Latest_N ...

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

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

最新文章

  1. php 命令执行脚本文件路径,php命令行(cli)下执行PHP脚本文件的相对路径的问题解决方法...
  2. ServletContext2
  3. 24.Forbidden
  4. ExtJs - grid 合并单元格 跨行跨列
  5. 交换知识 VLAN VTP STP 单臂路由
  6. arrive 和reach 的区别
  7. 21.iozone的使用与介绍
  8. 免安装、免激活,绿色版的电脑软件下载网站
  9. P1262 间谍网络+Trajan 缩点(有向图)
  10. 小米9预约如此火爆,雷军的供货能跟上吗?
  11. 7个技巧帮助你进行更有吸引力的脉动/脉搏调查
  12. 如何使用可编程无线SIM和Arduino MKR GSM 1400播放MP3文件
  13. Python读取文本文件的几种方式
  14. 认识CAPWAP隧道及其应用
  15. python tomorrow多线程应用
  16. 美国智能网联最新政策动态(2021年9-11月)
  17. Jmeter模拟上传图片
  18. js 针对异步的处理
  19. python在软件测试中的应用_Python在软件测试中的应用
  20. 2023年全国最新会计专业技术资格精选真题及答案6

热门文章

  1. PHP单元测试框架PHPUnit的使用方法
  2. 2021年山东省职业院校技能大赛高职组“信息安全管理与评估”赛项规程
  3. 消防设备电源监控系统在苏州某工业区项目的应用-安科瑞耿敏花
  4. 熟悉 Linux 命令运维工程师必备
  5. Python B站“野生”api的分析使用
  6. 万丈高楼平地起之两数之和
  7. 剑指 Offer 15. 二进制中1的个数 + 191. 位1的个数(n(n-1)实例)
  8. 三维动画与交互技术复习笔记
  9. Apache StringUtils工具类
  10. 你知道数据网格(Data Mesh )吗