9.邮件介绍和实现
-
要在网络上实现邮件功能,得有专门的邮件服务器
-
邮件服务器类似邮局,主要负责接收用户投递过来的邮件,并将器发送到接收者的电子邮箱中
-
SMTP服务器地址:smtp.xxx.com,163邮箱是smtp.163.com,qq邮箱是smtp.qq.com
-
电子邮箱email地址需要在邮件服务器上申请,如qq邮箱要开通邮箱功能
-
注册邮箱账号的过程是在邮件服务器上开辟空间的过程, 用户a(a@163.com)登录浏览器通过网络链接163服务器,在自己账号下创建一份邮件,发送到163服务器,163服务器通过收件人通过收件人的名称区分之后通过网络找到b(b@qq.com)所在的qq服务器,将邮件发送到qq服务器上b(b@qq.com)账号所在的空间中,此过程发邮件完成,qq服务器发送消息或弹窗给b,b登录服务器打开接收。
-
发邮件三要素:收件人,主题,内容
-
Socket实现类似的功能了,就是一个线程循环监听和服务器临时存储消息。
-
发送邮件:smtp协议
-
接收邮件:pop3协议
9.1 传输协议
- SMTP协议;发送邮件:通常把处理用户smtp请求(邮件发送请求)的服务器称为smtp服务器。
- POP3协议;接受邮件;通常把处理用户pop3请求(邮件接收请求)的服务器称为pop3服务器。
- 注意:信件地址正确,控制台也打印了正确信息,收件箱收不到,有可能是收件箱服务器拒收了你发的邮件,认为是广告,这时可能会在垃圾箱找到,也可能找不到。此时应该换收件箱测试
9.2 java邮件发送
-
代码完成邮件发送。如:注册需要发送邮件进行账号激活,或oa项目中利用邮件进行任务提醒。
-
需要准备javamail api和java activation framework即两个jar包
-
javamail :供java开发人员在程序中实现邮件发送和接受的标准开发包,支持常用的邮件协议POP3/IMAP/SMTP/MIME(附件,非文本格式)。使用此包编写邮件,无需考虑邮件实现的底层细节,只需要调用此包中的api即可。
-
发送一封简单的邮件,保证电脑连接网络
-
- 创建包含邮件服务器的网络链接信息的session对像
- 创建代办邮件内容的message对象
- 创建transport对象,链接服务器,发送message,关闭链接
-
有4个核心类:
9.3 简单邮件
- 发送邮件,需要协议支持,开启邮箱的pop3/SMTP协议
- 用到邮箱服务授权码
@Test
public void sentSampleEmail() throws GeneralSecurityException, MessagingException {
Properties prop = new Properties();
//设置qq邮件服务器
prop.setProperty("mail.host","smtp.qq.com");
//邮件发生协议
prop.setProperty("mail.transport.protocol","smtp");
//需要验证用户名和密码
prop.setProperty("mail.smtp.auth","smtp.qq.com");
//关于qq邮箱,还要设置ssl加密,加上以下代码,其他邮箱不需要
MailSSLSocketFactory msf = new MailSSLSocketFactory();
msf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",msf);
//使用javamail发送邮件5个步骤
//1.创建定义整个应用所需的环境信息的session,用了监听器,qq才有
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");
}
});
//开启session的Debug,可以看到发送email的运行状态
session.setDebug(true);
//2.通过session得到Transport对象
Transport transport = session.getTransport();
//3.使用邮箱用户名和授权码链上服务器
transport.connect("smtp.qq.com","发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");
//4.创建邮件
//创建邮件对象,用本次邮箱回话的session
Message message = new MimeMessage(session);
//指明邮件发送人
message.setFrom(new InternetAddress("发送方账户@qq.com"));
//指明邮件接受人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("接受方账户@163.com"));
//设置邮件主题
message.setSubject("简单邮件");
//设置邮件内容,Multipart附件
message.setContent("<p style='color: chocolate'>简单邮件内容</p>","text/html;charset=utf-8");
/*if (o instanceof Multipart)
setContent((Multipart)o);
else
setDataHandler(new DataHandler(o, type));*/
//5.发送邮件
transport.sendMessage(message,message.getAllRecipients());
//5.关闭邮件
transport.close();
}
9.4 复杂邮件
-
MIME:多用途互联网邮件扩展协议
-
发送邮件,需要协议支持,开启邮箱的pop3/SMTP协议
-
Multipart附件
-
javax.mail.internet.MimeBodyPart:表示是一个mime消息,和MimeMessage类是一样从Part接口继承过来的。(代表一个个的信件组成部分)
-
javax.mail.internet.MimeMultipart是抽象类Multipart的子类,用来组合多个mime消息,一个MimeMultipart对象可以包含多个代码mime消息的MimeBodyPart对象(将多个信件部分糅合成一个信件)
@Test
public void sendFileEmail() throws Exception {
Properties prop = new Properties();
//设置qq邮件服务器
prop.setProperty("mail.host","smtp.qq.com");
//邮件发生协议
prop.setProperty("mail.transport.protocol","smtp");
//需要验证用户名和密码
prop.setProperty("mail.smtp.auth","smtp.qq.com");
//关于qq邮箱,还要设置ssl加密,加上以下代码,其他邮箱不需要
MailSSLSocketFactory msf = new MailSSLSocketFactory();
msf.setTrustAllHosts(true);
prop.put("mail.smtp.ssl.enable","true");
prop.put("mail.smtp.ssl.socketFactory",msf);
//使用javamail发送邮件5个步骤
//1.创建定义整个应用所需的环境信息的session,用了监听器,qq才有
Session session = Session.getDefaultInstance(prop, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication("发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");
}
});
//开启session的Debug,可以看到发送email的运行状态
session.setDebug(true);
//2.通过session得到Transport对象
Transport transport = session.getTransport();
//3.使用邮箱用户名和授权码链上服务器
transport.connect("smtp.qq.com","发送方账户@qq.com","邮箱设置开通pop3/smtp授权码");
MimeMessage message = getMimeMessage(session);
//5.发送邮件
transport.sendMessage(message,message.getAllRecipients());
//5.关闭邮件
transport.close();
}
public static MimeMessage getMimeMessage(Session session) throws MessagingException {
//4.创建邮件
//创建邮件对象,用本次邮箱回话的session
MimeMessage message = new MimeMessage(session);
//指明邮件发送人
message.setFrom(new InternetAddress("发送方账户@qq.com"));
//指明邮件接受人
message.setRecipient(Message.RecipientType.TO,new InternetAddress("接收方账户@163.com"));
//设置邮件主题
message.setSubject("简单邮件");
//设置邮件内容,Multipart附件
//message.setContent("<p style='color: chocolate'>简单邮件内容</p>","text/html;charset=utf-8");
//复杂邮件内容
//图片数据
MimeBodyPart image = new MimeBodyPart();
//图片需要经过数据处理,二进制到图片,DataHandler
DataHandler imageDH = new DataHandler(new FileDataSource("src/main/resources/dec.jpg"));
//在消息体中加入图片
image.setDataHandler(imageDH);
//给图片设置id,后续可以使用
image.setContentID("dec.jpg");
//正文数据:文本
MimeBodyPart content = new MimeBodyPart();
//cid:图片被使用
content.setContent("<p style='color: chocolate'>这是一封带<img src='cid:dec.jpg' alt='dec.jpg'>\n图片的信件</p>","text/html;charset=utf-8");
//附件
MimeBodyPart filecontent = new MimeBodyPart();
DataHandler propDH = new DataHandler(new FileDataSource("src/main/resources/log4j.properties"));
filecontent.setDataHandler(propDH);
filecontent.setFileName("log4j.properties");
//描述数据关系
MimeMultipart mimeMultipart = new MimeMultipart();
mimeMultipart.addBodyPart(image);
mimeMultipart.addBodyPart(content);
mimeMultipart.addBodyPart(filecontent);
mimeMultipart.setSubType("mixed");
//设置到消息中,保存更改
message.setContent(mimeMultipart);
message.saveChanges();
return message;
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123941.html