javamail

macongbin88 2009-11-23 11:46:16
Session session = Session.getDefaultInstance(props, new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(account, password);
}});

为什么有时候用Session.getDefaultInstance创建session会出现邮件发不出去的情况,错误信息:
java.lang.SecurityException: Access to default session denied
at javax.mail.Session.getDefaultInstance(Session.java:292)

网上人说用javax.mail.Session.getInstance()方法来创建session对象就好了。
这是什么原因呢?
用javax.mail.Session.getInstance()会有什么潜在的问题吗?
...全文
147 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
macongbin88 2009-11-26
  • 打赏
  • 举报
回复
感谢
ghchen 2009-11-24
  • 打赏
  • 举报
回复
在用Session.getDefaultInstance创建session 如果 Authenticator 参数传入为空时,这个session是同一个虚拟机可共享的,不会出现访问限制的问题,但楼主的代码里传入Authenticator参数 ,这时getDefaultInstance这个方法会比较后续该方法的调用与第一次调用时传入的值,如果是两者相同或者由同一classloader装载就可以得到这个session,否则不允许, 所以楼主调用时每一次都new Authenticator ,如果不是多个调用时不是同一classloader装载的话,就Access to default session denied ,要解决的话,楼主应让多次调用之间共享同一Authenticator

getinstance创建的session不像getDefaultInstance那样可以被共享.它没有这个限制,用getinstance很多时候比
getDefaultInstance 方便些




macongbin88 2009-11-24
  • 打赏
  • 举报
回复
楼上说的我都看过,关键是在账号和密码不变的情况下
为什么用Session.getDefaultInstance创建session会出现邮件发不出去的情况,错误信息:
java.lang.SecurityException: Access to default session denied
at javax.mail.Session.getDefaultInstance(Session.java:292)
,另外用getinstance会不会有什么潜在的问题。
  • 打赏
  • 举报
回复
.getInstance()是线程安全的
realreachard 2009-11-23
  • 打赏
  • 举报
回复
jf
wj84507657 2009-11-23
  • 打赏
  • 举报
回复
拿分
老张-AI 2009-11-23
  • 打赏
  • 举报
回复
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对象。
wifewifewife 2009-11-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 saiche05 的回复:]
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对象。
[/Quote]
说得没错,正确.
majinlong7 2009-11-23
  • 打赏
  • 举报
回复
帮顶
liguominz 2009-11-23
  • 打赏
  • 举报
回复
mark
fztjava 2009-11-23
  • 打赏
  • 举报
回复
jf
saiche05 2009-11-23
  • 打赏
  • 举报
回复
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对象。
saiche05 2009-11-23
  • 打赏
  • 举报
回复
调javax.mail包,直接使用天的Transport.send(message)发送邮件功能.但是却出现了当第一次进入系统时,可以正常发送邮件,但是如果更改邮件用户名,密码等资料后再发送就报异常.初步判断是jsp页面传入资料时出错,进入debug状态进行调试,发现MailUtil.getSession(RptTaskMailConfig.SMTPServer,true,RptTaskMailConfig.Sender,RptTaskMailConfig.EmailPwd)里的值是保存后新改的值.就陷入迷茫中,既然是新的值为什么会报帐号和密码不匹配.继续调试,估计是Session的问题,应该是第一次的session没被清除,但是上网查了资料也没有说java邮件发送后需要特别清除session的,并且程序中每次都会调用MailUtil.getSession,即会产生不同的session,似乎也不存在这个问题.最后发现在session建立时Session.getDefaultInstance(props, authentic);相当可疑.查了一下:

何谓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对象。

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧