Java发邮件-QQ服务器认证
2016-01-28 00:00
531 查看
摘要: Java发邮件-QQ服务器认证(A secure connection is requiered(such as ssl))
Commons Email
Spring Mail
JavaMail是Java提供的发邮件API
Commons Email是Apache Commons下的发邮件API
Spring Mail 是Spring提供的发邮件API
Commons Email
Spring Mail
mail.properties配置文件如下
实现类
如果是自己公司内部的邮件服务器,这个程序是没有任何问题的。
但当我们使用QQ邮箱尽心登陆,然后发邮箱时会报错,错误信息如下
Java发邮件的几种方式
JavaMailCommons Email
Spring Mail
JavaMail是Java提供的发邮件API
Commons Email是Apache Commons下的发邮件API
Spring Mail 是Spring提供的发邮件API
所需jar包
JavaMail<dependency> <groupId>javax.mail</groupId> <artifactId>javax.mail-api</artifactId> <version>1.5.5</version> </dependency> 1 2 3 4 5
Commons Email
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.4</version> </dependency> 1 2 3 4 5
Spring Mail
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.4.RELEASE</version> </dependency> 1 2 3 4 5
以Spring Mail发邮件为例
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> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
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 #抄送 #mail.smtp.cc=abc@xxx.com,def@xxx.com 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
发邮件类
package com.test.mail; public interface MailSender { public void sendMail(); } 1 2 3 4 5
实现类
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(); } } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
如果是自己公司内部的邮件服务器,这个程序是没有任何问题的。
但当我们使用QQ邮箱尽心登陆,然后发邮箱时会报错,错误信息如下
503 Error
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[/code] 这是因为腾讯需要认证,才用平时的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> 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
其他配置信息如下#端口号,QQ邮箱需要使用SSL,端口号465或587 mail.smtp.port=465 #STARTTLS是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL) mail.smtp.starttls.enable=true mail.smtp.password=你的授权码 1 2 3 4 5
这样就可以登陆QQ邮箱发邮件了!
关于发邮件,改天再详细的写出来。
参考文献
http://wangcheng.iteye.com/blog/603908
http://blog.csdn.net/is_zhoufeng/article/details/12004073
相关文章推荐
- Java工具类--读取Properties文件
- SpringMVC 注解说明
- Spring 实现数据库读写分离
- Eclipse集成Liferay
- Liferay在jdk1.8下build-service时出现的问题
- 使用 Intellij Idea 导出JavaDoc
- 拼音拆分算法
- Spring事务配置的五种方式
- Java之注解初探
- Struts2 result type(结果类型)
- Java开发中的23种设计模式详解(转)
- Spring中配置事务的几种方式
- JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件
- JavaWeb学习总结(五十二)——使用JavaMail创建邮件和发送邮件
- java泛型应用
- JavaWeb学习总结(五十一)——邮件的发送与接收原理
- JavaWeb学习总结(五十)——文件上传和下载
- java中的lock
- javaweb学习总结(四十七)——监听器(Listener)在开发中的应用
- javaweb学习总结(四十六)——Filter(过滤器)常见应用