Javamail配置阿里云邮箱发送邮件

先了解一下基本的配置元素的概念:

什么是POP3、SMTP?

1、什么是POP3:

POP3是Post Office Protocol3的简称,即邮局协议的第3个版本,它规定怎样将个人计算机连接到Internet的邮件服务器和下载电子邮件的电子协议。它是因特网电子邮件的第一个离线协议标准,POP3允许用户从服务器上把邮件存储到本地主机(即自己的计算机)上,同时删除保存在邮件服务器上的邮件,而POP3服务器则是遵循 POP3协议的接收邮件服务器,用来接收电子邮件的。

2、什么是SMTP:

SMTP 的全称是“Simple MailTransfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式。SMTP 协议属于 TCP/IP 协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的地。SMTP 服务器就是遵循 SMTP 协议的发送邮件服务器。

(SMTP 认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录 SMTP 服务器,这就使得那些垃圾邮件的散播者无可乘之机。增加 SMTP 认证的目的是为了使用户避免受到垃圾邮件的侵扰。)

代码实现流程:

1,引入的包:

 
  1. <dependency>

  2. <groupId>javax.mail</groupId>

  3. <artifactId>mail</artifactId>

  4. <version>1.4.7</version>

  5. </dependency>

2,邮箱信息在Properties中的相关配置:

 
  1. smtpServer=smtp.aliyun.com

  2. port=465

  3. fromUserName=你的阿里邮箱账号

  4. fromUserPassword=你的邮箱密码

这里注意了,很容易出错,网上一搜基本的教程都是这样的:smtpServer=smtp.aliyun.com

也就是properties.put("mail.smtp.host", smtp.aliyun.com);

但如果你使用的是阿里的企业邮箱,这样把邮箱的配置服务器地址照搬过来的做法是有问题的。

这里应该使用自己企业的域名地址,比如我的域名是amuxia.com(当然这个也是假的,举个例子,哈哈),这里就应该配置smtp.amuxia.com。否则报错:

javax.mail.AuthenticationFailedException:526Authentication failure[0]

这里应该注意一下。

3,邮箱实体类(设置邮箱、邮件的相关信息)

 
  1. public class EmailInfo {

  2. private final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";

  3. private String smtpServer;

  4. // SMTP服务器地址

  5. private String port; // 端口

  6. private String fromUserName;

  7. // 登录SMTP服务器的用户名,发送人邮箱地址

  8. private String fromUserPassword;

  9. // 登录SMTP服务器的密码

  10. private String toUser; // 收件人

  11. private String subject; // 邮件主题

  12. private String content; // 邮件正文

  13. public EmailInfo() {

  14.  
  15. }

  16. public EmailInfo(String toUser, String subject, String content) {

  17. this.toUser = toUser;

  18. this.subject = subject;

  19. this.content = content;

  20. this.smtpServer = Global.getConfig("smtpServer");

  21. this.port = Global.getConfig("port");

  22. this.fromUserName = Global.getConfig("fromUserName");

  23. this.fromUserPassword = Global.getConfig("fromUserPassword");

  24. }

  25. //get、set方法略

  26. }

4,发送邮件的实现类(工具类):

 
  1. public class EmailUtil {

  2. /**

  3. * 进行base64加密,防止中文乱码

  4. */

  5. private static String changeEncode(String str) {

  6. try {

  7. str = MimeUtility.encodeText(new String(str.getBytes(), "UTF-8"), "UTF-8", "B"); // "B"代表Base64

  8. } catch (UnsupportedEncodingException e) {

  9. e.printStackTrace();

  10. }

  11. return str;

  12. }

  13.  
  14. public static boolean sendHtmlMail(EmailInfo emailInfo) {

  15. Properties properties = new Properties();

  16. properties.put("mail.smtp.host", emailInfo.getSmtpServer());

  17. properties.put("mail.transport.protocol", "smtp");

  18. properties.put("mail.smtp.auth", "true");

  19. properties.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); // 使用JSSE的SSL

  20. properties.put("mail.smtp.socketFactory.fallback", "false"); // 只处理SSL的连接,对于非SSL的连接不做处理

  21. properties.put("mail.smtp.port", emailInfo.getPort());

  22. properties.put("mail.smtp.socketFactory.port",emailInfo.getPort());

  23. Session session = Session.getInstance(properties);

  24. session.setDebug(true);

  25. MimeMessage message = new MimeMessage(session);

  26.  
  27. try {

  28. // 发件人

  29. Address address = new InternetAddress(emailInfo.getFromUserName());

  30. message.setFrom(address);

  31. // 收件人

  32. Address toAddress = new InternetAddress(emailInfo.getToUser());

  33. message.setRecipient(MimeMessage.RecipientType.TO, toAddress); // 设置收件人,并设置其接收类型为TO

  34.  
  35. // 主题message.setSubject(changeEncode(emailInfo.getSubject()));

  36. message.setSubject(emailInfo.getSubject());

  37. // 时间

  38. message.setSentDate(new Date());

  39.  
  40. Multipart multipart = new MimeMultipart();

  41.  
  42. // 创建一个包含HTML内容的MimeBodyPart

  43. BodyPart html = new MimeBodyPart();

  44. // 设置HTML内容

  45. html.setContent(emailInfo.getContent(), "text/html; charset=utf-8");

  46. multipart.addBodyPart(html);

  47. // 将MiniMultipart对象设置为邮件内容

  48. message.setContent(multipart);

  49. message.saveChanges();

  50. } catch (Exception e) {

  51. e.printStackTrace();

  52. return false;

  53. }

  54.  
  55. try {

  56. Transport transport = session.getTransport("smtp");

  57. transport.connect(emailInfo.getSmtpServer(), emailInfo.getFromUserName(), emailInfo.getFromUserPassword());

  58. transport.sendMessage(message, message.getAllRecipients());

  59. transport.close();

  60. } catch (Exception e) {

  61. e.printStackTrace();

  62. return false;

  63. }

  64.  
  65. return true;

  66. }

  67. }


5,测试一下:

 
  1. public static void main(String[] args) {

  2. EmailUtil util = new EmailUtil();

  3. String content =Global.getConfig("email_user_add_content");

  4. content = content.format(content, "111","222");

  5. System.out.println(content);

  6. EmailInfo info = new EmailInfo("[email protected]", Global.getConfig("email_user_add_subject"), "<p>这是一个测试邮件</p>");

  7. util.sendHtmlMail(info);

  8. }


这下就妥妥的了,这些代码运行没有问题,但是用到了其他的一些辅助类,如Global.getConfig()获取配置文件中的信息,用时替换掉就行。

应用中配置使用邮箱接收发送邮件,经常会因为各个邮箱配置的细微差异出现错误,多半是认证不通过,而认证不通过的原因无非是:

1、服务器错误

2、用户名错误

3、用户名密码不匹配。

遇到错误从这几方面下手就可以了,在代码中使用邮箱发送邮件时要先在客户端试一次,确保邮箱在客户端是可接可收的。

这里顺便说一下怎么在outlook客户端添加阿里云邮箱。

1,点击文件——》添加账户

2,选择配置方式

3,填写账户信息:

4,点击“其他设置”

最后就完成了配置,发送一封邮件测试一下就妥妥的了。

猜你喜欢

转载自blog.csdn.net/baidu_37366055/article/details/81079151