您的位置:首页 > 编程语言 > Java开发

java mail使用中遇到的550类型错误

2015-12-23 14:04 591 查看
前言

首先,需要说明的是,本错误来自于一个简单的基于java mail的api程序,邮件服务器是163的SMTP,即smtp.163.com.

程序

需要说明一下,下面这个程序,是来自于网络上,本人为了测试自己项目MUEAS中重置密码,通过邮件认证实现重置功能,临时用来测试用的,若有异议,请给我留言。我将会自己写一份。

package com.shihuc.demo;

import java.util.*;
import java.io.*;
import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;

public class SendEmail
{
//收件人邮箱地址
private String to;
//发件人邮箱地址
private String from;
//SMTP服务器地址
private String smtpServer;
//登录SMTP服务器的用户名
private String username ;
//登录SMTP服务器的密码
private String password ;
//邮件主题
private String subject;
//邮件正文
private String content;
//记录所有附件文件的集合
List<String> attachments = new ArrayList<String>();
//无参数的构造器
public SendEmail()
{
}

public SendEmail(String to , String from , String smtpServer
, String username , String password
, String subject , String content)
{
this.to = to;
this.from = from;
this.smtpServer = smtpServer;
this.username = username;
this.password = password;
this.subject = subject;
this.content = content;
}
//to属性的setter方法
public void setTo(String to)
{
this.to = to;
}
//from属性的setter方法
public void setFrom(String from)
{
this.from = from;
}
//smtpServer属性的setter方法
public void setSmtpServer(String smtpServer)
{
this.smtpServer = smtpServer;
}
//username属性的setter方法
public void setUsername(String username)
{
this.username = username;
}
//password属性的setter方法
public void setPassword(String password)
{
this.password = password;
}
//subject属性的setter方法
public void setSubject(String subject)
{
this.subject = subject;
}
//content属性的setter方法
public void setContent(String content)
{
this.content = content;
}
//把邮件主题转换为中文
public String transferChinese(String strText)
{
try
{
strText = MimeUtility.encodeText(new String(strText.getBytes()  , "GB2312"), "GB2312", "B");
}
catch(Exception e)
{
e.printStackTrace();
}
return strText;
}
//增加附件,将附件文件名添加的List集合中
public void attachfile(String fname)
{
attachments.add(fname);
}
//发送邮件
public boolean send()
{
//创建邮件Session所需的Properties对象
Properties props = new Properties();
props.put("mail.smtp.host" , smtpServer);
props.put("mail.smtp.auth" , "true");
props.put("mail.smtp.debug" , "true");
//创建Session对象
Session session = Session.getDefaultInstance(props
//以匿名内部类的形式创建登录服务器的认证对象
, new Authenticator()
{
public PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(username, password);
}
});
try
{
//构造MimeMessage并设置相关属性值
MimeMessage msg = new MimeMessage(session);
//设置发件人
msg.setFrom(new InternetAddress(from));
//设置收件人
InternetAddress[] addresses = {new InternetAddress(to)};
msg.setRecipients(Message.RecipientType.TO , addresses);
//设置邮件主题
subject = transferChinese(subject);
msg.setSubject(subject);
//构造Multipart
Multipart mp = new MimeMultipart();
//向Multipart添加正文
MimeBodyPart mbpContent = new MimeBodyPart();
mbpContent.setText(content);
//将BodyPart添加到MultiPart中
mp.addBodyPart(mbpContent);
//向Multipart添加附件
//遍历附件列表,将所有文件添加到邮件消息里
for(String efile : attachments)
{
MimeBodyPart mbpFile = new MimeBodyPart();
//以文件名创建FileDataSource对象
FileDataSource fds = new FileDataSource(efile);
//处理附件
mbpFile.setDataHandler(new DataHandler(fds));
mbpFile.setFileName(fds.getName());
//将BodyPart添加到MultiPart中
mp.addBodyPart(mbpFile);
}
//清空附件列表
attachments.clear();
//向Multipart添加MimeMessage
msg.setContent(mp);
//设置发送日期
msg.setSentDate(new Date());
//发送邮件
Transport.send(msg);
}
catch (MessagingException mex)
{
mex.printStackTrace();
return false;
}
return true;
}
public static void main(String[] args)
{
SendEmail sendMail = new SendEmail();
sendMail.setSmtpServer("smtp.163.com");
//此处设置登录的用户名
sendMail.setUsername("你自己合法的163邮箱");
//此处设置登录的密码,这个密码非常重要,它不是邮箱账户的登录密码,而是应用密码,需要登录邮箱,在设置中开启此应用
//否则很可能出现如下错误:
//javax.mail.AuthenticationFailedException: 550 User has no permission
sendMail.setPassword("你自己的应用密码");
//设置收件人的地址
sendMail.setTo("你希望将邮件发给的对方的邮件地址");
//设置发送人地址
sendMail.setFrom("你自己的合法的163邮箱");
//设置标题
sendMail.setSubject("测试邮件标题!");
//设置内容
sendMail.setContent("你好这是一个带多附件的测试邮件!");
//粘贴附件
sendMail.attachfile("/opt/attachment.jpg");
if (sendMail.send())
{
System.out.println("---邮件发送成功---");
}
}
}


程序中用到了javax的mail.jar。 maven依赖如下:

1     <dependency>
2         <groupId>javax.mail</groupId>
3         <artifactId>mail</artifactId>
4         <version>1.4.4</version>
5     </dependency>


注意,上面的邮件发送逻辑是没有问题的,若发送时,遇到下面的错误:

javax.mail.AuthenticationFailedException: 550 User has no permission

at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:809)
at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:752)
at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:669)
at javax.mail.Service.connect(Service.java:317)
at javax.mail.Service.connect(Service.java:176)
at javax.mail.Service.connect(Service.java:125)
at javax.mail.Transport.send0(Transport.java:194)
at javax.mail.Transport.send(Transport.java:124)
at com.shihuc.demo.SendEmail.send(SendEmail.java:154)
at com.shihuc.demo.SendEmail.main(SendEmail.java:181)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)


则要考虑是不是没有启用应用密码功能。我的测试过程,是通过启用应用密码功能,得以将500的问题解决掉的!

步骤

1. 登录自己的163邮箱,注意,要用你的应用程序中设置的邮箱地址去登录。

2. 在主菜单栏上的“设置”子菜单里面,选择POP3/SMTP/IAMP菜单。





3. 若没有开启“客户端授权密码”,则选择将其开启。开启后,会给你生成一个应用授权密码。要用这个生成的密码作为java mail API发送邮件的认证密码,如此,才能解除500密码,若用邮箱的登录密码去设置这个认证密码,会遇到500的错误。下图是开启“客户端授权密码”功能后的截图:



这个错误,我折腾了很长时间,百度上找了很久,都找不到,google查看的信息,都是基于gmail的问题(535错误码,其实类似163的这个500的错误),最后,自己研究了下163邮箱上的功能菜单,摸索着修改,最终解决了这个问题!

有需要的,可以参考一下,我在这里,做个memo。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: