JavaEmail
Email就是电子邮件。
电子邮件是从用户电脑的邮件软件发送到服务器上,可能经过若干个邮件服务器的中转,最终到达对方的邮件服务器上,收件方就可以用软件接收邮件:
![在这里插入图片描述]()
解释
MUA: Mail User Agent,给用户服务的邮件代理;
MTA: Mail Transfer Agent,邮件中转的代理。
MDA: Mail Delivery Agent,邮件到达的代理。
MTA和MDA这样的服务器软件通常是现成的,我们通常不会关心这个邮件服务一起的内部是如何运行的。
**常见的邮件协议由:POS3、 SMTP 、IMAP**
POPS3: Post Office Protocol 3 的简称,即邮局别亦的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的协议。他是因特网电子邮件的第一个离线协议标准,POPS3允许用户从服务器上把邮件存储到本地主机,同时删除保存在邮件服务器上的邮件,二POPS3服务器则是遵循POPS3协议的接收邮件服务器,用来接收电子邮件的。
SMTP:Simple Mail Transfer Portocol,简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通常他来控制邮件的中专方式。SMTP 协议属于TCP/IP协议簇,他帮助每台计算机在发送或中转新建时找到下一个目的地。AMTP服务器就是遵循SMTP协议的发送邮件服务器。
IMAP:Internet Mail Access Protocol,交互式邮件存取协议,他是跟POPS3雷士邮件访问标准之一。不同的是,开启了IMAP后,在电子邮件客户端收取的邮件仍然保留在服务器上同时在客户端上的操作都会反馈到服务器上。
我们关心的是如何实现邮件的发送,其实就是编写一个MUA的软件,把邮件发送到MTA上。MUA到MTA发送邮件的协议就是SMTP协议,它是Simple Mail Transport protocol的缩写,使用标准端口25,也可以使用加密端口465或587.SMTP协议是一个建立在TCP协议上的,必须遵循SMTP协议。使用Java程序发送邮件时,我们无需关心SMTP协议的底层原理,只需要使用JavaMail这个标准API就可以直接发送邮件。
准备SMIP登录信息
需要加入架包:
以126邮箱发送至qq邮箱为例:
首先开启指定的条件:
设置好之后,就可以在Java中编写程序了。
核心代码块:
//1、创建Session对象
Session session = JavaMailUtils.createSession();
//2、创建邮件对象(Message抽象类的子类);
MimeMessage msg = new MimeMessage(session);
msg.setFrom(new InternetAddress("wennnn@126.com"));//发件人
msg.setRecipient(RecipientType.TO,new InternetAddress("2611111119@qq.com"));
msg.setSubject("email","utf-8");
msg.setText("种一棵树最好的时间是十年前,其次是<b>现在</b>","utf-8","html");
//3、发送邮件
Transport.send(msg);
其中所调用的程序是:
//SMTP的位置
String smtp = "smtp.126.com";
//创建登录名和密码
String userName = "wennnn@126.com";
String passWord = "KXBQLKD";
//STMP服务器的连接信息
// 连接到SMTP服务器25端口:
Properties props = new Properties();
props.put("mail.smtp.host", smtp); // SMTP主机名
props.put("mail.smtp.port", "25"); // 主机端口号
props.put("mail.smtp.auth", "true"); // 是否需要用户认证
props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
//创建Session
//参数1:STMP服务器偶的连接信息
//参数2:用户认证对象(Authenticator接口的匿名实现类)
// 获取Session实例:
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(userName, passWord);
}
});
// 设置debug模式便于调试:
session.setDebug(true);
return session;
以上两个类就可以实现用Java实现对邮件的发送!
**发送HTML文件**
发送HTML邮件和文本邮件时时类似的,只需要把:
message.setText(body, "UTF-8");
改为:
message.setText(body, "UTF-8", "html");
发送附件
要在电子邮件中接待附件,我们就不能直接调用massage.setText()方法,而是要构造一个Multipart对象:
// 创建MimeMessage邮件信息对象
// ...略
// 创建Multipart复合对象
Multipart multipart = new MimeMultipart();
// 添加text:
BodyPart textpart = new MimeBodyPart();
textpart.setContent(body, "text/html;charset=utf-8");
multipart.addBodyPart(textpart);
// 添加image:
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileName(附件名称);
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(文件流字节数组, "application/octet-stream")));
multipart.addBodyPart(imagepart);
// 设置邮件内容为multipart:
message.setContent(multipart);
一个Multipart对象可以添加若干个BodyPart,其中第一个BodyPart是文本,即邮件正文,后面的BodtPart是附件。BodyPart依靠setContent()决定添加的内容,如果添加文本,用setContent("...","text/plain;charset=utf-8")添加纯文本,或者用setContent("...","text/html;charset=utf-8")添加HTML文本。如果添加附件,需要设置文件名(不一定和真实文件名一致),并且添加一个DataHandler(),传入文件的MIME类型。二进制文件可以用application/octet-stream,Word文档则是application/msword。最后通过setContent()把Multipart添加到Message中,即可发送。
发送内嵌图片的HTML邮件
如果需要HTML邮件中内嵌图片,推荐使用的是Mutlipart:
// 创建MimeMessage邮件信息对象
// ...略
// 创建Multipart复合对象
Multipart multipart = new MimeMultipart();
// 添加text:
BodyPart textpart = new MimeBodyPart();
textpart.setContent("<h1>Hello</h1><p><img src=\"cid:img01\"></p>", "text/html;charset=utf-8");
multipart.addBodyPart(textpart);
// 添加image:
BodyPart imagepart = new MimeBodyPart();
imagepart.setFileName("lvjuren.jpg");
imagepart.setDataHandler(new DataHandler(new ByteArrayDataSource(文件流字节数组, "application/octet-stream")));
// 设置当前image为内嵌图片
// 这个ID和HTML中引用的ID对应起来,邮件客户端就可以正常显示内嵌图片
imagepart.setHeader("Content-ID", "<img01>");
multipart.addBodyPart(imagepart);