java mail使用中遇到的550类型错误
2015-12-23 14:04
591 查看
前言
首先,需要说明的是,本错误来自于一个简单的基于java mail的api程序,邮件服务器是163的SMTP,即smtp.163.com.
程序
需要说明一下,下面这个程序,是来自于网络上,本人为了测试自己项目MUEAS中重置密码,通过邮件认证实现重置功能,临时用来测试用的,若有异议,请给我留言。我将会自己写一份。
程序中用到了javax的mail.jar。 maven依赖如下:
注意,上面的邮件发送逻辑是没有问题的,若发送时,遇到下面的错误:
则要考虑是不是没有启用应用密码功能。我的测试过程,是通过启用应用密码功能,得以将500的问题解决掉的!
步骤
1. 登录自己的163邮箱,注意,要用你的应用程序中设置的邮箱地址去登录。
2. 在主菜单栏上的“设置”子菜单里面,选择POP3/SMTP/IAMP菜单。
![](https://images2015.cnblogs.com/blog/844237/201512/844237-20151223135558999-677331142.png)
3. 若没有开启“客户端授权密码”,则选择将其开启。开启后,会给你生成一个应用授权密码。要用这个生成的密码作为java mail API发送邮件的认证密码,如此,才能解除500密码,若用邮箱的登录密码去设置这个认证密码,会遇到500的错误。下图是开启“客户端授权密码”功能后的截图:
![](https://images2015.cnblogs.com/blog/844237/201512/844237-20151223140013546-2058964481.png)
这个错误,我折腾了很长时间,百度上找了很久,都找不到,google查看的信息,都是基于gmail的问题(535错误码,其实类似163的这个500的错误),最后,自己研究了下163邮箱上的功能菜单,摸索着修改,最终解决了这个问题!
有需要的,可以参考一下,我在这里,做个memo。
首先,需要说明的是,本错误来自于一个简单的基于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菜单。
![](https://images2015.cnblogs.com/blog/844237/201512/844237-20151223135558999-677331142.png)
3. 若没有开启“客户端授权密码”,则选择将其开启。开启后,会给你生成一个应用授权密码。要用这个生成的密码作为java mail API发送邮件的认证密码,如此,才能解除500密码,若用邮箱的登录密码去设置这个认证密码,会遇到500的错误。下图是开启“客户端授权密码”功能后的截图:
![](https://images2015.cnblogs.com/blog/844237/201512/844237-20151223140013546-2058964481.png)
这个错误,我折腾了很长时间,百度上找了很久,都找不到,google查看的信息,都是基于gmail的问题(535错误码,其实类似163的这个500的错误),最后,自己研究了下163邮箱上的功能菜单,摸索着修改,最终解决了这个问题!
有需要的,可以参考一下,我在这里,做个memo。
相关文章推荐
- 绿色版JDK安装
- java中如何反向输出字符串
- Eclipse中java工程转web工程的方法
- Spring MVC之@RequestBody, @ResponseBody 详解
- @Transactional的属性与使用
- 使用IntelliJ IDEA 14和Maven创建java web项目
- Spring学习(六)—— Spring注解(二)
- Spring 事务在什么情况下,会进行sql回滚
- 深入分析JavaWeb Item32 -- 数据库连接池
- SpringSecurity3.1入门教程(三)
- 环境安装备忘录 JDK
- jsonp java 服务端
- spring+qurtz整合初学
- 针对springmvc做的简单异常处理机制
- java多文件打包下载
- 从Eclipse+ADT迁移到Android Studio
- eclipse+maven+Hibernate创建JavaWeb项目
- RxJava练习(1)--timer代替Handler
- 图的理解:深度优先和广度优先遍历及其 Java 实现
- java中定时执行任务