前言

首先,需要说明的是,本错误来自于一个简单的基于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类型错误的更多相关文章

  1. 又一个无效的列类型错误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 ...

  2. Android使用Java Mail API发送邮件

    最近在考虑为已经有的一个应用程序增加一个用户反馈的功能,用户可以通过反馈功能将用户的意见和建议.程序出现的问题以一种更符合用户习惯的方式反馈回来.网上也有一些实现好的反馈程序的服务,包括bug的提交. ...

  3. Jakarta Java Mail属性参数配置

    前言 Jakarta Mail网址:https://eclipse-ee4j.github.io/mail SMTP协议可匹配的属性:https://eclipse-ee4j.github.io/ma ...

  4. java mail

    java mail 1.配置 mvn <dependency> <groupId>javax.mail</groupId> <artifactId>ma ...

  5. Java 中最常见的 5 个错误

    在编程时,开发者经常会遭遇各式各样莫名错误.近日,Sushil Das 在 Geek On Java上列举了 Java 开发中常见的 5 个错误,与君共「免」. 原文链接:Top 5 Common M ...

  6. java mail实现Email的发送,完整代码

    java mail实现Email的发送,完整代码 1.对应用程序配置邮件会话 首先, 导入jar <dependencies> <dependency> <groupId ...

  7. Java邮件服务学习之三:邮箱服务客户端-Java Mail

    一.java mail的两个JAR包 1.mail.jar:不在JDK中,核心功能依赖JDK4及以上,该jar包已经加入到java EE5: 下载地址:http://www.oracle.com/te ...

  8. 关于java mail 发邮件的问题总结(转)

    今天项目中有需要用到java mail发送邮件的功能,在网上找到相关代码,代码如下: import java.io.IOException; import java.util.Properties; ...

  9. 《Java Mail》

    <Java Mail> 文/冯皓林 完稿:2016.3.16--2016.3.19 “特定环境.一类问题.N个解决方案” 一.RFC821文档说明 核心: 邮件(Mail): 1.邮件头( ...

随机推荐

  1. c++学习笔记4:如何写好注释

    1.单行注释一般放在语句的上方: // cout and endl live in the iostream library std::cout << "Hello world! ...

  2. <td colspan="2" > 一个td占两个 td空间

    <tr> <td>机构名称: ${accreditInfo.companyName}</td> <td>初始授信额度: ${accreditInfo.i ...

  3. PAT (Basic Level) Practise:1006. 换个格式输出整数

    [题目链接] 让我们用字母B来表示“百”.字母S表示“十”,用“12...n”来表示个位数字n(<10),换个格式来输出任一个不超过3位的正整数.例如234应该被输出为BBSSS1234,因为它 ...

  4. 二维数组的传输 (host <-> device)

    前言 本文的目的很明确:介绍如何将二维数组传递进显存,以及如何将二维数组从显存传递回主机端. 实现步骤 1. 在显存中为二维数组开辟空间 2. 获取该二维数组在显存中的 pitch 值 (cudaMa ...

  5. 使用jetty-maven-plugin插件进行测试

    为了能够使用maven的jetty插件对项目进行测试,需要进行如下操作: (1)修改maven配置文件 为了能够在命令行中使用jetty命令,需要修改maven的配置文件settings.xml文件, ...

  6. 关于Highcharts图表组件动态修改属性的方法(API)总结之Series

    Highcharts图表组件内的Series很重要,如果说Categries是其大脑,那么Series就是其心脏.这两者才是Highcharts图表组件的重中之重啊.接下来就为大家介绍关于设置Seri ...

  7. 通过开发MSBuild ,引发的注册表相关知识

    最近在做一个小项目,目的就是只需要点一个按钮,就把web程序发布到指定的服务器中.基本步骤就是 编译——>打包->复制包到远程服务器->解压缩.我想重点说一下解压缩,我们可以用win ...

  8. dede模版列表调用文章正文内容的方法

    在制作织梦模板的时候,有的时候我们需要调用文章部分内容,用[field:description/]标签字数不够多(数据库设计字段是varchar(255)的),另外修改了文章内容但是摘要还需要手动修改 ...

  9. SQL编写

    //用户表,用户ID,用户名称create table t_user (user_id int,username varchar(20));//用户帐户表,用户ID,用户余额(单位分)create t ...

  10. sgu548 Dragons and Princesses   贪心+优先队列

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=548 题目意思: 有一个骑士,要经过n个房间,开始在第一个房间,每个房间里面有龙或者 ...