JavaWeb实现邮件发
1、传输协议:
-
SMTP协议
处理用户邮件发送的请求。
-
POP3协议
处理用户邮件接收请的求。
2、所需要的jar包
Pom.xml文件:
<!-- mail-1.4.7.jar -->
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
<version>1.4.7</version>
</dependency>
<!-- activation-1.1.1.jar -->
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
3、发送一封纯文本的邮件
package com.xu;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.util.Properties;
public class sendMail01 {
//简单邮件:纯文本内容
//复杂邮件:文本+图片+附件
//要发送邮件需要获取协议,开启POP3和SMTP服务
public static void main(String[] args) throws Exception {
Properties prop = new Properties();//创建一封邮件
//以下三项的Key的值都是固定的
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发送邮件的6个步骤======
//1、创建定义整个应用程序所需要的环境信息的Session对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication(){
//发件人邮箱的用户名和授权码(好像只有qq是授权码,其它的是密码)
return new PasswordAuthentication("1612893803@qq.com","授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过Session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("SMTP.qq.com","1612893803@qq.com","授权码");
//4、创建邮件
//创建邮件对象
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("1612893803@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("212694926@qq.com"));
//邮件的标题
message.setSubject("只是一个普通的纯文本邮件");
//邮件的文本内容
message.setContent("你好哇,我来了!","text/html;charset=UTF-8");
//5、发送邮件
ts.sendMessage(message,message.getAllRecipients());
//6、关闭连接
ts.close();
}
}
4、发送带图片和附件的邮件
package com.xu;
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.util.Properties;
public class sendMail02 {
//简单邮件:纯文本内容
//复杂邮件:文本+图片+附件
/*
*MimeMessage类表示整封邮件。
*MimeBodyPart类表示邮件的一个MIME消息。
*MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
*/
//要发送邮件需要获取协议,开启POP3和SMTP服务
public static void main(String[] args) throws Exception {
Properties prop = new Properties();//创建一封邮件
//以下三项的Key的值都是固定的
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发送邮件的6个步骤======
//变量名字定义的有点乱,不想改了。将就下吧
//1、创建定义整个应用程序所需要的环境信息的Session对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
public PasswordAuthentication getPasswordAuthentication(){
//发件人邮箱的用户名和授权码
return new PasswordAuthentication("1612893803@qq.com","授权码");
}
});
//开启Session的debug模式,这样就可以查看到程序发送Email的运行状态
session.setDebug(true);
//2、通过Session得到transport对象
Transport ts = session.getTransport();
//3、使用邮箱的用户名和授权码连上邮件服务器
ts.connect("SMTP.qq.com","1612893803@qq.com","授权码");
//4、创建邮件
//创建邮件对象
MimeMessage message = new MimeMessage(session);
//指明邮件的发件人
message.setFrom(new InternetAddress("1612893803@qq.com"));
//指明邮件的收件人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("212694926@qq.com"));
//邮件的标题
message.setSubject("这是一个有文本、图片、附件的邮件");
//邮件的内容
//=================================================
//准备图片数据 DataHandler:处理除文本外的数据
MimeBodyPart image = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("C:\Users\Think\Documents\image-20200220200136289.png"));
image.setDataHandler(dh);
image.setContentID("xx.png");//设置图片ID
//ContentID用于为“multipart/related”组合消息中的内嵌资源指定一个唯一标识号,在HTML格式的正文中可以使用这个唯一标识号来引用该内嵌资源。
//注意,在引用Content-ID头字段标识的内嵌资源时,要在资源的唯一标识号前面加上“cid:”,以说明要采用唯一标识号对资源进行引用。
//准备正文数据
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一个带图片、文本、附件<img src='cid:xx.png'>的邮件","text/html;charset=UTF-8");
//准备附件数据
MimeBodyPart accessory = new MimeBodyPart();
DataHandler dh2 = new DataHandler(new FileDataSource("C:\Users\Think\Pictures\Saved Pictures\illust_70110900_20191209_012234.jpg"));
accessory.setDataHandler(dh2);
accessory.setFileName(MimeUtility.encodeText("yan"));//给附件一个名字,发过去显示的就是这个设定的名字||MimeUtility.encodeText("")解决附件发送过去乱码;
//*****************************!!!!!!!**********************
/*
MimeBodyPart:表示复杂邮件的一个组成部分,它可以表示文本,附件,图片
DataHandler:表示可以读取图片或附件
MimeMultipart:表示二个邮件组成部分的关系,文本和图片的关系是"related"关系
Content-ID:表示图片的编号
related:图片|| mixed:附件
*/
//*****************************!!!!!!!**********************
//拼接图片和文本
MimeMultipart mm = new MimeMultipart();
mm.addBodyPart(text);
mm.addBodyPart(image);
mm.setSubType("related");
//将文本+图片封装成邮件的组成部分,即将关系看作成一个部分
MimeBodyPart context = new MimeBodyPart();
context.setContent(mm);
//把附件也加上
MimeMultipart file = new MimeMultipart();
file.addBodyPart(context);
file.addBodyPart(accessory);
file.setSubType("mixed");
//放到消息中
message.setContent(file);//把编辑好的内容放入消息中
message.saveChanges();//保存修改!
//=================================================
//5、发送邮件
ts.sendMessage(message,message.getAllRecipients());//message:发送的消息||message.getAllRecipients():获取保存在里面的地址
//6、关闭连接
ts.close();
}
//对于,复杂类型的邮件,位置关系特别注意和加入的顺利要一致
}