目录
一、概述
Email就是电子邮件,我们通常使用的是通过网易邮箱、QQ邮箱来进行邮件发送,当然我们可以借助Java程序收发电子邮件。
我们先看一下传统的邮件是如何发送的:通过邮局投递,然后从一个邮局到另一个邮局最终到达用户的信箱。
┌──────────┐ ┌──────────┐
│PostOffice│ │PostOffice│ .───.
┌─────┐ ├──────────┤ ├──────────┤ ( ( )
│═══ ░│───>│ ┌─┐ ┌┐┌┐ │───>│ ┌─┐ ┌┐┌┐ │───> `─┬─'
└─────┘ │ │░│ └┘└┘ │ │ │░│ └┘└┘ │ │
└─┴─┴──────┘ └─┴─┴──────┘ │
电子邮件发送过程也类似,只不过是电子邮件是从用户电脑的邮件软件发送到邮件服务器,可能会经过若干个邮件服务器中转,最终到达对方邮件服务器上,收件方就可以用软件接收邮件;
┌─────────┐ ┌─────────┐ ┌─────────┐
│░░░░░░░░░│ │░░░░░░░░░│ │░░░░░░░░░│
┌───────┐ ├─────────┤ ├─────────┤ ├─────────┤ ┌───────┐
│░░░░░░░│ │░░░░░░░░░│ │░░░░░░░░░│ │░░░░░░░░░│ │░░░░░░░│
├───────┤ ├─────────┤ ├─────────┤ ├─────────┤ ├───────┤
│ │───>│O ░░░░░░░│───>│O ░░░░░░░│───>│O ░░░░░░░│<───│ │
└───────┘ └─────────┘ └─────────┘ └─────────┘ └───────┘
MUA MTA MTA MDA MUA
MUA:Mail User Agent 用户邮件服务代理
MTA: Mail Transfer Agent 邮件中转代理
MDA:Mail Delivery Agent 邮件到达代理
电子邮件一旦到达MDA,就不再动了,实际上,电子邮件通常存储在MDA服务器的硬盘上,然后等收件人通过软件或者登录浏览器查看邮件。
二、邮件协议
MTA和MDA这样的服务器软件通常是现成的,我们通常不会关心这些邮件服务器的内部是如何运行的。更多的需求场景,是需要发送邮件。例如:促销商品邮件、验证码邮件、消息通知邮件等。常见的邮件协议有:POP3、SMTP、IMAP。
POP3
POP3是Post Office Protocol 3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循POP3协议的接收邮件服务器,用来接收电子邮件的。
SMTP
SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP服务器就是遵循SMTP协议的发送邮件服务器。
SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。
IMAP
IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
IMAP和POP3有什么区别?
POP3协议允许电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的3封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的。
IMAP提供webmail 与电子邮件客户端之间的双向通信,客户端的操作都会反馈到服务器上,对邮件进行的操作,服务器上的邮件也会做相应的动作。
三、Java程序实现邮件发送
假设我们准备使用自己的邮件地址me@example.com给小明发送邮件,已知小明的邮件地址是 xiaoming@somewhere.com,发送邮件前,我们首先要确定作为MTA的邮件服务器地址和端口号。邮件服务器地址通常是smtp.example.com,端口号由邮件服务商确定使用25、465还是587。
常用的邮件服务商的SMTP信息:
首先创建Session[方便后续反复使用,将创建Session的代码单独写在一个类中]
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
/**
* 创建Session类,方便在其他文件中使用
* @author Admin
*
*/
public class JavaMailUtils {
public static Session createSession(){
//SMTP服务器地址
String smtp = "smtp.126.com";
//邮箱账号和密码(授权密码)
String userName = "********@126.com";
String passWord = "XN********ASWMPK";
//SMTP服务器的连接信息
Properties pros = new Properties();
pros.put("mail.smtp.host", smtp); //SMTP主机号
pros.put("mail.smtp.port", "25"); //主机端口号
pros.put("mail.smtp.auth", "true"); //是否需要用户认证
pros.put("mail.smtp.starttls.enable", "true"); //启用TLS加密
//创建Session
//参数1:SMTP服务器的连接信息
//参数2:用户认证对象(Authenticator接口的匿名实现类)
Session session = Session.getInstance(pros, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, passWord);
}
});
//开启调试模式
session.setDebug(true);
System.out.println(session);
return session;
}
}
邮件发送
发送邮件时,我们需要构造一个Message对象,然后调用Transport.send(messge)即可完成发送,绝大多数邮件服务器要求发送方地址和登录用户名一致,否则发送将失败。
发送邮件内容包含纯文本+html
public class demo02 {
public static void main(String[] args) {
try {
//1.创建Session会话
Session session = JavaMailUtils.createSession();
//2.创建邮件对象(Message抽象类的子类对象)
MimeMessage msg = new MimeMessage(session); //传入session
msg.setFrom(new InternetAddress( "********@126.com")); //发件人
msg.setRecipient(RecipientType.TO, new InternetAddress("1727****@qq.com")); //收件人
msg.setSubject("这是一份测试邮件","utf-8"); //标题
//邮件正文包含有“html”标签(控制文本的格式)
msg.setText("爱你孤身走<b>暗巷</b>","utf-8","html"); //正文
//3.发送邮件
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
运行结果:
发送邮件内容包含正文+附件
public class demo03 {
public static void main(String[] args) throws IOException {
try {
//1.创建Session会话
Session session = JavaMailUtils.createSession();
//2.创建邮件对象(Message抽象类的子类对象)
MimeMessage msg = new MimeMessage(session); //传入session
msg.setFrom(new InternetAddress( "********@126.com")); //发件人
msg.setRecipient(RecipientType.TO, new InternetAddress("1727****@qq.com")); //收件人
msg.setSubject("这是一份测试邮件","utf-8"); //标题
//3.邮件“复合”对象
Multipart multipart = new MimeMultipart();
//正文
BodyPart textPart = new MimeBodyPart();
//参数1:正文内容
//参数2:内容类型;字符编码集
textPart.setContent("当我看花瓣<b>脱离</b>花蕊慢慢枯萎","text/html;charset=utf-8");
//附件
BodyPart imagePart = new MimeBodyPart();
imagePart.setFileName("isgirl.jpg"); //设置附件文件的显示名称
//数据处理对象(读取附件文件从本地磁盘进行读取)
imagePart.setDataHandler(new DataHandler(
new ByteArrayDataSource(
Files.readAllBytes(Paths.get("E:\\test\\girl.jpg")), "application/octet-stream")));
//添加至邮件内容
multipart.addBodyPart(textPart); //添加正文
multipart.addBodyPart(imagePart); //添加附件
//设置邮件内容
msg.setContent(multipart);
//4.发送邮件
Transport.send(msg);
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}
}
运行结果:
温馨提示:出现下述图片中的信息,则表明邮件正确发送成功
好啦,以上就是对于Java Email实现电子邮件发送的知识分享,如有不当之处,还请大家多多评论指正,喜欢的话可以留下您的关注和点赞,一起学习,一起进步!