当前位置:   article > 正文

JavaMail发送不同类型邮件的案例总结与实现步骤

javamail

本篇技术博客整理和总结了JavaMail发送各种不同类型的邮件的案例,以及其中的实现步骤和细节。

目录

一. 概述

二. 大致步骤

三. 发送不同类型邮件的案例的实现细节

1. 事前准备

2. 发送普通文本的邮件

3. 发送带有html标签的邮件

​4. 发送带有附件的邮件

5. 发送内嵌图片的html邮件

 四. 小结


一. 概述

使用JAVA程序进行发送邮件,使用的是SMTP协议,它是 Simple Mail Transport Protocol 的缩写,使用标准端口 25 ,也可以使用加密端口 465 或 587 。 SMTP 协议是一个建立在 TCP 之上的协议,任何程序发送邮件都必须遵守 SMTP 协议。使用 Java 程序发送邮件时,我们无需关心 SMTP 协议的底层原理,只需要使用 JavaMail这个标准 API 就可以直接发送邮件。

二. 大致步骤

  1. 创建session对象,其作用是建立程序与邮件服务商的会话(连接)。
  2. 创建message对象。
  3. 设置message对象的内容。
  4. 发送message。

三. 发送不同类型邮件的案例的实现细节

1. 事前准备

首先我们要准备SMTP的登录信息,本人使用的是163邮箱,下面是不同常用邮件服务商的SMTP信息:

  • QQ邮箱:SMTP服务器是 smtp.qq.com ,端口是 465 / 587
  • 163邮箱:SMTP服务器是 smtp.163.com ,端口是 465
  • Gmail邮箱:SMTP服务器是 smtp.gmail.com ,端口是 465 / 587

准备好登录信息后,需要将相关jar包javax.mail-1.6.2.jar导入到项目中。

然后,我们通过 JavaMail API 连接到 SMTP 服务器上:连接 SMTP 服务器时, 需要准备一个 Properties 对象,填入相关信息。最后创建Session实例时,调用Session.getInstance()方法,第一个参数传入服务器的连接信息properties对象,第二个参数传入Authenticator对象返回用户名和密码用于服务器的认证。当我们获取到 Session 实例后,调用session实例的setDebug()方法打开调试模式可以看到 SMTP 通信的详细内容,便于调试。

这里将session实例的创建过程封装成了一个类中的静态方法,以便于后面session实例的创建。

  1. import java.util.Properties;
  2. import javax.mail.Authenticator;
  3. import javax.mail.PasswordAuthentication;
  4. import javax.mail.Session;
  5. public final class JavaMailUtils {
  6. private JavaMailUtils() {
  7. }
  8. public static Session createSession() {
  9. //邮箱账号信息
  10. String userName = "m18391125066@163.com";// 邮箱发送账号
  11. String password = "SDBHWNAOUZZAXRLH";// 账号授权密码
  12. //SMTP服务器连接信息
  13. Properties props = new Properties();
  14. props.put("mail.smtp.host", "smtp.163.com"); // STMP主机名
  15. props.put("mail.smtp.port", "25"); // 主机端口号
  16. props.put("mail.smtp.auth", "true"); // 是否需要用户认证
  17. props.put("mail.smtp.starttls.enable", "true"); // 启用TLS加密
  18. //创建session对话
  19. // 参数1: smtp服务器连接参数
  20. // 参数2: 账号和密码的授权认证对象
  21. Session session = Session.getInstance(props, new Authenticator() {
  22. @Override
  23. protected PasswordAuthentication getPasswordAuthentication() {
  24. // TODO Auto-generated method stub
  25. return new PasswordAuthentication(userName, password);
  26. }
  27. });
  28. session.setDebug(true);
  29. return session;
  30. }
  31. }

2. 发送普通文本的邮件

第一步,创建session会话。

使用之前封装好的方法创建session对象。

  1. // 1.创建session对话
  2. Session session = JavaMailUtils.createSession();

第二步,创建邮件对象并设置相关信息。

  1. // 2.创建邮件对象
  2. MimeMessage message = new MimeMessage(session);
  3. message.setSubject("这是来自Gypppppppppppppp的邮件"); // 设置邮件标题
  4. message.setText("hahhhhhhhhhh","utf-8"); // 设置邮件正文
  5. message.setFrom(new InternetAddress("此处为发件人的邮箱")); //设置发件人
  6. message.setRecipient(RecipientType.TO,newInternetAddress("此处为收件人的邮箱")); //设置收件人

第三步,发送邮件。

  1. // 3.发送邮件
  2. Transport.send(message);

发送至qq邮箱:

将调试信息打印到控制台上,我们可以看出: SMTP协议是一个请求-响应协议,客户端总是发送命令,然后等待服务器响应。服务器响应总是以数字开头,后面的信息才是用于调试的文本。 这些响应码已经被定义在SMTP协议中了,查看具体的响应码就可以知道出错原因。

  1. DEBUG: setDebug: JavaMail version 1.6.2
  2. DEBUG: getProvider() returning javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Oracle]
  3. DEBUG SMTP: need username and password for authentication
  4. DEBUG SMTP: protocolConnect returning false, host=smtp.163.com, user=18018, password=<null>
  5. DEBUG SMTP: useEhlo true, useAuth true
  6. DEBUG SMTP: trying to connect to host "smtp.163.com", port 25, isSSL false
  7. 220 163.com Anti-spam GT for Coremail System (163com[20141201])
  8. DEBUG SMTP: connected to host "smtp.163.com", port: 25
  9. EHLO LAPTOP-6GE885FP
  10. 250-mail
  11. 250-PIPELINING
  12. 250-AUTH LOGIN PLAIN XOAUTH2
  13. 250-AUTH=LOGIN PLAIN XOAUTH2
  14. 250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFw9LV7UCa0xDrUUUUj
  15. 250-STARTTLS
  16. 250-ID
  17. 250 8BITMIME
  18. DEBUG SMTP: Found extension "PIPELINING", arg ""
  19. DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2"
  20. DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN XOAUTH2"
  21. DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UFw9LV7UCa0xDrUUUUj"
  22. DEBUG SMTP: Found extension "STARTTLS", arg ""
  23. DEBUG SMTP: Found extension "ID", arg ""
  24. DEBUG SMTP: Found extension "8BITMIME", arg ""
  25. STARTTLS
  26. 220 Ready to start TLS
  27. EHLO LAPTOP-6GE885FP
  28. 250-mail
  29. 250-PIPELINING
  30. 250-AUTH LOGIN PLAIN XOAUTH2
  31. 250-AUTH=LOGIN PLAIN XOAUTH2
  32. 250-coremail 1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UryxxwZUCa0xDrUUUUj
  33. 250-STARTTLS
  34. 250-ID
  35. 250 8BITMIME
  36. DEBUG SMTP: Found extension "PIPELINING", arg ""
  37. DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN XOAUTH2"
  38. DEBUG SMTP: Found extension "AUTH=LOGIN", arg "PLAIN XOAUTH2"
  39. DEBUG SMTP: Found extension "coremail", arg "1Uxr2xKj7kG0xkI17xGrU7I0s8FY2U3Uj8Cz28x1UUUUU7Ic2I0Y2UryxxwZUCa0xDrUUUUj"
  40. DEBUG SMTP: Found extension "STARTTLS", arg ""
  41. DEBUG SMTP: Found extension "ID", arg ""
  42. DEBUG SMTP: Found extension "8BITMIME", arg ""
  43. DEBUG SMTP: protocolConnect login, host=smtp.163.com, user=m18391125066@163.com, password=<non-null>
  44. DEBUG SMTP: Attempt to authenticate using mechanisms: LOGIN PLAIN DIGEST-MD5 NTLM XOAUTH2
  45. DEBUG SMTP: Using mechanism LOGIN
  46. DEBUG SMTP: AUTH LOGIN command trace suppressed
  47. DEBUG SMTP: AUTH LOGIN succeeded
  48. DEBUG SMTP: use8bit false
  49. MAIL FROM:<m18391125066@163.com>
  50. 250 Mail OK
  51. RCPT TO:<1801875581@qq.com>
  52. 250 Mail OK
  53. DEBUG SMTP: Verified Addresses
  54. DEBUG SMTP: 1801875581@qq.com
  55. DATA
  56. 354 End data with <CR><LF>.<CR><LF>
  57. Date: Sat, 8 Jul 2023 19:58:44 +0800 (CST)
  58. From: m18391125066@163.com
  59. To: 1801875581@qq.com
  60. Message-ID: <1028214719.0.1688817524899@LAPTOP-6GE885FP>
  61. Subject: =?GBK?Q?=D5=E2=CA=C7=C0=B4=D7=D4Gyppppppppppppppppppppppp?=
  62. =?GBK?Q?ppppppppppppppppppppppppppp=B5=C4=D3=CA=BC=FE?=
  63. MIME-Version: 1.0
  64. Content-Type: text/plain; charset=utf-8
  65. Content-Transfer-Encoding: 7bit
  66. hahhhhhhhhhhhhhh
  67. .
  68. 250 Mail OK queued as zwqz-smtp-mta-g1-3,_____wA3hi51T6lkpTUyCA--.50930S3 1688817527
  69. DEBUG SMTP: message successfully delivered to mail server
  70. QUIT
  71. 221 Bye

 3. 发送带有html标签的邮件

和发送文本邮件类似,只需要在message.setText(body,"utf-8")的基础上传入第三个参数"html",即message.setText(body,"utf-8","html"),这样正文中就可以识别html标签并展示相应的效果。

message.setText("<b>hahhhhh</b>hhhhhhhhh","utf-8","html"); // 设置邮件正文

 4. 发送带有附件的邮件

 要想携带附件,setText()方法就不再适用,而是要构造一个Multipart对象:

  1. //邮件中既包含正文,又包含附件正文
  2. //正文
  3. BodyPart textPart = new MimeBodyPart();
  4. StringBuilder contentText = new StringBuilder();
  5. contentText.append("<h3>海边的曼彻斯特</h3>");
  6. contentText.append("<p>I cant beat it</p>");
  7. textPart.setContent(contentText.toString(),"text/html;charset=utf-8");
  8. //附件
  9. BodyPart imagePart = new MimeBodyPart();
  10. imagePart.setFileName("附件名称");
  11. imagePart.setDataHandler(new DataHandler(
  12. new ByteArrayDataSource(Files.readAllBytes(Paths.get("d:\\file\\Manchester.webp")), "application/octet-stream")));
  13. //将正文和附件部分组装成Multipart对象
  14. Multipart multipart = new MimeMultipart();
  15. multipart.addBodyPart(textPart);
  16. multipart.addBodyPart(imagePart);
  17. //将multipart对象放入邮件
  18. message.setContent(multipart);

运行结果: 带有附件

 

 5. 发送内嵌图片的html邮件

如果需要在HTML邮件中内嵌图片,可以选择在html邮件中加入<img src="">  的标签,这样的外部图片链接通常会被邮件客户端过滤,并提示用户显示图片并不安全。只有内嵌的图片才能正常在邮件中显示。所以,这种方式并不推荐。

推荐将内嵌图片作为一个附件嵌入邮件,即邮件本身也是 Multipart ,但需要在带有附件的邮件发送程序上做一点额外的处理:

  1. contentText.append("<img scr=\"cid:Manchester\">"); // 在正文部分中加入html标签
  2. imagePart.setHeader("Content-ID","Manchester");// 在附件部分设置图片内容的id

 四. 小结

  • 使用JavaMail API发送邮件本质上是一个MUA软件通过SMTP协议发送邮件至MTA服务器
  • 打开调试模式可以看到详细的SMTP交互信息
  • 某些邮件服务商需要开启SMTP,并需要独立的SMTP登录密码

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/95507
推荐阅读
相关标签
  

闽ICP备14008679号