javax.mail
mail
1.4.7
首先当然是导入jar包了啊
如果是maven项目可以进maven资源库进行搜索导入,在此附上地址:https://mvnrepository.com
这是需要导入的jar包 commons-email-1.x.jar、mail.jar activation.jar,其中activation.jar我并没有导入,但是还是发送成功了,但看网上有蛮多都说需要导入,所以看你们咯,可以试试。
紧着就是确定QQ开通了POP3/SMPT协议,只需要发件人开通就好了
不知道怎么开通的看图,首先进入QQ邮箱,点击设置点击“账户”,然后往下面拉,拉到下面“POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务点击开启
也就是这个
然后会弹出一个页面,需要你发送消息进行验证,当然你也可以不适用短信验证,选择一种你认为最方便的就行咯
验证完了之后你会得到一个授权码,这个授权码就相当于你发送邮件的时候所需要用到的密码一样,账户当然是你的咯。这个授权码可以后续重新生成的,所以不需要担心忘记了
在上面这些步骤完成之后就可以开始代码测试了,我这个方法放回boolean类型的原因是后续会在控制层进行判断是否发送成功
其中参数如下:code:验证码(待会附上验证码的代码)
email:收件人的邮箱号
content:发送消息的内容
username:这个参数其实没啥用,只是我用来替换发送内容的名字的,这个你不用管就是
public boolean sendSimpleMessage(String code, String email, String content, String username)
throws MessagingException {
Properties p = new Properties();
try {
//发送邮件协议名称
p.setProperty("mail.transport.protocol", "smtp");
//发送服务器需要身份验证
p.setProperty("mail.smtp.auth", "true");
//设置主机名
p.setProperty("mail.smtp.host",this.iUserService.findConfigEmail("smtpHost").getString("value"));
p.setProperty("mail.smtp.port", "25"); //端口号
//创建emailsession,其中MyAuthenticator为自定义的类,继承了Authenticator,并重写了getPasswordAuthentication方法
Session session = Session.getInstance(p,new MyAuthenticator(this.iUserService.findConfigEmail("smtpUserName").getString("value"),
this.iUserService.findConfigEmail("smtpPwd").getString("value")));
session.setDebug(false);
Message messgae = new MimeMessage(session);
//设置发件人地址,即你的发件人qq账户
messgae.setFrom(new InternetAddress(this.iUserService.findConfigEmail("smtpUser").getString("value")));
//发件内容替换(你可以不用下面这两行代码)
content = content.replace("$mobile_code",code);
content = content.replace("$mobile_name",username);
//设置发件内容
messgae.setText(content);
//设置邮件标题
messgae.setSubject(this.iUserService.findConfigEmail("smtpTitle").getString("value"));
//通过session获得transport对象
Transport tran = session.getTransport();
tran.connect();
//发送邮件并设置收件人地址
tran.sendMessage(messgae,
new Address[] { new InternetAddress(email) });
tran.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
在上面代码所说的自定义实现的MyAuthenticator代码如下,userName就是发件人邮箱,passwordd就是之前的授权码
public class MyAuthenticator extends Authenticator{
String userName=null;
String password=null;
public MyAuthenticator(){
}
public MyAuthenticator(String username, String password) {
this.userName = username;
this.password = password;
}
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(userName, password);
}
}
验证码生成代码
private char randomChar(){
Random r = new Random();
String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";
return s.charAt(r.nextInt(s.length()));
}
整个过程就这样结束了,另外我上面的相关配置因为都是保存在数据库中的,所以你只需要直接替换成自己的相关配置信息就好了,在测试完之后可以进入你的邮箱查看是否发送成功。
今天我要分享的是利用阿里大鱼实现网站和APP的短信验证。
阿里大鱼开放了很多的消息通知服务,包括短信通知,语音通知等。
阿里大鱼的短信发送官方API:https: //api.alidayu.com/doc2/apiDetail.htm?spm=a3142.7395905.4.6.9hYSEi&apiId=25450
要实现短信发送通知必须先具备以下条件。
1.在阿里大鱼上开通账号,阿里大鱼的官网:https: //www.alidayu.com/
2.登录账号之后点击配置管理–验证码–配置短信签名–添加签名。等待审核!审核通过后拿到你的短信签名。我的短信签名是注册认证。
3.在上一步操作完之后点击配置短信签名相邻的配置短信模板–添加短信模板,等待审核!审核通过后就可以用短信模板和模板ID了。我的模板ID是SMS_11350208,短信模板是验证码code,您正在注册成为
{product}用户,感谢您的支持!
4.在应用管理–应用列表–添加应用。然后拿到你的APP证书的KEY和SECRET。我的APP Key:23401777,APP Secret:413bccbc7a9964b957c2e04940cc2369
5.最后一步就是要下载调用API的jar了。请点击:http ://download.csdn.net/detail/qq_27949963/9570014
准备工作已经做完了,现在我们就要开始写代码调用短信验证了。我以注册用户为例吧。
public class AlibabaSmsNumSendUtil {
public static final Logger LOG = Logger.getLogger(AlibabaSmsNumSendUtil.class);
public static String APPKEY = "23401777";
public static String SECRET = "413bccbc7a9964b957c2e04940cc2369";
public static String RESUCCESS = "alibaba_aliqin_fc_sms_num_send_response";
public static String EXTEND = "123456";
public static String SMSTYPE = "normal";
public static String URL = "http://gw.api.taobao.com/router/rest";
public static Boolean SmsNumSend(String code,String mobile){
TaobaoClient client = new DefaultTaobaoClient(URL, APPKEY, SECRET);
AlibabaAliqinFcSmsNumSendRequest req = new AlibabaAliqinFcSmsNumSendRequest();
req.setExtend(EXTEND);
req.setSmsType(SMSTYPE);
req.setSmsFreeSignName("注册认证");
req.setSmsTemplateCode("SMS_11350208");
req.setSmsParamString("{\"code\":\""+code+"\",\"product\":\"用户注册"\"}");
req.setRecNum(mobile);
AlibabaAliqinFcSmsNumSendResponse rsp;
try {
rsp = client.execute(req);
LOG.info("短信发送返回消息参数"+rsp.getBody());
if(rsp.getBody().toString().contains("alibaba_aliqin_fc_sms_num_send_response")){
JSONObject ob= new JSONObject(rsp.getBody().toString());
JSONObject obj=ob.getJSONObject(RESUCCESS);
JSONObject object=obj.getJSONObject("result");
Boolean success=object.getBoolean("success");
if(success){
LOG.info("短信返回成功"+code);
return true;
}else{
LOG.info("短信返回失败");
return false;
}
}else{
LOG.info("短信发送失败");
return false;
}
} catch (ApiException e) {
LOG.error(e.getMessage(), e);
}
return false;
}
}
利用上面的代码然后在调用时传入需要发送的随机验证码和发送的手机号,网站和APP就可以实现短信的验证了,我的注册用户短信为:【注册验证】验证码387336,您正在注册成为搬山用户,感谢您的支持!
验证:
多用于验证码
手机验证码、图片验证码
四位随机字符
package com.bantianshi.common.util;
import java.util.concurrent.ThreadLocalRandom;
/**
* Created by Administrator on 2020/3/3 0003.
* 随机验证码生成方法
*/
public class WordUtil {
private static final String BASE_NUMBER = "0123456789";
private static final String BASE_CHAR = "abcdefghijklmnopqrstuvwxyz";
private static final String BASE_CHAR_NUMBER = "abcdefghijklmnopqrstuvwxyz0123456789";
/**
* 随机生成四位字符
* (1) =1是 BASE_NUMBER (1)
* (2) <1是 BASE_CHAR (0)
* (3) >1是 BASE_CHAR_NUMBER (2)
*
* @return
*/
public static String randomNumberChars() {
return randomNumberChars(1, 4);
}
public static String randomNumberChars(int type) {
return randomNumberChars(type, 4);
}
public static String randomNumberChars(int type, int length) {
String baseString = BASE_NUMBER;
if (type < 1) {
baseString = BASE_CHAR;
} else if (type > 1) {
baseString = BASE_CHAR_NUMBER;
}
return randomString(baseString, length);
}
public static String randomString(String baseString, int length) {
StringBuilder sb = new StringBuilder();
if (length < 1) {
length = 1;
}
int baseLength = baseString.length();
for (int i = 0; i < length; ++i) {
int number = getRandom().nextInt(baseLength);
sb.append(baseString.charAt(number));
}
return sb.toString();
}
public static ThreadLocalRandom getRandom() {
return ThreadLocalRandom.current();
}
}