Java发邮件-QQ服务器认证
2019獨角獸企業重金招聘Python工程師標準>>>
Java發郵件的幾種方式
- JavaMail
- Commons 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 5Commons Email
<dependency><groupId>org.apache.commons</groupId><artifactId>commons-email</artifactId><version>1.4</version></dependency> 1 2 3 4 5Spring 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 28mail.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這是因為騰訊需要認證,才用平時的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
轉載于:https://my.oschina.net/sky2008/blog/611028
總結
以上是生活随笔為你收集整理的Java发邮件-QQ服务器认证的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样建立一个bower私库
- 下一篇: 3维计算几何模板