阿里云验证码InvalidUserStatus.Malformed : The specified user status is wrongly formed.

在项目中使用阿里云服务发送邮箱验证码时遇到InvalidUserStatus.Malformed错误,该错误通常由于用户状态信息格式不正确引起。检查包括用户输入、配置文件中的Access Key ID、Access Key Secret、发送邮件地址、邮件主题和正文等关键信息。本文将分享如何排查和解决这个问题,特别指出域名变更未更新邮件发送地址可能导致此类错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  最近做项目修改邮箱的部分,修改邮箱之前需要先给原邮箱发送验证码,验证成功后才能更改新的邮箱。

项目中给邮箱或者手机发验证码时用的是阿里云的服务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没有更新而导致的错误。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Algorithm_goddness

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值