javax.mail.AuthenticationFailedException 发送邮件错误
EmailUtils 类
package com.iujz.common;
import java.util.Date;
import java.util.Properties;
import javax.mail.Message.RecipientType;
import javax.mail.Authenticator;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import com.iujz.pojo.user.User;
public class EmailUtils {
private static final String FROM="txl_voidboo@163.com";
public static void sendAccountActivateEmail(User user){
Session session = getSession();
MimeMessage message = new MimeMessage(session);
try {
message.setSubject("这是一封激活账号的邮件!");
message.setSentDate(new Date());
//setFrom表示哪个邮箱发送邮件
message.setFrom(new InternetAddress(FROM));
/**
* RecipientType.TO||BCC||CC
* TO表示主要接收人
* BCC表示秘密抄送人
* CC表示抄送人
* InternetAddress 接收者的邮箱地址
*/
message.setRecipient(RecipientType.TO, new InternetAddress(user.getEmail()));
message.setContent("<a target='_BLANK' href='http://www.baidu.com'>"
+user.getUserName()+"先生/女士您好,请点击此链接激活账号"
+GenerateLinkUtils.generateActivateLink(user)
+"</a>","text/html;charset=utf-8");
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
}
}
public static Session getSession(){
Properties props=new Properties();
props.setProperty("mail.transport.protocol", "smtp");//指定发送的邮箱的邮箱协议
props.setProperty("mail.smtp.host", "smtp.163.com");//指定SMTP服务器
props.setProperty("mail.smtp.port", "25");//smtp是发信邮件服务器,端口是25
props.setProperty("mail.smtp.auth", "true");//指定是否需要SMTP验证
Session session=Session.getInstance(props, new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication(){
return new PasswordAuthentication(FROM, "此处为客户端授权密码");
}
});
return session;
}
}
package com.iujz.common;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//GenerateLinkUtils类
import com.iujz.pojo.user.User;
public class GenerateLinkUtils {
private static final String CHECK_CODE="checkCode";
public static String generateActivateLink(User user){
return "http://localhost:8081/email_activate?id="+user.getId()+"&"+CHECK_CODE+"="+generateCheckcode(user);
}
/**
* 生成校验码,用户名+UUID唯一标识符,为安全把他们加密发送
* @param user
* @return
*/
private static String generateCheckcode(User user) {
String userName=user.getUserName();
String randomCode=user.getCodeUrl();
return md5(userName+":"+randomCode);
}
private static String md5(String string){
MessageDigest md=null;
try {
md=MessageDigest.getInstance("md5");//返回实现指定摘要算法的 MessageDigest 对象。
md.update(string.getBytes());//使用指定的 byte 数组更新摘要。
byte[] md5Bytes=md.digest();//通过执行诸如填充之类的最终操作完成哈希计算。在调用此方法之后,摘要被重置。
return bytes2Hex(md5Bytes);//本信息摘要
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
System.out.println("md5这里出错了");
}
return null;
}
//二进制转字符串
private static String bytes2Hex(byte[] byteArray){
StringBuffer strBuf=new StringBuffer();
for(int i=0;i<byteArray.length; i++){
if(byteArray[i] >= 0 && byteArray[i] < 16){
strBuf.append("0");
}
strBuf.append(Integer.toHexString(byteArray[i]&0xFF));
}
return strBuf.toString();
}
/**
* 补充:
* 为了显示一个byte型的单字节十六进制(两位十六进制表示)的编码,请使用:
* Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).substring(6);
* byteVar & 0x000000FF的作用是,如果byteVar 是负数,则会清除前面24个零,正的byte整型不受影响。
* (...) | 0xFFFFFF00的作用是,如果byteVar 是正数,则置前24位为一,
* 这样toHexString输出一个小于等于15的byte整型的十六进制时,倒数第二位为零且不会被丢弃,
* 这样可以通过substring方法进行截取最后两位即可。
*/
}
发送
public void editUser(){
String flag = "failed";
if (user != null &&user.getUserName()!=null && user.getEmail() != null
&& user.getPassword() != null) {
User user2 = this.getUserService().getUser(user);//email不能重复
if (user2 != null) {
flag = "repeat";
} else {
user.setCreateTime(new Date());
user.setPassword(MD5.MD5Encode(user.getPassword()));
user.setActivated(false);//刚注册默认是没有激活状态
user.setCodeUrl(UUID.randomUUID().toString());
user.setJobStatus(0);
//注册用户
if(this.getUserService().findUserByEmail(user.getEmail())==null){
try {
this.getUserService().addUser(user);
} catch (Exception e) {
e.printStackTrace();
}
}else {
flag = "repeat";
throw new RuntimeException("该邮箱已经被注册!");
}
//查看是否注册成功,
User findUser = userService.findUserByEmail(user.getEmail());
if(findUser != null) {
//注册成功后,发送账户激活链接
EmailUtils.sendAccountActivateEmail(user);
flag="regist_success";
} else {
throw new RuntimeException("注册用户失败");
}
}
}
this.getOut().write(flag);
}
public String user(){
if(currentUser!=null){
Account _account=new Account();
_account.setUserId(this.getCurrentUser().getId());
account=accountService.getAccount(_account);
return SUCCESS;
}else {
return LOGIN;
}
}