基于Java实现收发电子邮件功能
作者:无解的黑眼圈 发布时间:2021-08-23 17:30:14
前言
Email就是电子邮件,我们平常使用的QQ邮箱,网易邮箱,Foxmail都是用来收发邮件的,利用Java程序也可以完成收发电子邮件的功能。
传统的邮件是通过邮局投递,从一个邮局到另一个邮局,最终到达用户的邮箱。电子邮件与之的发送过程是类似的。电子邮件是从用户电脑的邮件软件(例如:Outlook),发送到邮件服务器上,可能经过若干个邮件服务器的中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件。
我们把类似Outlook这样的邮件软件称为MUA:Mail User Agent:意思是给用户服务的邮件代理;
邮件服务器称为MTA:Mail Transfer Agent:意思是邮件中转的代理
最终到达的邮件服务器称为MDA:Mail Delivery Agent:邮件到达的代理。
邮件一旦到达MDA,就不在动了。实际上,电子邮件通常就存储在MDA服务器的硬盘上,然后等收件人通过软件或者登录浏览器查看邮件。
邮件协议
常见的邮件协议有:POP3,SMTP,IMAP
POP3:是Post Office Protocol 3 的简称,POP3允许用户从服务器上把邮件存储到本地主机即自己的计算机)上,同时删除保存在邮件服务器上的邮件。
SMTP:全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,帮助每台计算机在发送或中转信件时找到下一个目的地。
SMTP认证,就是要求必须在提供了账户名和密码之后才能登录SMTP服务器,使得那些垃圾邮件的散播者无可乘之机。增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP:全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端 软件登录邮箱,看到的邮件以及状态都是一致的。
IMAP和POP3有什么区别?
1.POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的。
2.IMAP提供webmail与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
准备SMTP登录信息
常用邮件服务商的SMTP信息:
·QQ邮箱: SMTP服务器是smtp.qq.com,端口是465 / 587
·163邮箱:SMTP服务器是smtp.163.com,端口是465126邮箱: SMTP服务器是smtp
.126.com,端口是25
.Gmail邮箱:SMTP服务器是smtp.gmail.com,端口是465 / 587
准备好SMTP登录信息后,我们首先要把JavaMail相关的依赖Jar包javax.mail-1.6.2.jar加入至当前项目。
jar包:
链接:https://pan.baidu.com/s/1H8pnkVskG8casxIoUCq69Q 提取码:9aym
以126邮箱发送至QQ邮箱为例:
1.首先在邮箱中开启此服务
新增授权密码
2.在Java中进行邮件的发送(邮件只包含文本)
以25端口为例,连接SMTP服务器时,需要准备一个Properties对象,填入相关信息。最后获取Session实例时,如果服务器需要认证,还需要传入一个Authenticator对象,并返回指定的用户名和口令。当我们获取到Session实例后,打开调试模式可以看到SMTP通信的详细内容,便于调试。
package com.yy.demo;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
/**
* 创建session会话
* @author YangYing
*
*/
public class Demo01 {
public static void main(String[] args) {
//SMTP服务器地址
String smtp = "smtp.126.com";
//邮箱账号和密码
String userName = "yy0525xxxxx@126.com";
String password = "xxxxxxxxxxxx";
//SMTP服务器的连接信息
Properties props = new Properties();
props.put("mail.smtp.host", smtp);//SMTP主机名
props.put("mail.smtp.port", "25");//主机端口号
props.put("mail.smtp.auth", "true");//是否需要用户认证
props.put("mail.smtp.starttls.enable", "true");//启用TLS加密
//创建Session
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName,password);
}
});
//开启调试模式
session.setDebug(true);
System.out.println(session);
}
}
发送邮件
1.先创建一个Session对象
Session session = JavaMailUtil.crateSession();
2.创建邮件对象(Message抽象类的子类)
RecipientType.TO代表发送人
RecipientType.CC代表抄送人
MimeMessage msg = new MimeMessage(session);//传入session
msg.setFrom(new InternetAddress("yy052xxxx@126.com"));//发件人
msg.setRecipient(RecipientType.TO,new InternetAddress("2452845234@qq.com"));//发送人
msg.setSubject("你好呀","utf-8");
3.邮件正文包含有“html”标签(控制文本的格式)
msg.setText("我<b>是你</b>!","utf-8","html");//<b>标签加粗字体
4.发送
Transport.send(msg);
整体代码如下:
package com.yy.demo;
import java.net.InetAddress;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
/**
* 发送邮件
* @author YangYing
*
*/
public class Demo02 {
public static void main(String[] args) {
try {
//1.创建Session会话
Session session = JavaMailUtil.crateSession();
//2.创建邮件对象(Message抽象类的子类)
MimeMessage msg = new MimeMessage(session);//传入session
msg.setFrom(new InternetAddress("yy0525xxx@126.com"));//发件人
msg.setRecipient(RecipientType.TO,new InternetAddress("2452845234@qq.com"));//收件人
msg.setSubject("你好呀","utf-8");
//邮件正文包含有“html”标签(控制文本的格式)
msg.setText("我<b>是你</b>!","utf-8","html");
//3.发送
Transport.send(msg);
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
3.在Java中进行邮件的发送(邮件包含文本和附件(图片))
在上面代码基础上
1.设置邮件内容
邮件正文内容
内容类型:设置字符编码集
BodyPart textBodyPart = new MimeBodyPart();
StringBuilder body = new StringBuilder();
body.append("<h1>xz</h1>");
body.append("<img src=\"cid:zhanzi\"/>");//通过内容ID引用附件图片
textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");
2.邮件附件内容
BodyPart imgBodyPart = new MimeBodyPart();
imgBodyPart.setFileName("xz.jpg");//附件名称
imgBodyPart.setDataHandler(//读取附件内容
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\微信图片_20200228144031.jpg")),
"application/octet-stream")));
imgBodyPart.setHeader("Content-ID", "<zhanzi>");//设置内容ID
3.组合正文+附件
邮件内容
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textBodyPart);
multipart.addBodyPart(imgBodyPart);
msg.setContent(multipart);
4.发送
Transport.send(msg);
5.整体代码
JavaMailUtil类是一个封装的类,可重复利用
package com.yy.demo;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
public class JavaMailUtil {
public static Session crateSession() {
//SMTP服务器地址
String smtp = "smtp.126.com";
//邮箱账号和密码
String userName = "yy05xxxxxx@126.com";
String password = "xxxxxxxxxxxx";
//SMTP服务器的连接信息
Properties props = new Properties();
props.put("mail.smtp.host", smtp);//SMTP主机名
props.put("mail.smtp.port", "25");//主机端口号
props.put("mail.smtp.auth", "true");//是否需要用户认证
props.put("mail.smtp.starttls.enable", "true");//启用TLS加密
//创建Session
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName,password);
}
});
//开启调试模式
session.setDebug(true);
return session;
}
}
package com.yy.demo;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import javax.activation.DataHandler;
import javax.mail.BodyPart;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.mail.internet.MimeMultipart;
import javax.mail.util.ByteArrayDataSource;
public class Demo04 {
public static void main(String[] args) {
try {
//创建Session
Session session = JavaMailUtil.crateSession();
//创建邮件对象
MimeMessage msg = new MimeMessage(session);//传入session
msg.setFrom(new InternetAddress("yy05250915@126.com"));//发件人
msg.setRecipient(RecipientType.TO, new InternetAddress("2452845234@qq.com"));
msg.setSubject("我还是你!","utf-8");
//设置邮件内容
//邮件正文内容
//内容类型:设置字符编码集
BodyPart textBodyPart = new MimeBodyPart();
StringBuilder body = new StringBuilder();
body.append("<h1>xz</h1>");
body.append("<img src=\"cid:zhanzi\"/>");//通过内容ID引用附件图片
textBodyPart.setContent(body.toString(),"text/html;charset= utf-8");
//邮件附件内容
BodyPart imgBodyPart = new MimeBodyPart();
imgBodyPart.setFileName("xz.jpg");//附件名称
imgBodyPart.setDataHandler(//读取附件内容
new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("C:\\Users\\LENOVO\\Pictures\\Saved Pictures\\微信图片_20200228144031.jpg")),
"application/octet-stream")));
imgBodyPart.setHeader("Content-ID", "<zhanzi>");//设置内容ID
//组合正文+附件
//邮件内容
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textBodyPart);
multipart.addBodyPart(imgBodyPart);
msg.setContent(multipart);
//发送
Transport.send(msg);
} catch (MessagingException | IOException e) {
e.printStackTrace();
}
}
}
邮件内容
来源:https://blog.csdn.net/weixin_49187233/article/details/125833487


猜你喜欢
- 目录1、this代表了()的对象引用,super表示的是当前对象的()对象?2、输出内容是:3、下面程序的输出是:()4、执行下列代码的输出
- 简单版/** * 产生4位随机数(0000-9999) * * @return 4位随机数 &nb
- 使用Scroller实现绚丽的ListView左右滑动删除Item效果这里来给大家带来使用Scroller的小例子,同时也能用来帮助初步解除
- Android WebView的使用方法 Android app打开H5页一般要实现如下需求:1、打开指定url网页
- 循环例子:while循环和do…while循环whlie(条件语句) {循环体}//先进行条件语句的判断,再进行循环体do {循环体}whl
- Android 开发的程序员开发程序的时候,一定为log而苦恼过吧。Eclipse老是Log找不到,是不是很让人不爽,虽然Android S
- Java的static关键字和C/C++语言的关键字有所不同:一旦在Java里使用了static关键字,那么这样的内容不再属于对象自己,而是
- 最近在看 C++ 的方法重载,我就在想 C# 中的重载底层是怎么玩的,很多朋友应该知道 C 是不支持重载的,比如下面的代码就会报错。#inc
- PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4
- 对列表进行排序也是我们经常遇到的问题,这里缩小一下范围,使用map来对列表排序。相信大家都有过TreeMap排序的经历,不过Map.Entr
- /// <summary>/// 获取本机在局域网的IP地址/// </summary>/// <return
- 看完本文你将了解:ACTION_CANCEL的触发时机滑出子View区域会发生什么?为什么不响应onClick()事件首先看一下官方的解释:
- 1. 实验目的: 使用线程池的时候,有时候需要考虑服务器的最大线程数目和程序最快
- 阅读收获理解SpringBoot自动配置原理一、SpringBoot是什么SpringBoot 的诞生就是为了简化 Spring 中繁琐的
- 一、 PorterDuffXfermodePorterDuffXfermode类似于数据集合里面的交集并集概念,只是数据里面取的是两个集合,
- 前言爱美之心人皆有之,在 unix 和 linux 命令行环境下工作的闷骚程序员们可能也觉得命令行太单调了,而是他们就发明了在命令行下采用
- 一、前言在java中,异常机制是非常有用的构成部分,异常信息对于查找错误来说是必不可少至关重要的信息,因此我们希望在发生错误的时候先看到捕捉
- 如果我们遇到把excel表格中的数据导入到数据库,首先我们要做的是:将excel中的数据先读取出来。因此,今天就给大家分享一个读取Excel
- 本文较为详细的描述了重载运算符的方法。一般来说,重载运算符在实际的项目开发中会经常的用到,但如果某些自定义类型通过简短几行代码重载一些常用的
- 简介 相信很多人都接触spring框架很长时间了,每次搭建spring框架的时候都需要配置好多的jar、xml,做很多繁琐重复的配置,稍微不