【JavaMail开发总结】注意事项

通过前面的几篇文章讲了怎样用JavaMail实现发送邮件的功能,今天做点总结需要注意的一些地方

首先是发送邮件时,发件人的信箱,要使用对应的邮件的电子信箱服务器,比如前面的文章中的代码

Properties props = new Properties();
props.put("mail.smtp.host", "smtp.qq.com");

这段代码中,是使用qq邮箱时发送电子邮件的方法,因为使用的host为:smtp.qq.com,如源代码中:props.put("mail.smtp.host", "smtp.qq.com");如果使用其它的电子邮件发送,就必须在其邮件服务器上查找相应的电子邮件服务器,例如搜狐就要使用smtp.sohu.com,具体情况具体对待,都可以从所使用的邮件服务器上获得的如果没有使用host ,也就是说,没有进行props.put("mail.smtp.host", host);设置,那么就会抛异常,如果邮件服务器配置正确,还抛异常或报错,那可能就是代码有错或者没有找到对应的发件人邮箱,也就是没有注册。同时要注意即使邮箱服务器正确了,也要查看自己邮箱的smtp服务是否开启了,没开启的情况下也是同样会报出邮箱认证失败这一错误

Authenticator authenticator = new Email_Authenticator(properties.get(
    "username").toString(), properties.get("password").toString());
javax.mail.Session sendMailSession = javax.mail.Session
    .getDefaultInstance(properties, authenticator);

这里需要注意的地方,就是当你使用.getDefaultInstance时,你需要设置props.put("mail.smtp.auth", "true");为true,默认是false,如果没设置这一步将报错,这段代码还有要特别注意的地方,我之前就遇到一次,本地可以正常发送邮件,服务器的就不能,一开始还以为是邮件服务器或者发件人邮箱写错了,检查发现没问题之后,重新启动了项目,结果又没报错,但是另一个项目的发送邮件功能报错。。。(两边代码一样),只能着手调试代码,调试过程中,到邮件验证的时候 Session.getDefaultInstance(props, authentic);这一步出异常

javax.mail.Session sendMailSession = javax.mail.Session
    .getDefaultInstance(properties, authenticator);

查了一些资料后才发现,session提供了两个方法来获得了Session对象。

①getDefaultInstance(): 有两种方法使用getDefaultInstance()方法来获取会话对象。它返回默认的会话。

public static Session getDefaultInstance(Properties props);
public static Session getDefaultInstance(Properties props,Authenticator auth);

②getInstance(): 有两种方法使用getInstance()方法来获取会话对象。它返回新的会话。

public static Session getInstance(Properties props);
public static Session getInstance(Properties props,Authenticator auth);

从处理流程中可以看出,首先是从缓存中查找是否有properties存在,如果存在,则加载默认的properties,如果不存在才加载用户自己定义的properties,所以当一个应用为每个用户独立创建properties的时候,还是应该调用getInstance,除非有一个默认的properties让用户使用,所以使用getDefaultInstance()时,会首先去内存和系统文件中去找properties,所以不管我在服务器中重新启动项目几次,都不可能出现2个项目的邮件发送功能正常使用的情况,因为都是按照第一次的来,在后台中生成session时都和系统启动时的一样,所以2个项目总会出现一个发送成功一个发送失败。要想都正常发送邮件,你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个项目创建的session永远都和第一个一样。至于是用getDefaultInstance()还是getInstance(),怎么取舍看实际项目而定。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值