首先是发送邮件时,发件人的信箱,要使用对应的邮件的电子信箱服务器,比如前面的文章中的代码
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(),怎么取舍看实际项目而定。