1、引言
在用户注册的时候我们如果需要让用户接收动态验证码通常有两种方式。一种是给用户发送短信验证码,另一种是发送邮箱验证码。而发送短信验证码的话就必须购买短信流量,这无疑增加了投入的成本,那么此时我们可以使用发送邮箱验证码的形式去代替,由于邮件发送的方式已经开放,我们完全可以自己搭建邮件服务器,从而不受限制的发送电子邮件,借此实现验证码发送、订阅推送以及各种相关的校验。
2、准备工作
首先要搭建邮件服务器,这里我就不介绍搭建邮件服务器的具体方法了,我只提供代码控制发送电子邮件的方式,关于邮件服务器的搭建请直接访问我的主页,然后查看我的收藏夹,其中有一个公开的收藏夹名为服务器问题,在里面我收藏了一篇文章,参照那里就能搭建邮件服务器。
3、jar包引入
为什么说是jar包引入,因为直接引入maven依赖有些问题,即使在maven项目中也请直接使用普通方法加载jar包的方式,如果要使用依赖方式引入,请自己排除问题,我还没有仔细研究maven项目中是什么原因导致无法发送成功,jar包名如下,请自行在csdn搜索下载:
javax.mail.jar
4、准备邮件工具类
这里需要准备相关的邮件工具类,我会去掉账号密码等信息,请自行填充自己的账号密码,这里虽然是设置默认发送网页,但是直接发送文本也可以,html网页在这里其实也是一种文本。
package com.user.mails;
import javax.mail.*;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Properties;
/**
* 发送邮件的工具类,需要使用javax.mail.jar,更复杂的方式参考csdn服务器问题收藏
*/
public class EmailUtils {
private String sendMailUserName;
private String sendMailPassword;
private String toMail;
private String title;
private String content;
/**
* @param sendMailUserName 服务器用户名
* @param sendMailPassword 发件人密码,我这里是服务器密码
* @param toMail 收件人邮箱
* @param title 邮件主题
* @param content 邮件内容
*/
public EmailUtils(String sendMailUserName, String sendMailPassword,
String toMail, String title,
String content){
this.sendMailPassword = sendMailPassword;
this.sendMailUserName= sendMailUserName;
this.toMail=toMail;
this.title =title;
this.content=content;
}
/**
* 发送邮件的方法,具体发送内容和主题,根据调用的参数发送,默认为网页内容,
* 但是直接提供文本内容也可以
*/
public void send() {
new Thread(new Runnable() {
@Override
public void run() {
Properties props = new Properties();
props.put("mail.smtp.host", "配置的邮件服务器域名");
props.put("mail.smtp.auth", "true");
Session session = Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(sendMailUserName,sendMailPassword);
}
});
try {
Transport transport = session.getTransport("smtp");
Message message = new MimeMessage(session);
//第一个参数是发件人邮箱,第二个参数是发件人昵称,设置后用户那里将显示昵称,而不是邮箱号
message.setFrom(new InternetAddress("邮件服务器中创建的邮箱账号,格式为:服务器用户名@一级域名","发件人昵称"));
message.setSubject(title);
//message.setText(content);//发送普通文本
message.setContent(content,"text/html;charset=UTF-8");//发送网页
message.setRecipient(Message.RecipientType.TO,new InternetAddress(toMail));
transport.send(message);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
5、发送文本示例
5.1、代码
这里在服务器每创建一个用户就对应一个邮箱账号,对应的邮箱格式为用户名@一级域名。
private void notice(){
String email="接收者邮箱账号";
String content="我不当大哥好多年";
EmailUtils mail = new EmailUtils("服务器用户名,这里不要使用root用户,使用普通用户的用户名",
"对应的服务器用户密码", email, "请收下我的膝盖",content);
mail.send();
System.out.println("发送完成");
}
5.2、效果
6、发送网页示例
6.1、代码
直接更改content字符串的内容即可:
String content="<!DOCTYPE html>\n" +
"<html lang=\"zh_CN\">\n" +
" <head>\n" +
" <meta http-equiv=\"Content-Type\" content=\"text/html\" charset=\"UTF-8\">\n" +
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n" +
" <title>邮件测试</title>\n" +
" <style type=\"text/css\">\n" +
" body{\n" +
" width: 100%;\n" +
" color: red;\n" +
" font-size: 2ch;\n" +
" background-color: yellow;\n" +
" }\n" +
" </style>\n" +
" </head>\n" +
" <body>\n" +
" 哦,大哥,大哥,你好吗?\n" +
" </body>\n" +
"</html>";