邮件发送原理及实现
邮件收发
电子邮件:
要在网络上实现邮件功能,必须要有专门的邮件服务器。
这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
SMTP服务器地址:一般是smtp.xxx.com, 比如163邮箱是smtp.163.com, qq邮箱是smtp.qq.com
电子邮箱(E-Mail地址)的获得需要在邮件服务器上进行申请。
传输协议
SMTP协议
发送邮件:
我们通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。
POP3协议
接收邮件:
我们通常把处理用户POP3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
【注意】有可能你收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这个时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试。
Java发送邮件
概述:
我们将用代码完成邮件的发送。这在实际项目中应用的非常广发,比如注册需要发送永健进行账号激活,再比如OA项目中利用邮件进行任务提醒等。
使用java发送E-mail十分简单,但是首先你应该准备JavaMail和Java Activation Framework.
得到两个jar包:
-
mail.jar
下载地址:https://mvnrepository.com/artifact/javax.mail/mail/1.4.7
-
activation.jar
下载地址:https://mvnrepository.com/artifact/javax.activation/activation/1.1.1
JavaMail是sun公司(现以被甲骨文收购)为方便java开发人员在应用程序中实现邮件发送和接收功能而提供的一套标准开发包,它支持一些常用的邮件协议,如前面所讲的SMTP,POP3,IMAP,还有MIME。我们在使用JavaMail API编写邮件时,无须考虑邮件的底层实现细节,只调用JavaMail开发包中相应的API类就可以了。
我们可以先尝试发送一封简单的邮件,确保电脑可以连接网络。
- 创建包含邮件服务器的网络连接信息的Session对象。
- 创建代表邮件内容的Message对象
- 创建Transport对象,连接服务器,发送Message,关闭连接
主要有四个核心类,我们在编写程序时,记住这四个核心类,就很容易编写出Java邮件处理程序。
MIME(多用途互联网邮件扩展类型)
发送简单邮件
package com.kuang;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.security.GeneralSecurityException;
import java.util.Properties;
//发送一封简单的邮件
public class MailDemo01 {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.com");
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户密码
//关于QQ邮箱,还需要设置SSL加密,加上一下代码即可,其他邮箱不需要
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用JAVAMail发送邮件五个步骤
//1.创建定义整个应用程序所需的环境信息的Sessiom 对象
//创建定义整个应用程序所需的环境信息的Session对象
//QQ邮箱才有。其他邮箱就不用
Session session = Session.getDefaultInstance(prop, new Authenticator(){
public PasswordAuthentication getPasswordAuthentication(){
//发件人邮件用户名、授权码
return new PasswordAuthentication("xxxx@qq.com","授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过Session得到transport对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","xxxx@qq.com","授权码");
//4.创建邮件:写邮件
//主要传递session
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("xxxx@qq.com"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@qq.com"));
//邮件的标题
message.setSubject("欢迎来到西部开源学习java");
//邮件的文本内容
message.setContent("<h1 style='color: red'>你好啊!</h1>","text/html;charset=UTF-8");
//5.发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6.关闭连接
ts.close();
}
}
带图片和附件的邮件
先认识两个类一个名词:
MIME(多用途互联网邮件扩展类型)
MimeBodyPart类
javax.mail.internet.MimeBodyPart类 表示的是一个MIME消息,它和MimeMessage类一样都是从Part接口继承过来。
MimeMultipart类
javax.mail.internet.MimeMultipart是抽象类Multipart的实现子类,它用来组合多个MIME消息。一个MimeMultipart对象可以包含多个代表MIME消息的MimeBodyPart对象。
发送图片
package com.kuang;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import java.security.GeneralSecurityException;
import java.util.Properties;
//发送一封简单的邮件
public class MailDemo01 {
public static void main(String[] args) throws Exception {
Properties prop = new Properties();
prop.setProperty("mail.host","smtp.qq.com");
prop.setProperty("mail.transport.protocol","smtp");//邮件发送协议
prop.setProperty("mail.smtp.auth","true");//需要验证用户密码
//关于QQ邮箱,还需要设置SSL加密,加上一下代码即可,其他邮箱不需要
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",sf);
//使用JAVAMail发送邮件五个步骤
//1.创建定义整个应用程序所需的环境信息的Sessiom 对象
//创建定义整个应用程序所需的环境信息的Session对象
//QQ邮箱才有。其他邮箱就不用
Session session = Session.getDefaultInstance(prop, new Authenticator(){
public PasswordAuthentication getPasswordAuthentication(){
//发件人邮件用户名、授权码
return new PasswordAuthentication("xxxx@qq.com","授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2.通过Session得到transport对象
Transport ts = session.getTransport();
//3.使用邮箱的用户名和授权码连上邮件服务器
ts.connect("smtp.qq.com","xxxx@qq.com","授权码");
//4.创建邮件:写邮件
//主要传递session
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("xxxx@qq.com"));
//指明邮件的收件人,现在发件人和收件人是一样的,那就是自己给自己发
message.setRecipient(Message.RecipientType.TO,new InternetAddress("xxxx@qq.com"));
//邮件的标题
message.setSubject("欢迎来到西部开源学习java");
//======================================
MimeBodyPart image = new MimeBodyPart();
//图片需要经过数据处理... DataHandler:数据处理
DataHandler dh = new DataHandler(new FileDataSource("C:\\Users\\HP\\Desktop\\smbms2\\功能扩展\\mail-java2\\src\\2.png"));
image.setDataHandler(dh);//在我们的Body中放入这个处理的图片数据
image.setContentID("bz.jpg");//给图片设置一个ID,我们在后面可以使用!这里面设置的名字不影响实际存放的图片
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一封邮件正文带图片<img src='cid:bz.jpg'>的邮件","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();
}
}
JavaWeb发送邮件
现在很多的网站都提供用户注册功能,通常我们注册成功之后就会收到一封来自注册网站的邮件。邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息。今天我们也来实现这样一个功能,用户注册成功之后,将用户的注册信息以Email的形式发送到用户的注册邮箱当中,实现发送邮件功能就得借助于JavaMail了。