JavaMail是Java提供的发邮件API
Commons Email是Apache Commons下的发邮件API
Spring Mail 是Spring提供的发邮件API
JavaMail
<dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.5.5</version> </dependency>
Commons Email
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.4</version>
</dependency>
Spring Mail
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.4.RELEASE</version> </dependency>
Spring配置文件如下
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd"> <!-- 加载mail.properties配置文件 --> <context:property-placeholder location="classpath:mail.properties" file-encoding="utf-8" ignore-unresolvable="true"/> <!-- mailSender配置 --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="${mail.smtp.host}" /> <property name="username" value="${mail.smtp.username}" /> <property name="password" value="${mail.smtp.password}" /> <property name="javaMailProperties"> <props> <prop key="mail.smtp.auth">${mail.smtp.auth}</prop> <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop> </props> </property> </bean> </beans>
mail.properties配置文件如下
#------------------------------------------------------------ # 邮件服务的配置 #------------------------------------------------------------ #服务器 mail.smtp.host=smtp.xxx.com #是否需要验证密码 mail.smtp.auth=true #超时时间 mail.smtp.timeout=50000 #------------------------------------------------------------ # 对用户名和密码都进行了加密 #------------------------------------------------------------ #登陆用户名 mail.smtp.username=qBFXEAFr500QuCYz1D9/nw== #密码 mail.smtp.password=oqfyI44bbowwVRY0dSKX6yuDKF3s6J9K #发件人 mail.smtp.from=abcd@xxx.com #收件人 mail.smtp.to=ghi@xxx.com,jkl@xxx.com #抄送 #[email protected],[email protected]
package com.test.mail; public interface MailSender { public void sendMail(); }
实现类
package com.test.mail.impl; import javax.mail.internet.MimeMessage; import org.apache.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Component; import com.test.mail.MailSender; import com.test.util.PropertiesUtil; /** * 采用Spring的JavaMailSender发邮件 * * @author gaowei.cheng 2015年12月23日 */ @Component public class SpringMail implements MailSender { private static Logger log = Logger.getLogger(SpringMail.class); //注入一个mailSender @Autowired JavaMailSenderImpl mailSender; public void sendMail() { //读取配置文件中的收件人 PropertiesUtil.readProperties("mail.properties"); String[] to = PropertiesUtil.getProperty("mail.smtp.to").split(",");// 收件人 String[] cc = PropertiesUtil.getProperty("mail.smtp.cc").split(",");// 收件人 MimeMessage mailMessage = mailSender.createMimeMessage(); log.info("发送邮件给" + PropertiesUtil.getProperty("mail.smtp.to")); try { MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true, "utf-8"); helper.setFrom(propUtil.getProperty("mail.smtp.from"));// 设置发件人 helper.setTo(to);// 设置收件人 helper.setCc(cc);// 设置抄送 helper.setSubject("SpringMail测试");// 设置主题 helper.setText("这是一封来自SpringMail的测试邮件");// 邮件体 mailSender.send(mailMessage);// 发送邮件 log.info("邮件发送成功..."); } catch (Exception e) { log.error("邮件发送发生异常"); log.error(e.getMessage()); log.info("进行重发"); try { Thread.sleep(1000 * 1000); this.sendMail(); } catch (InterruptedException e1) { log.info("重发邮件发生异常"); log.error(e.getMessage()); e1.printStackTrace(); } } } }
如果是自己公司内部的邮件服务器,这个程序是没有任何问题的。
但当我们使用QQ邮箱尽心登陆,然后发邮箱时会报错,错误信息如下
Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 530 Error: A secure connection is requiered(such as ssl). More information at http://service.mail.qq.com/cgi-bin/help?id=28
这是因为腾讯需要认证,才用平时的QQ邮箱用户名和密码已经不能登陆了。
进入报错时,腾讯给的网址http://service.mail.qq.com/cgi-bin/help?id=28
就会进入客户端设置页面
什么是客户端?
答:在腾讯看来,所有不是通过腾讯页面或者客户端登陆的都属于客户端。
所以现在问题已经很清晰了,在我们用程序发送电子邮件的时候,我们的密码已经不能用了,需要采用腾讯的授权码登陆
如何获取授权码?
答:跟着腾序的帮助中心一步一步来!
授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。 适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
通过以上可以看出,我们的程序登陆,发邮件采用的是SMTP协议,所以就必须采用授权码登陆了。
登陆qq邮箱
1、进入设置
2、进入账户
3、下拉到这里
点击开启
按照操作一步一步开启
开启完成之后就会得到一个授权码
所有程序登陆都次啊用授权码登陆
而且mailSender也要进行相应的修改
<!-- mailSender配置,qq需要SSL --> <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl"> <property name="host" value="${mail.smtp.host}" /> <property name="port" value="${mail.smtp.port}" /> <property name="username" value="${mail.smtp.username}" /> <property name="password" value="${mail.smtp.password}" /> <property name="javaMailProperties"> <props> <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop> <prop key="mail.smtp.auth">${mail.smtp.auth}</prop> <prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop> <prop key="mail.smtp.socketFactory.port">${mail.smtp.port}</prop> <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop> <prop key="mail.smtp.socketFactory.fallback">false</prop> </props> </property> </bean>
其他配置信息如下
#端口号,QQ邮箱需要使用SSL,端口号465或587 mail.smtp.port=465 #STARTTLS是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL) mail.smtp.starttls.enable=true mail.smtp.password=你的授权码
这样就可以登陆QQ邮箱发邮件了!
关于发邮件,改天再详细的写出来。
参考文献
http://wangcheng.iteye.com/blog/603908
http://blog.csdn.net/is_zhoufeng/article/details/12004073