邮件发送协议
要在网络上实现邮件功能,必须要有专门的邮件服务器。这些邮件服务器类似于现实生活中的邮局,它主要负责接收用户投递过来的邮件,并把邮件投递到邮件接收者的电子邮箱中。
SMTP服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
-
SMTP协议
通常把处理用户smtp请求(邮件发送请求)的服务器称之为SMTP服务器(邮件发送服务器)。 -
POP3协议
通常把处理用户pop3请求(邮件接收请求)的服务器称之为POP3服务器(邮件接收服务器)。
邮件发送流程
发送邮件
需要的jar包
- mail.jar
- activation.jar
使用qq邮箱发送一封普通邮件
qq邮箱发送邮件需要获取授权码
package com.wcy;
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;
/**
* 使用qq邮箱发送一封简单的邮件
*/
public class EmailTest01 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
// 配置
Properties properties = new Properties();
// 设置qq邮件服务器
properties.setProperty("mail.host","smtp.qq.com");
// 邮件发送协议
properties.setProperty("mail.transport.protocol","smtp");
// 需要验证
properties.setProperty("mail.smtp.auth","true");
//QQ邮箱需要设置SSL加密 只是qq邮箱需要
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
//创建一个session对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 这里的password是qq邮箱获取的授权码
return new PasswordAuthentication("sepcai@qq.com","授权码");
}
});
//开启debug模式
session.setDebug(true);
//java发送邮件的步骤
//1 获取连接对象
Transport transport = session.getTransport();
//2 连接服务器
transport.connect("smtp.qq.com","sepcai@qq.com","授权码");
//3 创建邮件对象
MimeMessage mimeMessage = new MimeMessage(session);
//邮件发送人
mimeMessage.setFrom(new InternetAddress("sepcai@qq.com"));
//邮件接收人
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("sepcai@163.com"));
//邮件标题
mimeMessage.setSubject("Hello");
//邮件内容
mimeMessage.setContent("<h1>来了</h1>","text/html;charset=UTF-8");
//4发送邮件
transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//5关闭连接
transport.close();
}
}
发送内嵌图片邮件
package com.wcy;
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 EmailTest02 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
// 配置
Properties properties = new Properties();
// 设置qq邮件服务器
properties.setProperty("mail.host", "smtp.qq.com");
// 邮件发送协议
properties.setProperty("mail.transport.protocol", "smtp");
// 需要验证
properties.setProperty("mail.smtp.auth", "true");
//QQ邮箱需要设置SSL加密 只是qq邮箱需要
MailSSLSocketFactory sf = new MailSSLSocketFactory();
sf.setTrustAllHosts(true);
properties.put("mail.smtp.ssl.enable", "true");
properties.put("mail.smtp.ssl.socketFactory", sf);
//创建一个session对象
Session session = Session.getDefaultInstance(properties, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
// 这里的password是qq邮箱获取的授权码
return new PasswordAuthentication("sepcai@qq.com", "授权码");
}
});
//开启debug模式
session.setDebug(true);
//java发送邮件的步骤
//1 获取连接对象
Transport transport = session.getTransport();
//2 连接服务器
transport.connect("smtp.qq.com", "sepcai@qq.com", "授权码");
//3 创建邮件对象
MimeMessage mimeMessage = prepareEmail(session);
//邮件发送人
mimeMessage.setFrom(new InternetAddress("sepcai@qq.com"));
//邮件接收人
mimeMessage.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress("sepcai@163.com"), new InternetAddress("2104706490@qq.com")});
//4发送邮件
transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());
//5关闭连接
transport.close();
}
//编写邮件内容
public static MimeMessage prepareEmail(Session session) throws MessagingException {
//1.准备图片
MimeBodyPart bodyPart = new MimeBodyPart();
//2.将图片变为数据流
//获取图片数据
FileDataSource fileDataSource = new FileDataSource("E:\\java_program\\程序\\javaWeb\\File\\SendEmail\\src\\bg.jpg");
//需要一个处理数据流的处理器来处理
DataHandler dataHandler = new DataHandler(fileDataSource);
//把图片数据放到邮件的正文中
bodyPart.setDataHandler(dataHandler);
//给图片设置一个名字
bodyPart.setContentID("bg.jpg");
//设置文本内容
MimeBodyPart bodyPart2 = new MimeBodyPart();
//给第二个邮件内容插入图片 通过图片ID插入
bodyPart2.setContent("这是一封内嵌图片的邮件" + "<img src='cid:bg.jpg'>", "text/html;charset=utf-8");
//拼接邮件,描述关系
MimeMultipart multipart = new MimeMultipart();
multipart.addBodyPart(bodyPart);
multipart.addBodyPart(bodyPart2);
//描述邮件类型:related表示邮件为内嵌类型 mixed表示邮件为附件类型
multipart.setSubType("related");
MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.setContent(multipart);
//设置标题
mimeMessage.setSubject("来了老弟");
//保存设置
mimeMessage.saveChanges();
return mimeMessage;
}
}
发送带附件的邮件
package com.wcy;
import com.sun.mail.util.MailSSLSocketFactory;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import java.security.GeneralSecurityException;
import java.util.Properties;
public class EmailTest04 {
public static void main(String[] args) throws GeneralSecurityException, MessagingException {
Properties prop = new Properties();
prop.setProperty("mail.host", "smtp.qq.com"); //设置QQ邮件服务器
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);
//1、创建定义整个应用程序所需的环境信息的 Session 对象
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
//传入发件人的姓名和授权码
return new PasswordAuthentication("sepcai@qq.com", "授权码");
}
});
session.setDebug(true);
//2、通过session获取transport对象
Transport transport = session.getTransport();
//3、通过transport对象邮箱用户名和授权码连接邮箱服务器
transport.connect("smtp.qq.com", "sepcai@qq.com", "授权码");
//4、创建邮件,传入session对象
MimeMessage mimeMessage = complexEmail(session);
//5、发送邮件
transport.sendMessage(mimeMessage,mimeMessage.getAllRecipients());
//6、关闭连接
transport.close();
}
public static MimeMessage complexEmail(Session session) throws MessagingException {
//消息的固定信息
MimeMessage mimeMessage = new MimeMessage(session);
//发件人
mimeMessage.setFrom(new InternetAddress("sepcai@qq.com"));
//收件人
mimeMessage.setRecipient(Message.RecipientType.TO,new InternetAddress("sepcai@qq.com"));
//邮件标题
mimeMessage.setSubject("带图片和附件的邮件");
//邮件内容
//准备图片数据
MimeBodyPart image = new MimeBodyPart();
DataHandler handler = new DataHandler(new FileDataSource("E:\\java_program\\程序\\javaWeb\\File\\SendEmail\\src\\bg.jpg"));
image.setDataHandler(handler);
image.setContentID("test.png"); //设置图片id
//准备文本
MimeBodyPart text = new MimeBodyPart();
text.setContent("这是一段文本<img src='cid:test.png'>","text/html;charset=utf-8");
//附件
MimeBodyPart appendix = new MimeBodyPart();
appendix.setDataHandler(new DataHandler(new FileDataSource("D:\\桌面\\文档\\阿里巴巴Java开发手册1.4.0.pdf")));
appendix.setFileName("test.pdf");
//拼装邮件正文
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(image);
mimeMultipart.addBodyPart(text);
mimeMultipart.setSubType("related");//文本和图片内嵌成功
//将拼装好的正文内容设置为主体
MimeBodyPart contentText = new MimeBodyPart();
contentText.setContent(mimeMultipart);
//拼接附件
MimeMultipart allFile = new MimeMultipart();
allFile.addBodyPart(appendix);//附件
allFile.addBodyPart(contentText);//正文
allFile.setSubType("mixed"); //正文和附件都存在邮件中,所有类型设置为mixed
//放到Message消息中
mimeMessage.setContent(allFile);
mimeMessage.saveChanges();//保存修改
return mimeMessage;
}
}