zoukankan      html  css  js  c++  java
  • 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对象。

  • 相关阅读:
    codeforces 455B A Lot of Games(博弈,字典树)
    HDU 4825 Xor Sum(二进制的字典树,数组模拟)
    hdu 1800 Flying to the Mars(简单模拟,string,字符串)
    codeforces 425A Sereja and Swaps(模拟,vector,枚举区间)
    codeforces 425B Sereja and Table(状态压缩,也可以数组模拟)
    HDU 4148 Length of S(n)(字符串)
    codeforces 439D Devu and Partitioning of the Array(有深度的模拟)
    浅谈sass
    京东楼层案例思维逻辑分析
    浅谈localStorage和sessionStorage
  • 原文地址:https://www.cnblogs.com/interdrp/p/3442422.html
Copyright © 2011-2022 走看看