Java发邮件-QQ服务器认证(A secure connection is requiered(such as ssl))

布满荆棘的人生 2022-07-13 15:49 262阅读 0赞
  • JavaMail
  • Commons Email
  • Spring Mail

JavaMail是Java提供的发邮件API

Commons Email是Apache Commons下的发邮件API

spring Mail 是Spring提供的发邮件API

所需jar包

JavaMail

  1. <dependency>
  2. <groupId>javax.mail</groupId>
  3. <artifactId>javax.mail-api</artifactId>
  4. <version>1.5.5</version>
  5. </dependency>
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5

Commons Email

  1. <dependency>
  2. <groupId>org.apache.commons</groupId>
  3. <artifactId>commons-email</artifactId>
  4. <version>1.4</version>
  5. </dependency>
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5

Spring Mail

  1. <dependency>
  2. <groupId>org.springframework</groupId>
  3. <artifactId>spring-context-support</artifactId>
  4. <version>4.2.4.RELEASE</version>
  5. </dependency>
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5

以Spring Mail发邮件为例

Spring配置文件如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3. <!-- 加载mail.properties配置文件 -->
  4. <context:property-placeholder location="classpath:mail.properties" file-encoding="utf-8" ignore-unresolvable="true"/>
  5. <!-- mailSender配置 -->
  6. <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  7. <property name="host" value="${mail.smtp.host}" />
  8. <property name="username" value="${mail.smtp.username}" />
  9. <property name="password" value="${mail.smtp.password}" />
  10. <property name="javaMailProperties">
  11. <props>
  12. <prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
  13. <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
  14. </props>
  15. </property>
  16. </bean>
  17. </beans>
  18. 1
  19. 2
  20. 3
  21. 4
  22. 5
  23. 6
  24. 7
  25. 8
  26. 9
  27. 10
  28. 11
  29. 12
  30. 13
  31. 14
  32. 15
  33. 16
  34. 17
  35. 18
  36. 19
  37. 20
  38. 21
  39. 22
  40. 23
  41. 24
  42. 25
  43. 26
  44. 27
  45. 28
  46. 1
  47. 2
  48. 3
  49. 4
  50. 5
  51. 6
  52. 7
  53. 8
  54. 9
  55. 10
  56. 11
  57. 12
  58. 13
  59. 14
  60. 15
  61. 16
  62. 17
  63. 18
  64. 19
  65. 20
  66. 21
  67. 22
  68. 23
  69. 24
  70. 25
  71. 26
  72. 27
  73. 28

mail.properties配置文件如下

  1. #------------------------------------------------------------
  2. # 邮件服务的配置
  3. #------------------------------------------------------------
  4. #服务器
  5. mail.smtp.host=smtp.xxx.com
  6. #是否需要验证密码
  7. mail.smtp.auth=true
  8. #超时时间
  9. mail.smtp.timeout=50000
  10. #------------------------------------------------------------
  11. # 对用户名和密码都进行了加密
  12. #------------------------------------------------------------
  13. #登陆用户名
  14. mail.smtp.username=qBFXEAFr500QuCYz1D9/nw==
  15. #密码
  16. mail.smtp.password=oqfyI44bbowwVRY0dSKX6yuDKF3s6J9K
  17. #发件人
  18. mail.smtp.from=abcd@xxx.com
  19. #收件人
  20. mail.smtp.to=ghi@xxx.com,jkl@xxx.com
  21. #抄送
  22. #mail.smtp.cc=abc@xxx.com,def@xxx.com
  23. 1
  24. 2
  25. 3
  26. 4
  27. 5
  28. 6
  29. 7
  30. 8
  31. 9
  32. 10
  33. 11
  34. 12
  35. 13
  36. 14
  37. 15
  38. 16
  39. 17
  40. 18
  41. 19
  42. 20
  43. 21
  44. 22
  45. 1
  46. 2
  47. 3
  48. 4
  49. 5
  50. 6
  51. 7
  52. 8
  53. 9
  54. 10
  55. 11
  56. 12
  57. 13
  58. 14
  59. 15
  60. 16
  61. 17
  62. 18
  63. 19
  64. 20
  65. 21
  66. 22

发邮件类

  1. package com.test.mail;
  2. public interface MailSender {
  3. public void sendMail();
  4. }
  5. 1
  6. 2
  7. 3
  8. 4
  9. 5
  10. 1
  11. 2
  12. 3
  13. 4
  14. 5

实现类

  1. package com.test.mail.impl;
  2. import javax.mail.internet.MimeMessage;
  3. import org.apache.log4j.Logger;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.mail.javamail.JavaMailSenderImpl;
  6. import org.springframework.mail.javamail.MimeMessageHelper;
  7. import org.springframework.stereotype.Component;
  8. import com.test.mail.MailSender;
  9. import com.test.util.PropertiesUtil;
  10. /** * 采用Spring的JavaMailSender发邮件 * * @author gaowei.cheng 2015年12月23日 */
  11. @Component
  12. public class SpringMail implements MailSender {
  13. private static Logger log = Logger.getLogger(SpringMail.class);
  14. //注入一个mailSender
  15. @Autowired
  16. JavaMailSenderImpl mailSender;
  17. public void sendMail() {
  18. //读取配置文件中的收件人
  19. PropertiesUtil.readProperties("mail.properties");
  20. String[] to = PropertiesUtil.getProperty("mail.smtp.to").split(",");// 收件人
  21. String[] cc = PropertiesUtil.getProperty("mail.smtp.cc").split(",");// 收件人
  22. MimeMessage mailMessage = mailSender.createMimeMessage();
  23. log.info("发送邮件给" + PropertiesUtil.getProperty("mail.smtp.to"));
  24. try {
  25. MimeMessageHelper helper = new MimeMessageHelper(mailMessage, true, "utf-8");
  26. helper.setFrom(propUtil.getProperty("mail.smtp.from"));// 设置发件人
  27. helper.setTo(to);// 设置收件人
  28. helper.setCc(cc);// 设置抄送
  29. helper.setSubject("SpringMail测试");// 设置主题
  30. helper.setText("这是一封来自SpringMail的测试邮件");// 邮件体
  31. mailSender.send(mailMessage);// 发送邮件
  32. log.info("邮件发送成功...");
  33. } catch (Exception e) {
  34. log.error("邮件发送发生异常");
  35. log.error(e.getMessage());
  36. log.info("进行重发");
  37. try {
  38. Thread.sleep(1000 * 1000);
  39. this.sendMail();
  40. } catch (InterruptedException e1) {
  41. log.info("重发邮件发生异常");
  42. log.error(e.getMessage());
  43. e1.printStackTrace();
  44. }
  45. }
  46. }
  47. }
  48. 1
  49. 2
  50. 3
  51. 4
  52. 5
  53. 6
  54. 7
  55. 8
  56. 9
  57. 10
  58. 11
  59. 12
  60. 13
  61. 14
  62. 15
  63. 16
  64. 17
  65. 18
  66. 19
  67. 20
  68. 21
  69. 22
  70. 23
  71. 24
  72. 25
  73. 26
  74. 27
  75. 28
  76. 29
  77. 30
  78. 31
  79. 32
  80. 33
  81. 34
  82. 35
  83. 36
  84. 37
  85. 38
  86. 39
  87. 40
  88. 41
  89. 42
  90. 43
  91. 44
  92. 45
  93. 46
  94. 47
  95. 48
  96. 49
  97. 50
  98. 51
  99. 52
  100. 53
  101. 54
  102. 55
  103. 1
  104. 2
  105. 3
  106. 4
  107. 5
  108. 6
  109. 7
  110. 8
  111. 9
  112. 10
  113. 11
  114. 12
  115. 13
  116. 14
  117. 15
  118. 16
  119. 17
  120. 18
  121. 19
  122. 20
  123. 21
  124. 22
  125. 23
  126. 24
  127. 25
  128. 26
  129. 27
  130. 28
  131. 29
  132. 30
  133. 31
  134. 32
  135. 33
  136. 34
  137. 35
  138. 36
  139. 37
  140. 38
  141. 39
  142. 40
  143. 41
  144. 42
  145. 43
  146. 44
  147. 45
  148. 46
  149. 47
  150. 48
  151. 49
  152. 50
  153. 51
  154. 52
  155. 53
  156. 54
  157. 55

如果是自己公司内部的邮件服务器,这个程序是没有任何问题的。
但当我们使用QQ邮箱尽心登陆,然后发邮箱时会报错,错误信息如下

503 Error

  1. 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
就会进入客户端设置页面

这里写图片描述

什么是客户端?
答:在腾讯看来,所有不是通过腾讯页面或者客户端登陆的都属于客户端。

所以现在问题已经很清晰了,在我们用程序发送电子邮件的时候,我们的密码已经不能用了,需要采用腾讯的授权码登陆

如何获取授权码?
答:跟着腾序的帮助中心一步一步来!

授权码的获取

什么是授权码?

  1. 授权码是QQ邮箱推出的,用于登录第三方客户端的专用密码。
  2. 适用于登录以下服务:POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。

通过以上可以看出,我们的程序登陆,发邮件采用的是SMTP协议,所以就必须采用授权码登陆了。

如何获取?

登陆qq邮箱

1、进入设置

这里写图片描述

2、进入账户

这里写图片描述

3、下拉到这里

这里写图片描述

点击开启

按照操作一步一步开启

开启完成之后就会得到一个授权码

所有程序登陆都次啊用授权码登陆

而且mailSender也要进行相应的修改

  1. <!-- mailSender配置,qq需要SSL -->
  2. <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
  3. <property name="host" value="${mail.smtp.host}" />
  4. <property name="port" value="${mail.smtp.port}" />
  5. <property name="username" value="${mail.smtp.username}" />
  6. <property name="password" value="${mail.smtp.password}" />
  7. <property name="javaMailProperties">
  8. <props>
  9. <prop key="mail.smtp.timeout">${mail.smtp.timeout}</prop>
  10. <prop key="mail.smtp.auth">${mail.smtp.auth}</prop>
  11. <prop key="mail.smtp.starttls.enable">${mail.smtp.starttls.enable}</prop>
  12. <prop key="mail.smtp.socketFactory.port">${mail.smtp.port}</prop>
  13. <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactory</prop>
  14. <prop key="mail.smtp.socketFactory.fallback">false</prop>
  15. </props>
  16. </property>
  17. </bean>
  18. 1
  19. 2
  20. 3
  21. 4
  22. 5
  23. 6
  24. 7
  25. 8
  26. 9
  27. 10
  28. 11
  29. 12
  30. 13
  31. 14
  32. 15
  33. 16
  34. 17
  35. 1
  36. 2
  37. 3
  38. 4
  39. 5
  40. 6
  41. 7
  42. 8
  43. 9
  44. 10
  45. 11
  46. 12
  47. 13
  48. 14
  49. 15
  50. 16
  51. 17

其他配置信息如下

  1. #端口号,QQ邮箱需要使用SSL,端口号465或587
  2. mail.smtp.port=465
  3. #STARTTLS是对纯文本通信协议的扩展。它提供一种方式将纯文本连接升级为加密连接(TLS或SSL)
  4. mail.smtp.starttls.enable=true
  5. mail.smtp.password=你的授权码
  6. 1
  7. 2
  8. 3
  9. 4
  10. 5
  11. 1
  12. 2
  13. 3
  14. 4
  15. 5

这样就可以登陆QQ邮箱发邮件了!

关于发邮件,改天再详细的写出来。

参考文献

http://wangcheng.iteye.com/blog/603908

http://blog.csdn.net/is_zhoufeng/article/details/12004073

发表评论

表情:
评论列表 (有 0 条评论,262人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java使用163和QQ邮箱邮件

    *“细雨梦回鸡塞远,小楼吹彻玉笙寒”** 序 现在做的项目有做到流程审批,到下一节点时,会给节点的负责人发送邮件通知。流程都是手写的代码,没有用到流程引擎。 ...

    相关 python使用qq邮箱邮件

    发现QQ邮箱是个变态的东西。。。普通网上的教程根本无法搞定这个问题 于是写了这个,用于帮助大家使用python发邮件遇到的问题 第一步: 开启QQ第三方登录,参考文章