龙华做网站天无涯网络,邯郸城融网络技术有限公司,优化网站内容的方法,承接网站开发文案使用不同的兩個帳戶发送email时#xff0c;第一个账户可以发送成功#xff0c;但到第二个账户的时候就报出了501 mail from address must be same as authorization user的错误。 具体代码如下#xff1a; import java.util.Date; import java.util.List; import java.util.…使用不同的兩個帳戶发送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.length0){ multipleAddress new Address[receivers.length]; for(int i0;ireceivers.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 XXXXXXqq.com ;//多封邮件请用逗号隔开 String title 主题-测试邮件; String content 邮件内容-测试邮件; String sendUser XXXXXXqq.com; String sendPassword XXXXXX; String SendUserId XXXXXX; sendMail.send(receiver,title,content,sendUser,SendUserId,sendPassword);//发送邮件 System.out.println(发送成功!); sendUser XXXXXXXXqq.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比如使用1a.com发送1#邮件使用2a.com发送2#邮件这时候你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话你会发现第二个username2a.com创建的session永远都和第一个一样这是为什么呢因为getDefaultInstance是真正单例模式而且里面的username和password属性是final型的无法更改。所以你会发现两封email都是由1a.com发出来的。所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。