邮件开发
2015-09-25 18:56
323 查看
JavaMail开发:JavaEE技术之一
一、邮件开发用到的协议:SMTP、POP、RFC822、MIME
SMTP: Simple Message Transfer Protocal 简单消息传输协议。
发送邮件时使用的协议。描述了数据该如何表示。默认使用的端口:25
通常将处理用户SMTP请求的邮件服务器成为SMTP服务器
POP : ost Office Protocal邮局协议。
接收邮件时使用的协议。默认使用的端口:110
通常将处理用户POP请求的邮件服务器成为POP3服务器
二、 邮件的发送过程及用到的协议
三、 手工发送邮件和接收邮件(熟练SMTP等协议的)
0、 准备:
QQ邮箱服务器地址:SMTP:smtp.qq.com ; POP3:pop.qq.com
将用户名和密码进行Base64编码
1、DOS命令行手工发送邮件的过程:telnet (了解)
telnet smtp.qq.com 25
------------------------------------------------------------以下属于SMTP协议的内容
ehlo wzt //向服务器打招呼(主机名称)
auth login //请求认证
// 提示输入用户名和密码(Base64编码后的)
aXRoZWltYWNsb3Vk
aWFtc29ycnk=
mail from:<963353706@qq.com>
rcpt to:<963353706@qq.com>
data //说明邮件的开始
//邮件内容是要遵循一定格式的:RFC822规范
from:itheimacloud@163.com //邮件头 此处可以冒充别人发送邮件(fengjie@163.com)
to:itheima14@163.com
subject:这是一封手工发送的邮件 //主题
// 头体用空行分隔
aaaaaaaaaaaaaaaaaa //邮件体
bbbbbbbbbbbbbbbbbb
. // .用于结束邮件内容
------------------------------------------------------------
quit
2、手工收取邮件(POP协议)
telnet pop.qq.com 110
----------------------------------以下属于POP协议的东东
user 963353706
pass iamsorry
stat //返回邮箱的统计信息
list 邮件编号 //返回某一封的邮件统计信息
retr 邮件编号 //取出某一封邮件的内容
----------------------------------
quit
四、 JavaMail的核心API简介
准备: 导入jar包:mail.jar (注意:Javamail的API依赖jaf(Java Activation Framework)框架,
还需要导入jaf的jar包activation.jar。如果使用的是JDK6及以上版本,就不需要了)
Session: 代表邮件的环境
Message: 代表邮件内容部分
BodyPart: 代表复杂邮件中的每一部分
Multipart:描述由多个BodyPart组成的邮件的关系
五、 复杂邮件的组成原理图
六、 创建邮件:(卫星)
例:
① 只有文本的邮件
-------------------------------------------------------------------------------------------------
// JavaMail创建邮件过程,并将其保存到磁盘上
public class MailDemo1 {
public static void main(String[] args) throws Exception {
// 创建一封邮件
Properties props = new Properties(); // 环境变量设置,发送邮件时才需要
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session); // 代表一封邮件
// 设置发件人
message.setFrom(new InternetAddress("963306@qq.com"));
// 设置收件人
message.setRecipients(Message.RecipientType.TO, "963306@qq.com");
// 设置主题
message.setSubject("这是javamail发出的第一封邮件");
// 设置邮件的正文内容
message.setText("嘿嘿,javaMail发送的邮件1哦");
// 把邮件存储到磁盘上 注: 邮件的扩展名为.eml
message.writeTo(new FileOutputStream("c:/1.eml"));
}
}
-------------------------------------------------------------------------------------------------
② 既有文本,文本中还内嵌图片的邮件(MIME协议描述的) related
分割线:------------------------------238748932bc07
------------------------------238748932bc07
//文本部分
//头 Content-Type:text/html;
//体aaa<img src='cid:mm'/>aaa
------------------------------238748932bc07
//图片部分
Content-Type:image/jpeg
Content-Id:mm
jsdlkfjlkdslkjfds(base64编码)
dsfds
f
dsf
dsfds
f
dsfds
------------------------------238748932bc07--
-------------------------------------------------------------------------------------------------
// 创建文本中内嵌图片的邮件
public class MailDemo2 {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("963306@qq.com"));
message.setRecipients(Message.RecipientType.TO, "963706@qq.com");
message.setSubject("这是一封文本中内嵌图片的邮件");
// 文本部分 注: 该文本内嵌id为mm的图片
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("aaa<img src='cid:mm'/>aaa","text/html");
// 图片部分
MimeBodyPart imagePart = new MimeBodyPart();
// 借助JAF框架将磁盘上的文件读取过到邮件中
DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));
// 注: 通过jaf读取到的文件,不需要设置其MIME类型,JAF框架会自动探测到 且之后与原图片无关
imagePart.setDataHandler(dh);
imagePart.setContentID("mm");
// 将文本部分和图片部分整合到一个mmpart中,顺便说明俩者的关系
MimeMultipart mmpart = new MimeMultipart();
mmpart.addBodyPart(textPart);
mmpart.addBodyPart(imagePart);
mmpart.setSubType("related"); // 说明俩者有关系
// 将mmpart添加到邮件中,并保存改变
message.setContent(mmpart);
message.saveChanges();
message.writeTo(new FileOutputStream("c:/2.eml"));
}
}
-------------------------------------------------------------------------------------------------
③ 既有文本,文本中还内嵌图片的邮件,还有附件的邮件
注意: 主题、内容、附件名称的中文编码问题
主题和内容修改charset即可
附件名称采用解决编码的类MimeUtility.encodeText(filename)修改
-------------------------------------------------------------------------------------------------
// 创建一封包含文本、图片、附件的复杂邮件(参考 复杂邮件的组成原理图)
public class MailDemo3 {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("96306@qq.com"));
message.setRecipients(Message.RecipientType.TO,"963706@qq.com");
message.setSubject("这是一封包含文本、图片、附件的复杂邮件");
// 文本部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("古风图片bbb<img src='cid:mm'/>bbb", "text/html;charset=UTF-8");
// 内嵌图片部分
MimeBodyPart imagePart = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));
imagePart.setDataHandler(dh);
imagePart.setContentID("mm");
// 文本和内嵌图片合体部分
MimeMultipart mpart1 = new MimeMultipart();
mpart1.addBodyPart(textPart);
mpart1.addBodyPart(imagePart);
mpart1.setSubType("related");
MimeBodyPart textImagePart = new MimeBodyPart();
textImagePart.setContent(mpart1);
// 附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
dh = new DataHandler(new FileDataSource("c:/附件.rar"));
String filename = dh.getName(); // 获取附件原文件名
attachmentPart.setDataHandler(dh);
// 手工设置附件文件名(原文件名称) 注: 中文文件名要注意编码
attachmentPart.setFileName(MimeUtility.encodeText(filename));
// 全部合体部分
MimeMultipart mpart2 = new MimeMultipart();
mpart2.addBodyPart(textImagePart); // 文本加内嵌图片部分
mpart2.addBodyPart(attachmentPart); // 附件部分
mpart2.setSubType("mixed"); // 复杂关系
message.setContent(mpart2);
message.saveChanges();
message.writeTo(new FileOutputStream("c:/3.eml"));
}
}
-------------------------------------------------------------------------------------------------
七、发送邮件的俩种方式(火箭):
方式1:
---------------------------------------------------------------------------------------------------
public class SendMail1 {
public static void main(String[] args) throws Exception {
// 创建邮件
Properties props = new Properties();// 环境变量设置,发送邮件时才需要
props.setProperty("mail.transport.protocol", "smtp"); // 发送使用的协议
props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址
props.setProperty("mail.smtp.auth", "true"); // 请求身份验证
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("9706@qq.com"));
message.setRecipients(MimeMessage.RecipientType.TO, "96336@qq.com");
message.setSubject("这是我发送的一封简单邮件");
message.setText("嘿,马上要开学了~~~");
message.saveChanges();
// 发送邮件
Transport ts = session.getTransport(); // 得到火箭
ts.connect("963706@qq.com", "qq邮箱密码"); // 连接
ts.sendMessage(message, message.getAllRecipients()); // 发送给所有的用户
ts.close();
}
}
---------------------------------------------------------------------------------------------------
方式2:
---------------------------------------------------------------------------------------------------
public class SendMail2 {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("mail.transport.protocol","smtp"); // 发送使用的协议
props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址
props.setProperty("mail.smtp.auth", "true"); // 请求身份验证
Session session = Session.getDefaultInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("966@qq.com", "1877");
}
});
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("963353706@qq.com"));
message.setRecipients(MimeMessage.RecipientType.TO, "qq邮箱密码");
message.setSubject("这是我发送的第二封邮件哦");
message.setText("2 o my god tomorrow is learning~~~");
message.saveChanges();
Transport.send(message);
}
}
---------------------------------------------------------------------------------------------------
八、案例:用户注册,发送激活邮件
一、邮件开发用到的协议:SMTP、POP、RFC822、MIME
SMTP: Simple Message Transfer Protocal 简单消息传输协议。
发送邮件时使用的协议。描述了数据该如何表示。默认使用的端口:25
通常将处理用户SMTP请求的邮件服务器成为SMTP服务器
POP : ost Office Protocal邮局协议。
接收邮件时使用的协议。默认使用的端口:110
通常将处理用户POP请求的邮件服务器成为POP3服务器
二、 邮件的发送过程及用到的协议
三、 手工发送邮件和接收邮件(熟练SMTP等协议的)
0、 准备:
QQ邮箱服务器地址:SMTP:smtp.qq.com ; POP3:pop.qq.com
将用户名和密码进行Base64编码
1、DOS命令行手工发送邮件的过程:telnet (了解)
telnet smtp.qq.com 25
------------------------------------------------------------以下属于SMTP协议的内容
ehlo wzt //向服务器打招呼(主机名称)
auth login //请求认证
// 提示输入用户名和密码(Base64编码后的)
aXRoZWltYWNsb3Vk
aWFtc29ycnk=
mail from:<963353706@qq.com>
rcpt to:<963353706@qq.com>
data //说明邮件的开始
//邮件内容是要遵循一定格式的:RFC822规范
from:itheimacloud@163.com //邮件头 此处可以冒充别人发送邮件(fengjie@163.com)
to:itheima14@163.com
subject:这是一封手工发送的邮件 //主题
// 头体用空行分隔
aaaaaaaaaaaaaaaaaa //邮件体
bbbbbbbbbbbbbbbbbb
. // .用于结束邮件内容
------------------------------------------------------------
quit
2、手工收取邮件(POP协议)
telnet pop.qq.com 110
----------------------------------以下属于POP协议的东东
user 963353706
pass iamsorry
stat //返回邮箱的统计信息
list 邮件编号 //返回某一封的邮件统计信息
retr 邮件编号 //取出某一封邮件的内容
----------------------------------
quit
四、 JavaMail的核心API简介
准备: 导入jar包:mail.jar (注意:Javamail的API依赖jaf(Java Activation Framework)框架,
还需要导入jaf的jar包activation.jar。如果使用的是JDK6及以上版本,就不需要了)
Session: 代表邮件的环境
Message: 代表邮件内容部分
BodyPart: 代表复杂邮件中的每一部分
Multipart:描述由多个BodyPart组成的邮件的关系
五、 复杂邮件的组成原理图
六、 创建邮件:(卫星)
例:
① 只有文本的邮件
-------------------------------------------------------------------------------------------------
// JavaMail创建邮件过程,并将其保存到磁盘上
public class MailDemo1 {
public static void main(String[] args) throws Exception {
// 创建一封邮件
Properties props = new Properties(); // 环境变量设置,发送邮件时才需要
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session); // 代表一封邮件
// 设置发件人
message.setFrom(new InternetAddress("963306@qq.com"));
// 设置收件人
message.setRecipients(Message.RecipientType.TO, "963306@qq.com");
// 设置主题
message.setSubject("这是javamail发出的第一封邮件");
// 设置邮件的正文内容
message.setText("嘿嘿,javaMail发送的邮件1哦");
// 把邮件存储到磁盘上 注: 邮件的扩展名为.eml
message.writeTo(new FileOutputStream("c:/1.eml"));
}
}
-------------------------------------------------------------------------------------------------
② 既有文本,文本中还内嵌图片的邮件(MIME协议描述的) related
分割线:------------------------------238748932bc07
------------------------------238748932bc07
//文本部分
//头 Content-Type:text/html;
//体aaa<img src='cid:mm'/>aaa
------------------------------238748932bc07
//图片部分
Content-Type:image/jpeg
Content-Id:mm
jsdlkfjlkdslkjfds(base64编码)
dsfds
f
dsf
dsfds
f
dsfds
------------------------------238748932bc07--
-------------------------------------------------------------------------------------------------
// 创建文本中内嵌图片的邮件
public class MailDemo2 {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("963306@qq.com"));
message.setRecipients(Message.RecipientType.TO, "963706@qq.com");
message.setSubject("这是一封文本中内嵌图片的邮件");
// 文本部分 注: 该文本内嵌id为mm的图片
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("aaa<img src='cid:mm'/>aaa","text/html");
// 图片部分
MimeBodyPart imagePart = new MimeBodyPart();
// 借助JAF框架将磁盘上的文件读取过到邮件中
DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));
// 注: 通过jaf读取到的文件,不需要设置其MIME类型,JAF框架会自动探测到 且之后与原图片无关
imagePart.setDataHandler(dh);
imagePart.setContentID("mm");
// 将文本部分和图片部分整合到一个mmpart中,顺便说明俩者的关系
MimeMultipart mmpart = new MimeMultipart();
mmpart.addBodyPart(textPart);
mmpart.addBodyPart(imagePart);
mmpart.setSubType("related"); // 说明俩者有关系
// 将mmpart添加到邮件中,并保存改变
message.setContent(mmpart);
message.saveChanges();
message.writeTo(new FileOutputStream("c:/2.eml"));
}
}
-------------------------------------------------------------------------------------------------
③ 既有文本,文本中还内嵌图片的邮件,还有附件的邮件
注意: 主题、内容、附件名称的中文编码问题
主题和内容修改charset即可
附件名称采用解决编码的类MimeUtility.encodeText(filename)修改
-------------------------------------------------------------------------------------------------
// 创建一封包含文本、图片、附件的复杂邮件(参考 复杂邮件的组成原理图)
public class MailDemo3 {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("96306@qq.com"));
message.setRecipients(Message.RecipientType.TO,"963706@qq.com");
message.setSubject("这是一封包含文本、图片、附件的复杂邮件");
// 文本部分
MimeBodyPart textPart = new MimeBodyPart();
textPart.setContent("古风图片bbb<img src='cid:mm'/>bbb", "text/html;charset=UTF-8");
// 内嵌图片部分
MimeBodyPart imagePart = new MimeBodyPart();
DataHandler dh = new DataHandler(new FileDataSource("c:/1.jpg"));
imagePart.setDataHandler(dh);
imagePart.setContentID("mm");
// 文本和内嵌图片合体部分
MimeMultipart mpart1 = new MimeMultipart();
mpart1.addBodyPart(textPart);
mpart1.addBodyPart(imagePart);
mpart1.setSubType("related");
MimeBodyPart textImagePart = new MimeBodyPart();
textImagePart.setContent(mpart1);
// 附件部分
MimeBodyPart attachmentPart = new MimeBodyPart();
dh = new DataHandler(new FileDataSource("c:/附件.rar"));
String filename = dh.getName(); // 获取附件原文件名
attachmentPart.setDataHandler(dh);
// 手工设置附件文件名(原文件名称) 注: 中文文件名要注意编码
attachmentPart.setFileName(MimeUtility.encodeText(filename));
// 全部合体部分
MimeMultipart mpart2 = new MimeMultipart();
mpart2.addBodyPart(textImagePart); // 文本加内嵌图片部分
mpart2.addBodyPart(attachmentPart); // 附件部分
mpart2.setSubType("mixed"); // 复杂关系
message.setContent(mpart2);
message.saveChanges();
message.writeTo(new FileOutputStream("c:/3.eml"));
}
}
-------------------------------------------------------------------------------------------------
七、发送邮件的俩种方式(火箭):
方式1:
---------------------------------------------------------------------------------------------------
public class SendMail1 {
public static void main(String[] args) throws Exception {
// 创建邮件
Properties props = new Properties();// 环境变量设置,发送邮件时才需要
props.setProperty("mail.transport.protocol", "smtp"); // 发送使用的协议
props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址
props.setProperty("mail.smtp.auth", "true"); // 请求身份验证
Session session = Session.getDefaultInstance(props);
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("9706@qq.com"));
message.setRecipients(MimeMessage.RecipientType.TO, "96336@qq.com");
message.setSubject("这是我发送的一封简单邮件");
message.setText("嘿,马上要开学了~~~");
message.saveChanges();
// 发送邮件
Transport ts = session.getTransport(); // 得到火箭
ts.connect("963706@qq.com", "qq邮箱密码"); // 连接
ts.sendMessage(message, message.getAllRecipients()); // 发送给所有的用户
ts.close();
}
}
---------------------------------------------------------------------------------------------------
方式2:
---------------------------------------------------------------------------------------------------
public class SendMail2 {
public static void main(String[] args) throws Exception {
Properties props = new Properties();
props.setProperty("mail.transport.protocol","smtp"); // 发送使用的协议
props.setProperty("mail.host", "smtp.qq.com"); // 发送服务器的主机地址
props.setProperty("mail.smtp.auth", "true"); // 请求身份验证
Session session = Session.getDefaultInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("966@qq.com", "1877");
}
});
MimeMessage message = new MimeMessage(session);
message.setFrom(new InternetAddress("963353706@qq.com"));
message.setRecipients(MimeMessage.RecipientType.TO, "qq邮箱密码");
message.setSubject("这是我发送的第二封邮件哦");
message.setText("2 o my god tomorrow is learning~~~");
message.saveChanges();
Transport.send(message);
}
}
---------------------------------------------------------------------------------------------------
八、案例:用户注册,发送激活邮件
相关文章推荐
- Inheritance - SGU 129(线段与多边形相交的长度)
- 欢迎使用CSDN-markdown编辑器
- 在水果忍者游戏上做改编的中秋切月饼canvas小游戏
- MAC下Tomcat 8.0.26的下载与安装
- WebForm总结Day01_一般处理程序HttpHandler
- jquery mobaile中textarea根据内容自动调整高度
- 一道比较经典的迷宫问题
- 那些年让我头疼的logcat
- 初识duilib
- iOS开发入门杂记
- 大道至简(第二章)读后感
- (算法)前K大的和
- tomcat7.0 安装启动之后localhost:8080页面进不去,提示错误500
- 守望者的逃离
- 四种List集合的遍历
- C++学习记录之deque容器
- Codeforces 580E Kefa and Watch 线段树
- [BZOJ1303] [CQOI2009]中位数图
- 使用 Nginx 的 X-Sendfile 机制提升 PHP 文件下载性能
- DirectX11 光照