热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

javamail使用中遇到的500类型错误

javax.mail.AuthenticationFailedException:550Userhasno

前言

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

程序

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

  1 package com.shihuc.demo;
  2 
  3 import java.util.*;
  4 import java.io.*;
  5 import javax.mail.*;
  6 import javax.mail.internet.*;
  7 import javax.activation.*;
  8 
  9 public class SendEmail
 10 {
 11     //收件人邮箱地址
 12     private String to; 
 13     //发件人邮箱地址
 14     private String from; 
 15     //SMTP服务器地址
 16     private String smtpServer; 
 17     //登录SMTP服务器的用户名
 18     private String username ;
 19     //登录SMTP服务器的密码
 20     private String password ;
 21     //邮件主题
 22     private String subject; 
 23     //邮件正文
 24     private String content; 
 25     //记录所有附件文件的集合
 26     List attachments = new ArrayList();
 27     //无参数的构造器
 28     public SendEmail()
 29     {
 30     }
 31     
 32     public SendEmail(String to , String from , String smtpServer 
 33         , String username , String password 
 34         , String subject , String content)
 35     { 
 36         this.to = to;
 37         this.from = from;
 38         this.smtpServer = smtpServer;
 39         this.username = username;
 40         this.password = password;
 41         this.subject = subject;
 42         this.cOntent= content;
 43     }
 44     //to属性的setter方法
 45     public void setTo(String to)
 46     {
 47         this.to = to;
 48     }
 49     //from属性的setter方法
 50     public void setFrom(String from)
 51     {
 52         this.from = from;
 53     }
 54     //smtpServer属性的setter方法
 55     public void setSmtpServer(String smtpServer)
 56     {
 57         this.smtpServer = smtpServer;
 58     }
 59     //username属性的setter方法
 60     public void setUsername(String username)
 61     {
 62         this.username = username;
 63     }
 64     //password属性的setter方法
 65     public void setPassword(String password)
 66     {
 67         this.password = password;
 68     }
 69     //subject属性的setter方法
 70     public void setSubject(String subject)
 71     {
 72         this.subject = subject;
 73     }
 74     //content属性的setter方法
 75     public void setContent(String content)
 76     {
 77         this.cOntent= content;
 78     }
 79     //把邮件主题转换为中文
 80     public String transferChinese(String strText)
 81     {
 82         try
 83         {
 84             strText = MimeUtility.encodeText(new String(strText.getBytes()  , "GB2312"), "GB2312", "B");
 85         }
 86         catch(Exception e)
 87         {
 88             e.printStackTrace();
 89         }
 90         return strText;
 91     }
 92     //增加附件,将附件文件名添加的List集合中
 93     public void attachfile(String fname)
 94     {
 95         attachments.add(fname);
 96     }
 97     //发送邮件
 98     public boolean send()
 99     {
100         //创建邮件Session所需的Properties对象
101         Properties props = new Properties();
102         props.put("mail.smtp.host" , smtpServer);
103         props.put("mail.smtp.auth" , "true");
104         props.put("mail.smtp.debug" , "true");
105         //创建Session对象
106         Session session = Session.getDefaultInstance(props
107             //以匿名内部类的形式创建登录服务器的认证对象
108             , new Authenticator()
109             {
110                 public PasswordAuthentication getPasswordAuthentication()
111                 {
112                     return new PasswordAuthentication(username, password); 
113                 }
114             });
115         try
116         {
117             //构造MimeMessage并设置相关属性值
118             MimeMessage msg = new MimeMessage(session);
119             //设置发件人
120             msg.setFrom(new InternetAddress(from));
121             //设置收件人
122             InternetAddress[] addresses = {new InternetAddress(to)};
123             msg.setRecipients(Message.RecipientType.TO , addresses);
124             //设置邮件主题
125             subject = transferChinese(subject);
126             msg.setSubject(subject);    
127             //构造Multipart
128             Multipart mp = new MimeMultipart();
129             //向Multipart添加正文
130             MimeBodyPart mbpCOntent= new MimeBodyPart();
131             mbpContent.setText(content);
132             //将BodyPart添加到MultiPart中
133             mp.addBodyPart(mbpContent);
134             //向Multipart添加附件
135             //遍历附件列表,将所有文件添加到邮件消息里
136             for(String efile : attachments)
137             {
138                 MimeBodyPart mbpFile = new MimeBodyPart();
139                 //以文件名创建FileDataSource对象
140                 FileDataSource fds = new FileDataSource(efile);
141                 //处理附件
142                 mbpFile.setDataHandler(new DataHandler(fds));
143                 mbpFile.setFileName(fds.getName());
144                 //将BodyPart添加到MultiPart中
145                 mp.addBodyPart(mbpFile);
146             }
147             //清空附件列表
148             attachments.clear();
149             //向Multipart添加MimeMessage
150             msg.setContent(mp);
151             //设置发送日期
152             msg.setSentDate(new Date());
153             //发送邮件
154             Transport.send(msg);
155         }
156         catch (MessagingException mex)
157         {
158             mex.printStackTrace();
159             return false;
160         }
161         return true;
162     }
163     public static void main(String[] args)
164     {
165         SendEmail sendMail = new SendEmail();
166         sendMail.setSmtpServer("smtp.163.com");
167         //此处设置登录的用户名
168         sendMail.setUsername("你自己合法的163邮箱");
169         //此处设置登录的密码,这个密码非常重要,它不是邮箱账户的登录密码,而是应用密码,需要登录邮箱,在设置中开启此应用
170         //否则很可能出现如下错误:
171         //javax.mail.AuthenticationFailedException: 550 User has no permission
172         sendMail.setPassword("你自己的应用密码");
173         //设置收件人的地址
174         sendMail.setTo("你希望将邮件发给的对方的邮件地址");
175         //设置发送人地址
176         sendMail.setFrom("你自己的合法的163邮箱");
177         //设置标题
178         sendMail.setSubject("测试邮件标题!");
179         //设置内容
180         sendMail.setContent("你好这是一个带多附件的测试邮件!"); 
181         //粘贴附件
182         sendMail.attachfile("/opt/attachment.jpg");
183         if (sendMail.send())
184         {
185             System.out.println("---邮件发送成功---");
186         }
187     }
188 }

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

1     
2         javax.mail
3         mail
4         1.4.4
5      

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

 1 javax.mail.AuthenticationFailedException: 550 User has no permission
 2 
 3     at com.sun.mail.smtp.SMTPTransport$Authenticator.authenticate(SMTPTransport.java:809)
 4     at com.sun.mail.smtp.SMTPTransport.authenticate(SMTPTransport.java:752)
 5     at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:669)
 6     at javax.mail.Service.connect(Service.java:317)
 7     at javax.mail.Service.connect(Service.java:176)
 8     at javax.mail.Service.connect(Service.java:125)
 9     at javax.mail.Transport.send0(Transport.java:194)
10     at javax.mail.Transport.send(Transport.java:124)
11     at com.shihuc.demo.SendEmail.send(SendEmail.java:154)
12     at com.shihuc.demo.SendEmail.main(SendEmail.java:181)
13     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
14     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
15     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
16     at java.lang.reflect.Method.invoke(Method.java:606)
17     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。

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


推荐阅读
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • 本文介绍了OC学习笔记中的@property和@synthesize,包括属性的定义和合成的使用方法。通过示例代码详细讲解了@property和@synthesize的作用和用法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 高质量SQL书写的30条建议
    本文提供了30条关于优化SQL的建议,包括避免使用select *,使用具体字段,以及使用limit 1等。这些建议是基于实际开发经验总结出来的,旨在帮助读者优化SQL查询。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • 本文介绍了指针的概念以及在函数调用时使用指针作为参数的情况。指针存放的是变量的地址,通过指针可以修改指针所指的变量的值。然而,如果想要修改指针的指向,就需要使用指针的引用。文章还通过一个简单的示例代码解释了指针的引用的使用方法,并思考了在修改指针的指向后,取指针的输出结果。 ... [详细]
author-avatar
哈喽随风amy
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有