javax.mail 遇到501 mail from address must be same as authorization user 的問題
使用不同的兩個帳戶发送email时,第一个账户可以发送成功,但到第二个账户的时候就报出了501 mail from address must be same as authorization user的错误。
具体代码如下:
import java.util.Date;
import java.util.List;
import java.util.Properties;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MailSend {
private String host = "smtp.qq.com";
/**
* 发送邮件
* @param receiver 接收人
* @param title 标题
* @param content 内容
* @throws Exception
*/
public void send(String receiver,String title,String content,String sendUser,String sendUserId,String sendPassword) throws Exception{
try
{
Properties props = new Properties(); // 获取系统环境
Authenticator auth = new MailAutherticator(sendUserId,sendPassword); // 进行邮件服务器用户认证
props.put("mail.smtp.host", host);
props.put("mail.smtp.auth", "true");
Session session = Session.getDefaultInstance(props, auth);
MimeMessage message = new MimeMessage(session);// 设置session,和邮件服务器进行通讯。
message.setSubject(title); // 设置邮件主题
message.setText(content); // 设置邮件正文
message.setSentDate(new Date()); // 设置邮件发送日期
Address address = new InternetAddress(sendUser);
message.setFrom(address); // 设置邮件发送者的地址
message.reply(false);
//处理多用户发送
Address[] multipleAddress = null;
String[] receivers = receiver.split(",");
if(receivers.length>0){
multipleAddress = new Address[receivers.length];
for(int i=0;i<receivers.length;i++){
String tmpReceiver = receivers[i].trim();
Address toAddress = new InternetAddress(tmpReceiver);
multipleAddress[i] = address;
}
}
message.addRecipients(Message.RecipientType.TO, multipleAddress); //收件人
Transport.send(message); // 发送邮件
} catch (Exception ex){
ex.printStackTrace();
throw new Exception(ex.getMessage());
}
}
/**
* 测试邮件
* @param args
*/
public static void main(String[] args) {
MailSend sendMail = new MailSend();
try {
String receiver = "XXXXXX@qq.com" ;//多封邮件请用逗号隔开
String title = "主题-测试邮件";
String content = "邮件内容-测试邮件";
String sendUser = "XXXXXX@qq.com";
String sendPassword = "XXXXXX";
String SendUserId = "XXXXXX";
sendMail.send(receiver,title,content,sendUser,SendUserId,sendPassword);//发送邮件
System.out.println("发送成功!");
sendUser = "XXXXXXXX@qq.com";
sendPassword = "XXXXXXX";
SendUserId = "XXXXXXXX";
/*运行到此处时就会报错,但前一个send不执行的话,此处就正常运行*/ sendMail.send(receiver,title,content,sendUser,SendUserId,sendPassword);//发送邮件
System.out.println("发送成功!");
} catch (Exception e) {
e.printStackTrace();
}
}
Session session = Session.getDefaultInstance(props, auth);
以上改成
Session session = Session.getInstance(props, auth);
就可以了
何谓getDefaultInstance?
从处理流程中可以看出,首先是从缓存中查找是否有properties存在
如果存在,则加载默认的properties
如果不存在才加载用户自己定义的properties,
所以当一个应用为每个用户独立创建properties的时候,还是应该调用getInstance,
除非你希望有一个默认的properties让用户使用
问
题找到了,因为它会首先去内存和系统文件中去找properties,所以不管我在页面改几次数据,其实在后台中生成session时都和系统启动时的一
样,所以在MailUtil.sendTextMessage(mailSession,RptTaskMailConfig.Sender,
receiver,null,mail_subject,mail_content,"GB2312",null);时session里的sender和传入的sender不一致,因此出错,修改Session.getDefaultInstance(props, authentic);为Session.getInstance(props, authentic);后,可以正确发送修改帐号,密码等资料后的邮件.OK
最后再补充一下,session.getdefaultinstance和getinstance的区别 :
如果想要同时使用两个帐号发送javamail,比如使用1@a.com发送1#邮件,使用2@a.com发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个username:2@a.com创建的session永远都和第一个一样,这是为什么呢?因为,getDefaultInstance是真正单例模式,而且,里面的username和password属性是final型的,无法更改。所以,你会发现两封email都是由1@a.com发出来的。所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。
javax.mail 遇到501 mail from address must be same as authorization user 的問題的更多相关文章
- javax.mail.MessagingException: 501 Syntax: HELO hostname Linux端异常解决
在项目里面使用javamail在window环境正常,放在服务器上面的时候抛出异常javax.mail.MessagingException: 501 Syntax: HELO hostname ,原 ...
- QQ邮箱发送邮件,出现mail from address must be same as authorization user错误
之前做的一个系统,有个发送邮件的功能,一直能正常使用,今天同事说QQ邮箱发送不了. 立马着手调试,发现服务器一直出现“mail from address must be same as authori ...
- qq邮箱发送,mail from address must be same as authorization user
由于邮箱发送的邮箱账号更换,所以重新测试.结果一直出错,要不就是请求超时,要不就是未授权. 用smtp 开始的时候,端口使用495,结果是请求超时. 后来改成25,结果是未授权. 再后来听人说,有一个 ...
- 参数或变量中有语法错误。 服务器响应为: mail from address must be same as authorization user
企业qq发邮件失败,提示: 参数或变量中有语法错误. 服务器响应为: mail from address must be same as authorization user 解决办法: 登录邮箱,设 ...
- Java发邮件:Java Mail与Apache Mail
作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例 ...
- Drupal 7 电子邮件的发送设置 SMTP, Mail System, Mime Mail
尽管Drupal自带发送email功能,可是非常多server须要SMTP验证.这个时候就须要安装 SMTP 模块. 激活 SMTP 模块 进入配置 admin/config/system/smtp ...
- You have mail in /var/mail/xxx
因为配置 DDNS, 我添加了个 crontab 定时任务,每隔 1 分钟执行一段 python 脚本 然后就发现 terminal 经常提示 'You have mail in /var/mail/ ...
- jenkins配置邮件报错:501 mail from address must be same as authorization user
jenkins配置文件的时候,遇到如下报错: 我的配置是这样的: 最后发现是jenkins url下面的系统管理员邮件地址没写,填写与用户名一致就可以了.
- Android Java Mail与Apache Mail发送邮件对比
原文链接: 一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例如xxx@xx.com 2.收件人姓名:大部分的邮件显示时都会显 ...
随机推荐
- C#socket编程序(三)
private void ReceiveData() { bool keepalive = true; Socket s = clientSocket; Byte[] buffer = new Byt ...
- #JS 异步处理机制的几种方式
Javascript语言的执行环境是"单线程"(single thread,就是指一次只能完成一件任务.如果有多个任务,就必须排队,前面一个任务完成,再执行后面一个任务,以此类推) ...
- ExampleConfigurationSectionHandler
ExampleConfigurationSectionHandler.cs using System; using System.Collections.Generic; using System.C ...
- 配置tomcat报错: Unknown version of Tomcat was specified.
报错原因:路劲没选择对,应选择bin文件夹的上一层目录,也不能选择bin目录
- Bootstrap--响应式图片轮播
<div class="row"> <div class="span12"> <section id="carousel ...
- Django的Form机制小问题
使用Django,我们可以以声明式的方式来定义一个Form,如下: 1 2 3 4 5 # -*- coding: utf-8 -*- from django import forms class S ...
- 机器学习之路: python k近邻分类器 KNeighborsClassifier 鸢尾花分类预测
使用python语言 学习k近邻分类器的api 欢迎来到我的git查看源代码: https://github.com/linyi0604/MachineLearning from sklearn.da ...
- 单链表之一元多项式求和C++实现
单链表之一元多项式求和 一元多项式求和单链表实现伪代码 1.工作指针 pre.p.qre.q 初始化2.while(p 存在且 q 存在)执行下列三种情况之一: 2.1.若 p->exp < ...
- luoguP4336 [SHOI2016]黑暗前的幻想乡 容斥原理 + 矩阵树定理
自然地想到容斥原理 然后套个矩阵树就行了 求行列式的时候只有换行要改变符号啊QAQ 复杂度为\(O(2^n * n^3)\) #include <cstdio> #include < ...
- 【Python3】【树形dp】uva10253 Series-Parallel Networks
设“共n个叶子,且每个非叶节点至少有两个子节点”的树的数量为f[n],再乘2就是本题答案. 设状态d(i,j)表示每棵子树最多包含i个叶子.一共有j个叶子的树的个数.于是f(n)=d(n-1,n).假 ...