JavaMail是Java官方提供给开发者用来处理邮件的API,该api中提供了POP3、SMTP、IMAP4的支持。
你可以通过官网获取该jar包JavaMail API (oracle.com)
在我们的项目中使用的话,首先我们需要创建Session,它类似于HTTP会话我们收发邮件都是基于这个会话。
Session session = JavaEmailUtils.createSeaaion();
其中JavaEmailUtils是自己封装的一个用来创建会话的类;
JavaEmailUtils代码如下:
package com.zjb.demo.email;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
public final class JavaEmailUtils {
private JavaEmailUtils() {}
public static Session createSeaaion() {
//SRMP服务器连接信息
Properties props = new Properties();
props.put("mail.smtp.host","smtp.163.com"); //SMTP主机名
props.put("mail.smtp.port","25"); //主机端口号
props.put("mail.smtp.auth","true"); //是否需要用户认证
props.put("mail.smtp.starttls.enable","true"); //启用TLS加密
//使用getInstance()这个静态工厂方法获得自定义的Session
//参数1 stmp服务器连接参数
//参数2 授权账户密码对象
Session session = Session.getInstance(props,new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
String userName = "13093939936@163.com";//邮件发送方的账户
String passWord = "QMYUOQNOWYIJGUOQ";//账号授权密码
return new PasswordAuthentication(userName, passWord);
}
});
return session;
}
}
其中在创建Session的时候我们需要使用Pprperties对象添加我们需要的使用邮箱的服务器主机名、服务器的端口号、是否需要用户认证、TLS加密等需使用的共享信息。
Session session = JavaEmailUtils.createSeaaion();
MimeMessage msg = new MimeMessage(session);
msg.setSubject("触不可及");
msg.setFrom(new InternetAddress("13093939936@163.com"));
msg.setRecipient(RecipientType.TO, new InternetAddress("17789102307@163.com"));
msg.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("1423161910@qq.com")});
创建完Session对象之后,就可以构造发送信息体了,在这里官方为开发者提供了Message类型来帮助开发者完成这项工作。由于Message是一个抽象类,大多数情况下,我们使用javax.mail.internet.MimeMessage这个子类,该类是使用MIME类型、MIME信息头的邮箱信息。信息头只能使用US-ASCII字符,而非ASCII字符将通过编码转换为ASCII的方式使用。
为了建立一个MimeMessage对象,我们必须将Session对象作为MimeMessage构造方法的参数传入。
在建立了MimeMessage对象后,我们需要设置它的各个part,对于MimeMessage类来说,这些part就是MimePart接口。
如果我们所使用的MimeMessage中信息内容是文本的话,我们便可以直接使用setText()方法来方便的设置文本内容:
msg.Text("hello");
使用setSubject()方法对邮件设置邮件主题:
msg.setSubject("title");
我们通过msg的setFrom()和setReplyTo()两种方法设置邮件的发信人:
msg.setFrom(address);
msg.setReplyTo(address);
通过setRecipient方法可以设置收件方(第一个参数为收件人类型,第二个参数是收件人对象)
使用附件
附件作为与邮件相关的资源经常以文本、表格、图片等格式出现,如流行的邮件客户端一样,我们可以用JavaMail API从邮件中获取附件或是发送带有附件的邮件。
发送带有附件的邮件
发送带有附件的邮件的过程有些类似转发邮件,我们需要建立一个完整邮件的各个邮件体部分,在第一个部分(即我们的邮件内容文字)后,增加一个具有DataHandler的附件而不是在转发邮件时那样复制第一个部分的DataHandler。
发送HTML邮件
假如我们需要发送一个HTML文件作为邮件内容,并使邮件客户端在读取邮件时获取相关的图片或者文字的话,只要设置邮件内容为html代码,并设置内容类型为text/html即可:
在邮件中包含图片
如果我们在邮件中使用HTML作为内容,那么最好将HTML中使用的图片作为邮件的一部分,这样无论是否在线都会正确的显示HTML中的图片。处理方法就是将HTML中用到的图片作为邮件附件并使用特殊的cid URL作为图片的引用,这个cid就是对图片附件的Content-ID头的引用。
处理内嵌图片就像向邮件中添加附件一样,不同之处在于我们必须通过设置图片附件所在的邮件体部分的header中Content-ID为一个随机字符串,并在HTML中img的src标记中设置为该字符串。这样就完成了图片附件与HTML的关联。
BodyPart textPart = new MimeBodyPart();
StringBuilder text = new StringBuilder();
text.append("<h3>云深不知处</h3>");
text.append("<p>你好帅啊</p>");
text.append("<img src=\"cid:ysbzc\"/>");
textPart.setContent(text.toString(),"text/html;charset=utf-8");
最后将两个邮件体放入到Multipart中,设置邮件内容为这个容器Multipart,发送邮件。
Multipart multipart = new MimeMultipart();
multipart.addBodyPart(textPart);
multipart.addBodyPart(FilePart);
msg.setContent(multipart);
Transport
在发送信息时,Transport类将被用到。这个类实现了发送信息的协议(通称为SMTP),此类是一个抽象类,我们可以使用这个类的静态方法send()来发送消息:
Transport.send(message);
注意:如果需要在发送邮件过程中监控mail命令的话,可以在发送前设置debug标志:
session.setDebug(true)。
Transport.send(msg);
session.setDebug(true);