一、邮件发送的作用
1.给新注册的用户自动发送一封包含其注册信息的欢迎E-Mail
2.给过生日的注册会员自动发送一封表示祝贺的E-Mail
3.将网站的最新活动信息通过E-Mail发送给所有的注册会员
4.现阶段的注册过程大部分都是通过给邮箱发送验证码、验证链接来完后验证的。
二、邮件扫盲
2.1 邮件服务器
+++ 电子邮件服务器主要提供以下功能:
(1)接受用户发送的邮件,并将邮件转发给目标邮件服务器管理的邮箱中。
(2)接收其他邮件服务器转发来的邮件并把邮件存储到其管理的用户邮箱中;
(3)为前来读取邮件的用户提供读取服务。
+++ 邮件服务器按通讯协议可以划分为两种类型:
SMTP服务器 (发送邮件)
POP3/IMAP服务器 (接收)
2.2 电子邮箱与邮件客户端软件的关系
电子邮箱:
1.用户在邮件服务器上注册的账户,即电子邮箱,e-amil地址。
如,在qq邮箱中申请个人qq邮箱。
qq邮箱就是邮箱服务器,申请的个人QQ就是qq邮箱上注册的账户。
2.邮件服务器的作用主要是接受用户发送的信息,并将信息转发给目标用户。
如果目标用户在其他邮件服务器,则直接转发给其他邮件服务器,由其他邮件服务器去转发。
如果目标用户在自己的邮件服务器,则直接发转给目标用户。
邮件客户端软件:
1.在本地下载安装邮件客户端。邮件客户端负责与邮件服务器通讯。帮助用户发送信息、接受信息等。
如: 在本地安装foxmail本地邮件客户端。
配置好客户端与qq邮箱服务器的通讯。
在客户端上可以直接登录qq邮箱。然后可是实现发送、接受邮件等功能。
2.3 电子邮件的传输过程
一个邮件服务器包含两部分:
pop3服务器:负责接受邮件。
smtp服务器:负责发送邮件。
2.4 客户端连接邮箱服务器的配置
+++ 一个邮箱服务器分为两部分:
1.pop3服务器:负责接收邮件
2.smtp服务器:负责发送邮件
+++ 我们在配置邮件客户端时,需要配置
POP3服务器地址、端口号
SMTP服务器地址、端口号
+++ 我们在使用使用java发送邮件时,只需要配置发送服务器即可,无须配置
接收服务器。因为,我们只是发送邮件。所以只需配置
SMTP服务器地址、端口号
+++ 本地搭建易邮邮箱服务器,客户端要想与之通信,需要配置
POP3服务器地址:localhost(端口:110)
SMTP服务器地址:localhost(端口:25)
2.4.1 foxmail连接本地邮箱服务器
1)foxmail连接本地搭建的易邮服务器
进入foxmail,输入刚才你在本地邮箱服务器创建好的账号E-mail地址和密码登录。
2)配置账号邮箱账号信息填写刚才建立好的账号密码,pop服务器smtp发送和接收的服务都填写localhost
点击创建完成。
登录成功!
这样就可以在本地收发邮件了。
2.4.2 foxmail连接互联网QQ邮箱服务器
三、Java Mail 组件
3.1 Java Mail的来源
1.邮件服务器遵循MIME格式。
我们可以采用Socket连接远程邮件服务器,然后按照邮件协议与邮件服务进行
交互。但是,要想自己变成创建负责的MIME格式的邮件,是一件非常困难和麻烦
的事情。
2. JavaMail 是Sun公司为方便Java开发人员在应用程序中实现邮件发送和接收
功能而提供的一套标准开发包,它支持一些常用的邮件协议,如SMTP、
POP3、IMAP。
开发人员使用JavaMail API编写邮件处理软件时,
无须考虑邮件协议的底层实施细节,
只要调用JavaMail开发包中相应的API类就可以了。
3.2 邮件的格式
3.2.1 邮件格式的发展历程
1.RFC822邮件格式:
2.MIME协议----MIME,英文全称为“Multipurpose Internet Mail Extensions”,
1) 是目前互联网电子邮件普遍遵循的邮件技术规范,是多用途互联网邮件扩展。
2) 在MIME出现之前,互联网电子邮件主要遵循由RFC 822所制定的标准。
不过电子邮件一般只用来传递基本的ASCII码文本信息。
3) MIME在 RFC 822的基础上进行了扩展,引入了新的格式规范和编码方式,
在MIME的支持下,图像、声音、动画等二进制文件都可方便的通过电
子邮件来进行传递,极大地丰富了电子邮件的功能
4)目前互联网上使用的基本都是遵循MIME规范的电子邮件。
3.2.2 MIME协议
multipart/mixed类型:可以使用附件
multipart/related类型:可以使用图片等资源文件
MimeMessage类表示整封邮件。
MimeBodyPart类表示邮件的一个MIME消息。
MimeMultipart类表示一个由多个MIME消息组合成的组合MIME消息。
四、Java Mail 组件的API
4.1 邮件发送要点
1.邮件发送,只需连接邮件发送服务器即可
2.连接本地邮箱服务器,
只需登录本地账号和密码发送信息即可。
3.连接互联网邮箱服务器地址,如qq
需要登录qq的账号,qq的密码(这里的密码必须是appkey)
连接互联网邮箱,由于邮箱考虑到安全性,所以使用自定义
客户端登录时,输入的密码为appkey。这里的appkey需要在
邮箱中自定义设置。在邮箱设置中获取。
4.2 邮件发送 – 基础配置(模板代码)
4.2.1 连接本地服务器 – 模板代码
+++ 连接本地的邮箱服务器地址
prop.put("mail.smtp.host", "localhost"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 25); // 端口
@Test
public void testSend2() throws Exception {
// 1.设置连接邮件服务器的参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
//连接本地服务器
prop.put("mail.smtp.host", "localhost"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 25); // 端口
//连接其他服务器
//prop.put("mail.smtp.host", "smtp.qq.com"); // 主机 stmp.qq.com
//prop.put("mail.smtp.port", 465); // 端口
//2.创建基础对象
//2.1. 创建会话
Sesson session = Session.getDefaultInstance(prop);
//2.2 创建邮件对象
MimeMessage message = new MimeMessage(session);
//2.3 设置邮件参数
message.setSender(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("带图片的邮件");
message.setSentDate(new Date());
// 3.设置发送内容
//.........................
//.........................
//.........................
//4. 邮件发送
message.saveChanges(); // 保存邮件
Transport trans = session.getTransport();
trans.connect("lisi", "888"); // 指定连接发件人的用户密码
trans.sendMessage(message, message.getAllRecipients());
trans.close();// 断开连接
}
4.2.2 连接互联网服务器 – 模板代码
+++ 连接互联网的邮箱服务器地址
prop.put("mail.smtp.host", "smtp.qq.com"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 465); // 端口
@Test
public void testSend2() throws Exception {
// 1.设置连接邮件服务器的参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
//连接其他服务器
prop.put("mail.smtp.host", "smtp.qq.com"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 465); // 端口
//2.创建基础对象
//2.1. 创建会话
Sesson session = Session.getDefaultInstance(prop);
//2.2 创建邮件对象
MimeMessage message = new MimeMessage(session);
//2.3 设置邮件参数
message.setSender(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("带图片的邮件");
message.setSentDate(new Date());
// 3.设置发送内容
//.........................
//.........................
//.........................
//4. 邮件发送
message.saveChanges(); // 保存邮件
Transport trans = session.getTransport();
trans.connect("772169133", xxxxxxx); // 指定连接发件人的用户密码
trans.sendMessage(message, message.getAllRecipients());
trans.close();// 断开连接
}
4.3 邮件发送 – 内容设置
4.3.1 简单文本发送(简单文本、超链接)
message.setText("邮件正文2!");
发送简单的文本
message.setContent("<a href='http://www.baidu.com'>百度</a>","text/html;charset=UTF-8");
发送简单的html标签(不带资源文件)
使用的本地易邮服务器,初始化了lisi.qq.com 和zhangsan.qq.com。
模拟了lisi给zhangsan发送信息。
@Test
public void testSend2() throws Exception {
/** 1. 设置连接参数 **/
// 设置连接邮件服务器的参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true");
prop.put("mail.smtp.host", "localhost"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 25); // 端口
/** 2. 创建邮件对象 **/
//1. 创建邮件会话对象
Session session = Session.getDefaultInstance(prop);
//2. 创建邮件对象
MimeMessage message = new MimeMessage(session);
//3. 设置邮件对象参数: 发件人、收件人、主题、内容、发送时间
message.setSender(new InternetAddress("[email protected]")); //设置发送者的e-mail
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));//设置接收者的e-mail
message.setSubject("我的第一封邮件2!"); //设置主题
/** 3. 发送简单信息文本 **/
message.setText("邮件正文2!");
message.setSentDate(new Date()); //设置发送日期
/** 4.发送超链接*/
message.setContent("<a href='http://www.baidu.com'>百度</a>","text/html;charset=UTF-8");
message.saveChanges(); // 保存邮件
//4. 邮件发送
Transport trans = session.getTransport();
trans.connect("lisi", "888"); // 指定连接发件人的用户密码
trans.sendMessage(message, message.getAllRecipients());
trans.close();// 断开连接
}
4.3.2 复杂文本发送(带有图片、声音等资源文件)
content.setContent("<img src='cid:xx' />正文邮件,你看图片!", "text/html;charset=UTF-8");
发送复杂的html标签(含有图片资源,需要特殊处理)
@Test
public void testSend2() throws Exception {
// 设置连接邮件服务器的参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.host", "localhost"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 25); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
//1. 创建会话
Session session = Session.getDefaultInstance(prop);
//2. 创建邮件对象
MimeMessage message = new MimeMessage(session);
//3. 设置邮件参数
message.setSender(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("带图片的邮件");
message.setSentDate(new Date());
/************** 1. 发送资源文件( 带有图片的资源等 ) ********************/
// 1.1 创建负责复杂邮件体
MimeMultipart mul = new MimeMultipart("related"); // 邮件体related = 内容 + 资源
// 1.2 把复杂邮件体放到消息对象中。
message.setContent(mul);
//设置负责的邮件体
MimeBodyPart content = new MimeBodyPart(); // 内容
MimeBodyPart resource = new MimeBodyPart(); // 资源
// 把内容资源设置到复杂邮件中
mul.addBodyPart(content);
mul.addBodyPart(resource);
//---- 设置邮件资源------
String path = this.getClass().getResource("/a.jpg").getPath();
File file = new File(path);
DataSource ds = new FileDataSource(file);
DataHandler handler = new DataHandler(ds);
resource.setDataHandler(handler); // 设置数据资源
resource.setContentID("xx"); // 图片资源在邮件中的名称
//---- 设置邮件内容------
content.setContent("<img src='cid:xx' />正文邮件,你看图片!", "text/html;charset=UTF-8");
message.saveChanges(); // 保存邮件
//4. 邮件发送
Transport trans = session.getTransport();
trans.connect("lisi", "888"); // 指定连接发件人的用户密码
trans.sendMessage(message, message.getAllRecipients());
trans.close();// 断开连接
}
4.3.3 附件发送
@Test
public void testSend2() throws Exception {
// 设置连接邮件服务器的参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.host", "localhost"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 25); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
//1. 创建会话
Session session = Session.getDefaultInstance(prop);
//2. 创建邮件对象
MimeMessage message = new MimeMessage(session);
//3. 设置邮件参数
message.setSender(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("带图片的邮件");
message.setSentDate(new Date());
/*************设置总邮件块***************/
MimeMultipart all = new MimeMultipart("mixed");
// 左(内容 + 图片资源), 右 (附件)
MimeBodyPart left = new MimeBodyPart();
MimeBodyPart right = new MimeBodyPart();
// 设置
all.addBodyPart(left);
all.addBodyPart(right);
//把总邮件快, 设置到邮件体中
message.setContent(all);
// 设置 总邮件块的右侧, 即附件
String path_ = this.getClass().getResource("/a.jpg").getPath();
File file_ = new File(path_);
DataSource file_ds = new FileDataSource(file_);
DataHandler file_handler = new DataHandler(file_ds);
right.setDataHandler(file_handler);
right.setFileName("a.jpg"); // 附件中显示的文件名
/**************1. 邮件设置图片资源********************/
// 1.1 创建负责复杂邮件体
MimeMultipart mul = new MimeMultipart("related");
// 邮件体related = 内容 + 资源
MimeBodyPart content = new MimeBodyPart(); // 内容
MimeBodyPart resource = new MimeBodyPart(); // 资源
// 把内容资源设置到复杂邮件中
mul.addBodyPart(content);
mul.addBodyPart(resource);
//message.setContent(mul);
left.setContent(mul);
//---- 设置邮件资源------
String path = this.getClass().getResource("/a.jpg").getPath();
File file = new File(path);
DataSource ds = new FileDataSource(file);
DataHandler handler = new DataHandler(ds);
resource.setDataHandler(handler); // 设置数据资源
resource.setContentID("xx"); // 图片资源在邮件中的名称
//---- 设置邮件内容------
content.setContent("<img src='cid:xx' />正文邮件,你看图片!", "text/html;charset=UTF-8");
message.saveChanges(); // 保存邮件
//4. 邮件发送
Transport trans = session.getTransport();
trans.connect("lisi", "888"); // 指定连接发件人的用户密码
trans.sendMessage(message, message.getAllRecipients());
trans.close();// 断开连接
}
4.4 JavaMail封装的工具类
public class MailUtils {
private static Properties prop;
static {
// 设置连接邮件服务器的参数
prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.host", "localhost"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 25); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
}
/**
* 发送邮件
* @param email 收件人地址
* @param content 邮件内容
* @throws Exception
*/
public static void sendMail(String email, String content) throws Exception {
//1. 创建邮件会话对象
Session session = Session.getDefaultInstance(prop);
//2. 创建邮件对象
MimeMessage message = new MimeMessage(session);
//3. 设置邮件对象参数: 发件人、收件人、主题、内容、发送时间
message.setSender(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress(email)); // 【参数1】
message.setSubject("我的第一封邮件2!");
message.setText(content);// 【参数2】
message.setSentDate(new Date());
message.saveChanges(); // 保存邮件
//4. 邮件发送
Transport trans = session.getTransport();
trans.connect("zhangsan", "888"); // 指定连接发件人的用户密码
trans.sendMessage(message, message.getAllRecipients());
trans.close();// 断开连接
}
}
4.5 JavaMail示范代码
public class Mail2 {
// 邮件发送参数信息
static Properties prop = new Properties();
static String user = "roo";
static String pwd = "888";
// 初始化参数
static {
// 协议
prop.put("mail.transport.protocol", "smtp");
// 端口
prop.put("mail.smtp.port", "25");
// 主机
prop.put("mail.smtp.host", "localhost");
// 认证
prop.put("mail.smtp.auth", "true");
// 调试
prop.put("mail.debug", "true");
}
//1. 发送邮件
public static void sendEmail() throws Exception {
//创建会话对象
Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user,pwd));
//邮件对象
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.CC, new InternetAddress("[email protected]"));
message.setSentDate(new Date());
message.setSubject("踢足球..............");
message.setText("那些人去???");
message.saveChanges();
// 发送
Transport.send(message);
}
//2. 发送html邮件
public static void sendHtmlEmail() throws Exception {
//创建会话对象
Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user,pwd));
//邮件对象
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.CC, new InternetAddress("[email protected]"));
message.setSentDate(new Date());
message.setSubject("踢足球..............");
message.setContent("<a href='http://www.baidu.com'>度娘</a>", "text/html;charset=GBK");
message.saveChanges();
// 发送
Transport.send(message);
}
//3. 发送html + img 邮件
public static void sendHtmlAndImgEmail() throws Exception {
// 会话对象
Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user, pwd));
// 邮件对象
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("图片");
message.setSentDate(new Date());
// 设置多功能邮件
MimeMultipart multipart = new MimeMultipart("related");
message.setContent(multipart);
// 邮件内容: html + 文本
MimeBodyPart body = new MimeBodyPart();
// 邮件“内嵌资源”
MimeBodyPart source = new MimeBodyPart();
// 添加邮件内容,到多功能用途邮件
multipart.addBodyPart(body);
multipart.addBodyPart(source);
// 设置资源
DataSource ds = new FileDataSource(Mail2.class.getResource("1.jpg").getPath());
DataHandler handler = new DataHandler(ds);
source.setDataHandler(handler);
// 设置资源id,供邮件内容引用
source.setContentID("1.jpg");
// 设置内容
body.setContent("<img src='cid:1.jpg' />好好好", "text/html;charset=UTF-8");
// 保存邮件、发送
message.saveChanges();
Transport.send(message);
}
//4. 发送html + img + 附件邮件
public static void sendHtmlWithImgAndAttacheEmail() throws Exception {
// 会话对象
Session session = Session.getDefaultInstance(prop, new MyAuthenticator(user, pwd));
// 邮件对象
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("图片");
message.setSentDate(new Date());
/*********设置总邮件块***********/
MimeMultipart mix = new MimeMultipart("mixed");
message.setContent(mix);
// 左右快
MimeBodyPart left = new MimeBodyPart();
MimeBodyPart right = new MimeBodyPart();
// 添加
mix.addBodyPart(left);
mix.addBodyPart(right);
// 设置右边: 附件(中文:1. 路径解码; 2. 通过setFileName设置文件编码为gbk)
DataSource fileDs = new FileDataSource(URLDecoder.decode(Mail2.class.getResource("用户须知.doc").getPath(), "UTF-8"));
DataHandler fileHandler = new DataHandler(fileDs);
right.setDataHandler(fileHandler);
// 设置文件
right.setFileName(MimeUtility.encodeText("用户须知.doc"));
// 设置多功能邮件
MimeMultipart multipart = new MimeMultipart("related");
// 设置左边块: html + 文本 + 资源
left.setContent(multipart);
// 邮件内容: html + 文本
MimeBodyPart body = new MimeBodyPart();
// 邮件“内嵌资源”
MimeBodyPart source = new MimeBodyPart();
// 添加邮件内容,到多功能用途邮件
multipart.addBodyPart(body);
multipart.addBodyPart(source);
// 设置资源
DataSource ds = new FileDataSource(Mail2.class.getResource("1.jpg").getPath());
DataHandler handler = new DataHandler(ds);
source.setDataHandler(handler);
// 设置资源id,供邮件内容引用
source.setContentID("1.jpg");
// 设置内容
body.setContent("<img src='cid:1.jpg' />好好好", "text/html;charset=UTF-8");
// 保存邮件、发送
message.saveChanges();
Transport.send(message);
}
// 认证
static class MyAuthenticator extends Authenticator{
private String user;
private String pwd;
public MyAuthenticator(String user, String pwd) {
super();
this.user = user;
this.pwd = pwd;
}
public MyAuthenticator() {}
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, pwd);
}
}
public static void main(String[] args) throws Exception {
// sendEmail();
// sendHtmlEmail();
// sendHtmlAndImgEmail();
sendHtmlWithImgAndAttacheEmail();
}
}
4.6 总结
邮件发送模板代码
+++ 连接本地邮箱服务器时,
1.设置邮箱服务器地址 localhost (端口号:25)
2.输入账号、密码即可(账号、密码在邮箱服务端建立)
+++ 连接互联网邮箱服务器时,
1.设置邮箱服务器地址 ,具体网上查询
2.输入账号、appkey即可
这里的appkey指的就是密码。
appkey需要在邮箱中设置,获取。
@Test
public void testSend2() throws Exception {
// 1.设置连接邮件服务器的参数
Properties prop = new Properties();
prop.put("mail.transport.protocol", "smtp"); // 指定协议
prop.put("mail.smtp.host", "localhost"); // 主机 stmp.qq.com
prop.put("mail.smtp.port", 25); // 端口
prop.put("mail.smtp.auth", "true"); // 用户密码认证
prop.put("mail.debug", "true"); // 调试模式
//2.创建基础对象
//2.1. 创建会话
Sesson session = Session.getDefaultInstance(prop);
//2.2 创建邮件对象
MimeMessage message = new MimeMessage(session);
//2.3 设置邮件参数
message.setSender(new InternetAddress("[email protected]"));
message.setRecipient(RecipientType.TO, new InternetAddress("[email protected]"));
message.setSubject("带图片的邮件");
message.setSentDate(new Date());
// 3.设置发送内容
//.........................
//.........................
//.........................
//4. 邮件发送
message.saveChanges(); // 保存邮件
Transport trans = session.getTransport();
trans.connect("lisi", "888"); // 指定连接发件人的用户密码
trans.sendMessage(message, message.getAllRecipients());
trans.close();// 断开连接
}
邮件的内容设置
1.message为消息体对象
MimeMessage message = new MimeMessage(session);
2.发送简单文本
message.setText("邮件正文2!");
3.发送简单html标签(不含资源文件,如图片等)
message.setContent("<a href='http://www.baidu.com'>百度</a>","text/html;charset=UTF-8");
4.发送带有资源的html标签
我们把含有资源文件、附件的称之为复杂邮件体对象。
复杂邮件体对象 MimeMultipart 。
可以封装含有资源的html标签
MimeMultipart mul = new MimeMultipart("related");
可以封装附件、其他related复杂邮件体对象
MimeMultipart mul = new MimeMultipart("mixed");