使用不同的兩個帳戶发送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 的問題的更多相关文章

  1. javax.mail.MessagingException: 501 Syntax: HELO hostname Linux端异常解决

    在项目里面使用javamail在window环境正常,放在服务器上面的时候抛出异常javax.mail.MessagingException: 501 Syntax: HELO hostname ,原 ...

  2. QQ邮箱发送邮件,出现mail from address must be same as authorization user错误

    之前做的一个系统,有个发送邮件的功能,一直能正常使用,今天同事说QQ邮箱发送不了. 立马着手调试,发现服务器一直出现“mail from address must be same as authori ...

  3. qq邮箱发送,mail from address must be same as authorization user

    由于邮箱发送的邮箱账号更换,所以重新测试.结果一直出错,要不就是请求超时,要不就是未授权. 用smtp 开始的时候,端口使用495,结果是请求超时. 后来改成25,结果是未授权. 再后来听人说,有一个 ...

  4. 参数或变量中有语法错误。 服务器响应为: mail from address must be same as authorization user

    企业qq发邮件失败,提示: 参数或变量中有语法错误. 服务器响应为: mail from address must be same as authorization user 解决办法: 登录邮箱,设 ...

  5. Java发邮件:Java Mail与Apache Mail

    作者:Vinkn 来自http://www.cnblogs.com/Vinkn/ 一.邮件简介 一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等: 1.收件人:收件人的邮箱地址,例 ...

  6. Drupal 7 电子邮件的发送设置 SMTP, Mail System, Mime Mail

    尽管Drupal自带发送email功能,可是非常多server须要SMTP验证.这个时候就须要安装 SMTP 模块. 激活 SMTP 模块 进入配置 admin/config/system/smtp ...

  7. You have mail in /var/mail/xxx

    因为配置 DDNS, 我添加了个 crontab 定时任务,每隔 1 分钟执行一段 python 脚本 然后就发现 terminal 经常提示 'You have mail in /var/mail/ ...

  8. jenkins配置邮件报错:501 mail from address must be same as authorization user

    jenkins配置文件的时候,遇到如下报错: 我的配置是这样的: 最后发现是jenkins url下面的系统管理员邮件地址没写,填写与用户名一致就可以了.

  9. Android Java Mail与Apache Mail发送邮件对比

    原文链接: 一.邮件简介  一封邮件由很多信息构成,主要的信息如下,其他的暂时不考虑,例如抄送等:  1.收件人:收件人的邮箱地址,例如xxx@xx.com  2.收件人姓名:大部分的邮件显示时都会显 ...

随机推荐

  1. **IOS自动完成(搜索自动提示)功能实现

    UISearchBar搜索AutoComplete下拉列表搜索提示 http://www.codeios.com/thread-10685-1-1.html 介绍:     在搜索框上加入下拉列表.在 ...

  2. C语言:九九乘法表打印

    题目: 要求:用“,”分隔算式,用“:”做一行的结尾. 另外1*1=1:这个算式是程序的第一行,前面没有空行. 文字版如下: 输入格式: 无 输出格式: 1*1=1; 2*1=2,2*2=4; 3*1 ...

  3. javascript大神修炼记(6)——OOP思想(继承)

    读者朋友们大家好,我们今天这一讲就接着前面的封装继续讲解,今天就是在前面内容上面的升级,OOP思想中的继承,我们就先来解释一下继承到底是什么意思,我们在什么地方会用到继续. 继承就是,后代继续祖先的一 ...

  4. LoadRuner常见错误

    LoadRuner常见错误 一.Step download timeout (120 seconds) 这是一个经常会遇到的问题,解决得办法走以下步骤: 1. 修改run time setting中的 ...

  5. 2018 ACM-ICPC, Syrian Collegiate Programming Contest F - Pretests SOS dp

    #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...

  6. react-native第一次开发记录

    1.安装指定版本 react-native init demo --verbose --version 0.41.0 2.更新依赖包 npm install -g npm-check-updates ...

  7. MDP中值函数的求解

    MDP概述   马尔科夫决策过程(Markov Decision Process)是强化学习(reinforcement learning)最基本的模型框架.它对序列化的决策过程做了很多限制.比如状态 ...

  8. eclipse 背景颜色

    步骤阅读 3 本例使用的背景色是喜大普奔的豆沙绿,比较柔和 设置为:色调:85.饱和度:120.亮度:208 即可,据说长时间使用可以缓解眼疲劳哦. (吐槽:开什么玩笑,远离编程才能缓解眼疲劳好吗)

  9. WebApi-JSON序列化循环引用

    Overview 最近被序列化,循环引用的问题,让我浑身酸爽.遇到这种异常是在搭建WebApi的时候,当我返回Linq实例类集合的时候出现的. 下定决心要解决这个问题.循环引用引起的原因是: 比如说: ...

  10. luoguP4715 [英语]Z语言 平衡树+hash

    显然只能有$hash$来做.... 我们需要一个东西来维护$\sum i * seed^{rank[i]}$ 很自然地联想到平衡树 如果以序列下标建立一棵平衡树,那么无法处理 因此,可以以权值为下标建 ...