当前位置:   article > 正文

使用Java Email进行邮件的发送_java发送smtp邮件

java发送smtp邮件

邮件协议

1.SMTP发送邮件协议(简单邮件存取协议)

       SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议。它是一组用于从源地址到目的地址传输邮件的准备规范,通过它来控制邮件的中转方式。SMTP协议属于TCP/IP协议簇,它帮助每台计算机在发送或中转信件时找到下一个目的发送地。SMTP 服务器就是遵循SMTP协议的发送邮件服务器。SMTP认证,简单地说就是要求必须在提供了账户名和密码之后才可以登录SMTP服务器,这就使得那些垃圾邮件的散播者无可乘之机。可增加SMTP认证的目的是为了使用户避免受到垃圾邮件的侵扰。

2.POP3接收邮件协议(邮局协议)

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

3.IMAP接收邮件协议(交互式邮件存取协议)

       IMAP全称是Internet Mail Access Protocol,即交互式邮件存取协议,它是跟POP3类似邮件访问标准协议之一。不同的是,开启了IMAP后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。

常用邮件服务商的SMTP信息

邮箱名称SMTP服务器端口号
QQ邮箱smtp.qq.com465/587
163邮箱smtp.163.com456
GMail邮箱smtp.gmail.com456/587
       邮件服务器地址通常是:

                             smtp.example.com

邮件发送的准备工作

首先进入网易邮箱中的设置->常规设置->POP3/SMTP/IMAP,开启POP3/SMTP服务

 在授权密码管理中,新增授权密码,密码只可以只用一次,记得保存密码!

准备好这些工作后,在文件夹下导入所需要用的jar包

 

 代码实现邮件发送

1.创建Session会话

  1. package com.apesource.demo;
  2. import java.util.Properties;
  3. import javax.mail.Authenticator;
  4. import javax.mail.PasswordAuthentication;
  5. import javax.mail.Session;
  6. //创建Session会话
  7. public class Demo01 {
  8. public static void main(String[] args) {
  9. //邮箱账号信息
  10. String userName = "********@163.com"; //邮箱发送账号
  11. String password = "*****************";//账号授权密码
  12. //SMTP服务器连接信息
  13. Properties props = new Properties();
  14. props.put("mail.smtp.host","smtp.163.com"); //SMTP主机名
  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. //参数一:smtp服务器连接参数
  20. //参数二 账号和密码的授权认证对象
  21. Session session = Session.getInstance(props,new Authenticator() {
  22. @Override
  23. protected PasswordAuthentication getPasswordAuthentication() {
  24. return new PasswordAuthentication(userName, password);
  25. }
  26. });
  27. System.out.println(session);
  28. //设置debug模式便于调试
  29. session.setDebug(true);
  30. }
  31. }

2.发送普通文本内容的邮件

  1. package com.apesource.demo;
  2. import javax.mail.MessagingException;
  3. import javax.mail.Session;
  4. import javax.mail.Transport;
  5. import javax.mail.internet.InternetAddress;
  6. import javax.mail.internet.MimeMessage;
  7. import javax.mail.internet.MimeMessage.RecipientType;
  8. import javax.sound.midi.MidiChannel;
  9. import com.apesource.util.JavaMailUtils;
  10. //发送普通文本内容的邮件
  11. public class Demo02 {
  12. public static void main(String[] args) {
  13. try {
  14. //1.创建Session会话
  15. Session session = JavaMailUtils.createSession();
  16. //2.创建邮件对象
  17. MimeMessage message = new MimeMessage(session); //构造一个Message对象
  18. message.setSubject("这是一封邮件"); //设置邮件标题
  19. message.setText("今天是2023年7月7号,农历五月二十"); //设置邮件正文
  20. message.setFrom(new InternetAddress("**********@163.com")); //发件方
  21. message.setRecipient(RecipientType.TO, new InternetAddress("*********@qq.com")); //收件方
  22. //3.发送,使用Transport.send()
  23. Transport.send(message);
  24. //设置debug模式便于调试
  25. session.setDebug(true);
  26. } catch (MessagingException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

       绝大多数邮件服务器要去发送方地址和登录用户名必须一致,否则发送将失败。

       MimeMessage的setRecipients方法设置邮件的收件人,其中

  • Message.RecipientType.TO常量表示收件人类型是邮件接收者
  • Message.RecipientType.CC常量表示收件人类型是抄送者
  • Message.RecipientType.BCC常量表示收件人的类型是密送者

3.抄送多个邮箱地址

  1. package com.apesource.demo;
  2. import javax.mail.Session;
  3. import javax.mail.Transport;
  4. import javax.mail.internet.InternetAddress;
  5. import javax.mail.internet.MimeMessage;
  6. import javax.mail.internet.MimeMessage.RecipientType;
  7. import com.apesource.util.JavaMailUtils;
  8. //抄送多个邮箱地址
  9. //邮件内容包含HTML标签
  10. public class Demo03 {
  11. public static void main(String[] args) {
  12. try {
  13. //创建Session会话
  14. Session session = JavaMailUtils.createSession();
  15. //创建MimeMessage邮件对象
  16. MimeMessage message = new MimeMessage(session);
  17. message.setSubject("测试邮件");
  18. //邮件正文包含html标签
  19. message.setText("今天是<strong>阳光明媚</strong>的一天,让我们一起拥抱太阳","utf-8","html");
  20. message.setRecipient(RecipientType.TO, new InternetAddress("**************@qq.com"));
  21. message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("**********@qq.com"),new InternetAddress("**********@qq.com")});
  22. message.setFrom(new InternetAddress("**********@163.com"));
  23. //发送邮件
  24. Transport.send(message);
  25. //设置debug模式便于调试
  26. session.setDebug(true);
  27. } catch (Exception e) {
  28. }
  29. }
  30. }

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

  1. package com.apesource.demo;
  2. import java.io.IOException;
  3. import java.nio.file.Files;
  4. import java.nio.file.Paths;
  5. import javax.activation.DataHandler;
  6. import javax.mail.BodyPart;
  7. import javax.mail.MessagingException;
  8. import javax.mail.Multipart;
  9. import javax.mail.Session;
  10. import javax.mail.Transport;
  11. import javax.mail.internet.InternetAddress;
  12. import javax.mail.internet.MimeBodyPart;
  13. import javax.mail.internet.MimeMessage;
  14. import javax.mail.internet.MimeMessage.RecipientType;
  15. import javax.mail.internet.MimeMultipart;
  16. import javax.mail.util.ByteArrayDataSource;
  17. import com.apesource.util.JavaMailUtils;
  18. import com.sun.mail.handlers.multipart_mixed;
  19. //发送带有"附件"的邮件
  20. public class Demo04 {
  21. public static void main(String[] args) {
  22. try {
  23. //1.创建Session对象
  24. Session session = JavaMailUtils.createSession();
  25. //2.创建MimeMessage邮件对象
  26. MimeMessage message = new MimeMessage(session);
  27. message.setRecipient(RecipientType.TO, new InternetAddress("*********@qq.com"));
  28. message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("**********@qq.com"),new InternetAddress("*********@qq.com")});
  29. message.setFrom(new InternetAddress("*********@163.com"));
  30. message.setSubject("鸡汤邮件");
  31. //邮件既包含正文又包含附件
  32. //正文
  33. BodyPart textpart = new MimeBodyPart();
  34. textpart.setContent("用<b>脑子</b>干事算是工作,不用<b>脑子</b>的只能算是动作!","text/html;charset=utf-8"); //防止中文乱码 <b>标签加粗字体
  35. //附件
  36. BodyPart filepart = new MimeBodyPart();
  37. filepart.setFileName("图片名称"); //附件文件显示名称
  38. //上传附件文件
  39. filepart.setDataHandler(
  40. new DataHandler(
  41. new ByteArrayDataSource(
  42. Files.readAllBytes(Paths.get("C:\\Users\\lenovo\\Pictures\\XXX.jpg")),
  43. "application/octet-stream"))); //文件类型
  44. //将正文+附件组装成Multipart对象
  45. Multipart multipart = new MimeMultipart();
  46. multipart.addBodyPart(textpart);
  47. multipart.addBodyPart(filepart);
  48. //将Multipart对象放入邮件
  49. message.setContent(multipart);
  50. Transport.send(message);
  51. //设置debug模式便于调试
  52. session.setDebug(true);
  53. } catch (MessagingException e) {
  54. e.printStackTrace();
  55. } catch (IOException e) {
  56. e.printStackTrace();
  57. }
  58. }
  59. }

5.邮件正文嵌套图片

  1. package com.apesource.demo;
  2. import java.io.IOException;
  3. import java.nio.file.Files;
  4. import java.nio.file.Paths;
  5. import javax.activation.DataHandler;
  6. import javax.mail.BodyPart;
  7. import javax.mail.MessagingException;
  8. import javax.mail.Multipart;
  9. import javax.mail.Session;
  10. import javax.mail.Transport;
  11. import javax.mail.internet.AddressException;
  12. import javax.mail.internet.InternetAddress;
  13. import javax.mail.internet.MimeBodyPart;
  14. import javax.mail.internet.MimeMessage;
  15. import javax.mail.internet.MimeMultipart;
  16. import javax.mail.util.ByteArrayDataSource;
  17. import javax.mail.internet.MimeMessage.RecipientType;
  18. import com.apesource.util.JavaMailUtils;
  19. //邮件正文嵌套图片
  20. public class Demo05 {
  21. public static void main(String[] args) {
  22. try {
  23. //1.创建Session对象
  24. Session session = JavaMailUtils.createSession();
  25. //2.创建MimeMessage邮件对象
  26. MimeMessage message = new MimeMessage(session);
  27. message.setFrom(new InternetAddress("*************@163.com")); //发件人
  28. message.setRecipient(RecipientType.TO, new InternetAddress("*************@qq.com")); //收件人
  29. //多人抄送使用new InternetAddress[] {}
  30. message.setRecipients(RecipientType.CC, new InternetAddress[] {new InternetAddress("***************@qq.com"),new InternetAddress("**********@qq.com")});
  31. message.setSubject("邮件标题"); //邮件标题
  32. //邮件正文
  33. BodyPart textpart = new MimeBodyPart();
  34. StringBuilder contentText = new StringBuilder();
  35. contentText.append("<h3>图片</h3>");
  36. contentText.append("<p>这是一张图片</p>");
  37. contentText.append("<img src=\"cid:gd\"/>");
  38. textpart.setContent(contentText.toString(),"text/html;charset=utf-8");
  39. //邮件附件
  40. BodyPart imagepart = new MimeBodyPart();
  41. imagepart.setDataHandler(
  42. new DataHandler(
  43. new ByteArrayDataSource(
  44. Files.readAllBytes(Paths.get("C:\\Users\\lenovo\\Pictures\\XXX.jpg")),
  45. "application/octet-stream")));
  46. //设置当前image为内嵌图片
  47. //这个ID和HTML中引用的ID对应起来,邮件客户端就可以正常显示内嵌图片
  48. imagepart.setHeader("Content-ID", "gd"); //图片的内容ID
  49. //邮件正文+附件
  50. Multipart multipart = new MimeMultipart();
  51. multipart.addBodyPart(textpart);
  52. multipart.addBodyPart(imagepart);
  53. message.setContent(multipart);
  54. Transport.send(message);
  55. } catch (AddressException e) {
  56. e.printStackTrace();
  57. } catch (MessagingException e) {
  58. e.printStackTrace();
  59. } catch (IOException e) {
  60. e.printStackTrace();
  61. }
  62. }
  63. }

小结

  • 使用JavaMail API发送邮件本质上是一个MUA软件通过SMTP协议发送邮件至MTA服务器
  • 打开调试模式可以看到详细的SMTP交互信息
  • 某些邮件服务商需要开启SMTP,并需要独立的SMTP登录密码
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/95483?site
推荐阅读
相关标签
  

闽ICP备14008679号