• 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对象。

  • 相关阅读:
    JS计算字符串长度(兼容后端PHP)
    使用iview-admin2构建的项目,热更新无法启动
    关于HSTS的总结
    (转)javascript兼容问题总结
    js写一个通讯录
    HTML5+通讯录获取指定多个人的信息
    MUI封装的选择器调用
    心得小细节(一)
    读后感(一) web运作原理探析
    码农和软件开发工程师
  • 原文地址:https://www.cnblogs.com/interdrp/p/3442422.html
Copyright © 2020-2023  润新知