java mail使用中遇到的550类型错误
前言
首先,需要说明的是,本错误来自于一个简单的基于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。
java mail使用中遇到的550类型错误的更多相关文章
- 又一个无效的列类型错误Error setting null for parameter #7 with JdbcType NULL . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLExcept
在更新数据时候出现的错误 更新代码如下: <update id="modify" parameterType="Standard"> update ...
- Android使用Java Mail API发送邮件
最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议.程序出现的问题以一种更符合用户习惯的方式反馈回来.网上也有一些实现好的反馈程序的服务,包括bug的提交. ...
- Jakarta Java Mail属性参数配置
前言 Jakarta Mail网址:https://eclipse-ee4j.github.io/mail SMTP协议可匹配的属性:https://eclipse-ee4j.github.io/ma ...
- java mail
java mail 1.配置 mvn <dependency> <groupId>javax.mail</groupId> <artifactId>ma ...
- Java 中最常见的 5 个错误
在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...
- java mail实现Email的发送,完整代码
java mail实现Email的发送,完整代码 1.对应用程序配置邮件会话 首先, 导入jar <dependencies> <dependency> <groupId ...
- Java邮件服务学习之三:邮箱服务客户端-Java Mail
一.java mail的两个JAR包 1.mail.jar:不在JDK中,核心功能依赖JDK4及以上,该jar包已经加入到java EE5: 下载地址:http://www.oracle.com/te ...
- 关于java mail 发邮件的问题总结(转)
今天项目中有需要用到java mail发送邮件的功能,在网上找到相关代码,代码如下: import java.io.IOException; import java.util.Properties; ...
- 《Java Mail》
<Java Mail> 文/冯皓林 完稿:2016.3.16--2016.3.19 “特定环境.一类问题.N个解决方案” 一.RFC821文档说明 核心: 邮件(Mail): 1.邮件头( ...
随机推荐
- turn.js实现翻书效果
JS插件网 http://www.ijquery.cn/?p=173 描述:Turn.js 是一个轻量级的 (15kb) jQuery/html5 插件用来创建类似书本和杂志翻页效果,支持触摸屏设备. ...
- 设备、像素和点 、 9切片技术 、 颜色和外观 、 NavigationBar的美化
1 TMessage项目的输入面板界面 1.1 问题 IOS中经常会使用到九切片技术对图片进行处理.本案例使用九切片技术完成Tmessage项目的输入板界面,如图-1所示: 图-1 1.2 方案 首先 ...
- LeetCode Rotate Image (模拟)
题意: 将一个n*n的矩阵顺时针旋转90度. 思路: 都是差不多的思路,交换3次也行,反转再交换也是行的. class Solution { public: void rotate(vector< ...
- 在yii中使用分页
yii中使用分页很方便,如下两种方法: 在控制器中: 1. $criteria = new CDbCriteria(); //new cdbcriteria数据库$criteria->id = ...
- linux/lib/string.c
/** * strlen - Find the length of a string * @s: The string to be sized */ size_t strlen(const char ...
- CSS基础知识点(二)——居中
水平居中 (1) 对于块级元素,最常用的自适应水平居中为:margin:0px auto; (与 margin:auto; 效果相同) (2) 对于行内元素(a, img, input等),最常用的水 ...
- C#部分---二维数组、split分割;
二维数组定义方式: int[,] array = new int[3, 4]{ {1,2,3,4}, {3,4,5,6}, {5,6,7,8} }; 3表示,有三个一 ...
- 20145220java程序设计第九周学习总结
20145220java程序设计第九周学习总结 教材学习内容总结 JBDC是用于执行SQL的解决方案,开发人员使用JDBC的标准接口,数据库厂商对接口直接操作,开发人员无须接触底层数据可驱动程序的差异 ...
- Linux驱动设计——字符杂项设备
杂项设备 linux里面的misc杂项设备是主设备号为10的驱动设备,misc设备其实也就是特殊的字符设备,可自动生成设备节点. 定义头文件<linux/miscdevice.h> 杂 ...
- 【转】iOS静态库 【.a 和framework】【超详细】
原文网址:https://my.oschina.net/kaqijiang/blog/649632 一.什么是库? 库是共享程序代码的方式. 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存 ...