最近做项目修改邮箱的部分,修改邮箱之前需要先给原邮箱发送验证码,验证成功后才能更改新的邮箱。
项目中给邮箱或者手机发验证码时用的是阿里云的服务AliEmail:
public class AliEmail extends AbstractEmail implements Email {
private static final String ACCESS_KEY_ID;
private static final String ACCESS_KEY_SECRET;
//控制台发信地址
private static final String MAIL_FROM_ADDRESS;
//发信人昵称
private static final String MAIL_NICKNAME;
//控制台创建的标签,用于分类标识邮件
private static final String MAIL_TAG;
//邮件主题
private static final String MAIL_SUBJECT;
//邮件正文
private static final String MAIL_TEXT_BODY;
//发送邮件的地区相关的参数设置
//******************************************************************************
private static final String MAIL_END_POINT_NAME;
private static final String MAIL_REGION_ID;
private static final String MAIL_PRODUCT;
private static final String MAIL_DOMAIN;
//*********************************************************************************
static {
ACCESS_KEY_ID = String.valueOf(prop.getProperty("ali.access.key.id"));
ACCESS_KEY_SECRET = String.valueOf(prop.getProperty("ali.access.key.secret"));
MAIL_FROM_ADDRESS = String.valueOf(prop.getProperty("ali.mail.from.address"));
MAIL_NICKNAME = String.valueOf(prop.getProperty("ali.mail.nickname"));
MAIL_TAG = String.valueOf(prop.getProperty("ali.mail_tag"));
MAIL_SUBJECT = String.valueOf(prop.getProperty("ali.mail.subject"));
MAIL_TEXT_BODY = String.valueOf(prop.getProperty("ali.mail.text.body"));
//the following areas are parameter about DirectMail
//*****************************************************************************************
MAIL_END_POINT_NAME = String.valueOf(prop.getProperty("ali.mail.end.point.name"));
MAIL_REGION_ID = String.valueOf(prop.getProperty("ali.mail.region.id"));
MAIL_PRODUCT = String.valueOf(prop.getProperty("ali.mail.product"));
MAIL_DOMAIN = String.valueOf(prop.getProperty("ali.mail.domain"));
//*****************************************************************************************
}
public boolean sendEmail(String AccessToken, String Email) {
final Logger LOGGER = Logger.getLogger(AliEmail.class);
IClientProfile profile = DefaultProfile.getProfile(MAIL_REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
// 如果是除杭州region外的其它region(如新加坡region), 需要做如下处理
try {
// 如果是除杭州region外的其它region(如新加坡、澳洲Region),需要将下面的"cn-hangzhou"替换为"ap-southeast-1"、或"ap-southeast-2"。
//如:DefaultProfile.addEndpoint("dm.ap-southeast-1.aliyuncs.com", "ap-southeast-1", "Dm", "dm.ap-southeast-1.aliyuncs.com");
DefaultProfile.addEndpoint(MAIL_END_POINT_NAME, MAIL_REGION_ID, MAIL_PRODUCT, MAIL_DOMAIN);
IAcsClient client = new DefaultAcsClient(profile);
//组装请求对象-具体描述见控制台-文档部分内容
SingleSendMailRequest request = new SingleSendMailRequest();
//request.setVersion("2017-06-22");// 如果是除杭州region外的其它region(如新加坡region),必须指定为2017-06-22
request.setAccountName(MAIL_FROM_ADDRESS);
request.setFromAlias(MAIL_NICKNAME);
request.setAddressType(1);
request.setTagName(MAIL_TAG);
request.setReplyToAddress(true);
request.setToAddress(Email);
request.setSubject(MAIL_SUBJECT);
request.setHtmlBody(MAIL_TEXT_BODY+AccessToken);
SingleSendMailResponse SingleSendMailResponse = client.getAcsResponse(request);
return true;
} catch (ServerException e) {
e.printStackTrace();
LOGGER.error(e);
throw Static.EXP_MAIL_SENDING_FAILURE;
}
catch (ClientException e) {
e.printStackTrace();
LOGGER.error(e);
if(e.getErrCode().equals("InvalidToAddress")) {
throw Static.EXP_ILLEGAL_EMAIL;
}
throw Static.EXP_MAIL_SENDING_FAILURE;
}
}
}
然后前端测试的时候报错,查看tomcat的error.log之后发现错误如下:
2018-07-13 11:11:29,815 ERROR http-apr-10002-exec-9 generic.service.AliEmail - com.aliyuncs.exceptions.ClientException: InvalidUserStatus.Malformed : The specified user status is wrongly formed.
RequestId : 04689455-C223-4831-9392-F3E6D49DC0BD
2018-07-13 11:11:29,815 ERROR http-apr-10002-exec-9 generic.request.AbstractRequest - exception process reuqest [nologin]
第二行的错误是在发送邮件之前在代码里去判断该用户是否已经登录抛出的exception:
try {
final Object value = handle();
if (value != null) LOGGER.info("value=" + value.toString());
Result.success(resp, value);
} catch (GenericException ge) {
// if (user == null) System.out.println(user==null?"nologin":"123");
LOGGER.error("exception process reuqest [" + (user==null?"nologin":user.getUsername()) + "]", ge);
Result.fail(resp, ge);
} catch (Exception e) { // should never go here ..
LOGGER.error("unknown exception: ", e);
Result.fail(resp);
}
解决办法:
1. 检查用户输入是否有误;
2. 检查properties文件写的对不对,即以下这几项:
ali.access.key.id
ali.access.key.secret
ali.mail.from.address
ali.mail.subject
ali.mail.text.body等
我出错的时候就是因为之前我们申请了新的域名,ali.mail.from.address没有更新而导致的错误。