使用 javamail 做邮箱验证功能

时间:2022-09-24 09:20:38

在自己最近做的一个小项目中使用了注册时邮箱验证激活的功能,第一次接触到了 javaMail,以前只是知道有这个东西,却从来没有用过,这次正好有机会,便去大致的看了一些 demo,完成了自己这个邮箱验证激活的功能,现在只是简单会用,以后还是要深入学习,先在这儿记录一下 javaMail 简单的使用。

javaMail 是 sun 公司提供的实现邮件发送和接收功能的一套标准开发类库,支持常用的邮件协议,如 smtp、pop3、imap,使用 javamail 开发邮件程序无需考虑底层Socket通信的细节,并且支持创建各种复杂 MIME 格式的邮件。

首先需要去下载 javaMail 相关的 jar ,我使用的是 javamail-1.4.7 这个,因为我只用到了简单的发邮件的功能,所以只需要将 mail.jar 这个 jar 加到classpath 下即可。

先简单来认识一下 javaMail 的一些常用类:

Session 定义了一个基本的邮件会话,任何工作都是基于这个Session的。Session 对象需要一个 java.util.Properties 对象来得到类似 邮件服务器,用户名,密码这样的信息。Session 的构造函数是私有的,可以通过 getDefaultInstance() 方法来取得一个单一的可以被共享的默认session。 

一旦创建了 Session 对象,接着就要使用 Message 来发送邮件。

Message 是一个抽象类,在大部分应用中我们可以使用它的子类javax.mail.internet.MimeMessage 。如:

MimeMessage message = new MimeMessage(session);
message.setContent("Email Content. "text/plain"); //设置邮件内容
message.setSubject(" Subject "); //设置主题
这里常用 Session 对象作为构造函数的参数。

Address 当创建了 Session 以及 Message,并且已经为message 填充了内容,那么接下来要做的就是给你的邮件添加一个地址(Address),我们常用的是它的子类 javax.mail.internet.InternetAddress,需要使用 Message 的msg.setFrom(new InternetAddress("你的邮箱")) 识别发送者,使用 setRecipient() 方法识别接收者。这个方法除了address参数之外,还需要一个Message.RecipientType,Message.RecipientType有几个预先定义好的类型

Message.RecipientType.TO  //收件人
Message.RecipientType.CC  //抄送
Message.RecipientType.BCC  //暗送

如果需要多个收件地址,可以使用 InternetAddress[] addrs = {} 构造多个收件地址。

Authenticator 通过Authenticator设置用户名、密码,我们需要实现这个抽象类,实现getPasswordAuthentication()方法,并返回一个PasswordAuthentication实例,然后在 Session 创建时注册这个Authenticator。

Transport 发送消息的最后一步是使用 Transport,调用它的静态方法 send 来发送邮件,Transport.send(msg);

以下是主要的完整代码:

public class SendMailUtil {

public static final String HOST = "smtp.163.com";
public static final String PROTOCOL = "smtp";
public static final int PORT = 25;
public static final String SENDER = "***@163.com";//
public static final String SENDERPWD = "******";

/**
* 获取用于发送邮件的Session
* @return
*/
public static Session getSession() {
Properties props = new Properties();
props.put("mail.smtp.host", HOST);//设置服务器地址
props.put("mail.store.protocol" , PROTOCOL);//设置协议
props.put("mail.smtp.port", PORT);//设置端口
props.put("mail.smtp.auth" , true);

Authenticator authenticator = new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(SENDER, SENDERPWD);
}
};
Session session = Session.getDefaultInstance(props,authenticator);
return session;
}

/**
* 发送邮件
* @param receiver
* @param content
*/
public static void send(String receiver, String content) {
Session session = getSession();
try {
System.out.println("-------开始发送-------");
Message msg = new MimeMessage(session);
//设置message属性
msg.setFrom(new InternetAddress(SENDER));
InternetAddress[] addrs = {new InternetAddress(receiver)};
msg.setRecipients(Message.RecipientType.TO, addrs);
msg.setSubject("yechblog-帐号激活");
msg.setSentDate(new Date());
msg.setContent(content,"text/html;charset=utf-8");
//开始发送
Transport.send(msg);
System.out.println("-------发送完成-------");
} catch (AddressException e) {
e.printStackTrace();
} catch (MessagingException e) {
e.printStackTrace();
}
}