手把手教你用 Java 发送邮件,不用框架

手把手教你用 Java 发送邮件,不用框架SMTP 协议全称为 Simple Mail Transfer Protocol 译作简单邮件传输协议 它定义了邮件客户端软件于 SMTP 服务器之间 以及 SMTP 服务器与 SMTP 服务器之间的通信规则

大家好,欢迎来到IT知识分享网。

邮件发送也是一个老生常谈的问题了,代码虽然简单,但是许多小伙伴对过程不太理解,所以还是打算和各位小伙伴聊聊这个话题。

邮件协议

我们经常会听到各种各样的邮件协议,比如 SMTP、POP3、IMAP ,那么这些协议有什么作用,有什么区别?我们先来讨论一下这个问题。

SMTP 是一个基于 TCP/IP 的应用层协议,江湖地位有点类似于 HTTP,SMTP 服务器默认监听的端口号为 25 。看到这里,小伙伴们可能会想到既然 SMTP 协议是基于 TCP/IP 的应用层协议,那么我是不是也可以通过 Socket 发送一封邮件呢?回答是肯定的。

生活中我们投递一封邮件要经过如下几个步骤:

  1. 深圳的小王先将邮件投递到深圳的邮局
  2. 深圳的邮局将邮件运送到上海的邮局
  3. 上海的小张来邮局取邮件

这是一个缩减版的生活中邮件发送过程。这三个步骤可以分别对应我们的邮件发送过程,假设从 发送邮件到 :

  1. 先将邮件投递到腾讯的邮件服务器
  2. 腾讯的邮件服务器将我们的邮件投递到网易的邮件服务器
  3. 登录网易的邮件服务器查看邮件

邮件投递大致就是这个过程,这个过程就涉及到了多个协议,我们来分别看一下。

SMTP 协议全称为 Simple Mail Transfer Protocol,译作简单邮件传输协议,它定义了邮件客户端软件于 SMTP 服务器之间,以及 SMTP 服务器与 SMTP 服务器之间的通信规则。

也就是说 用户先将邮件投递到腾讯的 SMTP 服务器这个过程就使用了 SMTP 协议,然后腾讯的 SMTP 服务器将邮件投递到网易的 SMTP 服务器这个过程也依然使用了 SMTP 协议,SMTP 服务器就是用来收邮件。

而 POP3 协议全称为 Post Office Protocol ,译作邮局协议,它定义了邮件客户端与 POP3 服务器之间的通信规则,那么该协议在什么场景下会用到呢?当邮件到达网易的 SMTP 服务器之后, 用户需要登录服务器查看邮件,这个时候就该协议就用上了:邮件服务商都会为每一个用户提供专门的邮件存储空间,SMTP 服务器收到邮件之后,就将邮件保存到相应用户的邮件存储空间中,如果用户要读取邮件,就需要通过邮件服务商的 POP3 邮件服务器来完成。

最后,可能也有小伙伴们听说过 IMAP 协议,这个协议是对 POP3 协议的扩展,功能更强,作用类似,这里不再赘述。

发送邮件准备工作

首先我们需要先登录 邮箱网页版,点击上方的设置按钮:

手把手教你用 Java 发送邮件,不用框架

然后点击账户选项卡:

手把手教你用 Java 发送邮件,不用框架

在账户选项卡中找到开启POP3/SMTP选项,如下:

手把手教你用 Java 发送邮件,不用框架

点击开启,开启相关功能,开启过程需要手机号码验证,按照步骤操作即可,不赘述。开启成功之后,即可获取一个授权码,将该号码保存好,一会使用。

然后我们需要 JavaxMail 这个 jar 包,小伙伴可以直接去Maven中央仓库下载,这里不再赘述。

发送

简单邮件

如果我们只发送一个简单的文本,发送方式就比较简单,整个过程可以分为三步如下:

第一步:构造 SMTP 邮件服务器的基本环境

Properties properties = new Properties(); properties.setProperty("mail.host", "smtp..com"); properties.setProperty("mail.transport.protocol", "smtp"); properties.setProperty("mail.smtp.auth", "true"); properties.setProperty("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); properties.setProperty("mail.smtp.port", "465"); Session session = Session.getDefaultInstance(properties); session.setDebug(true); 

第二步:构造邮件

MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.addRecipients(Message.RecipientType.TO, "111@.com");//设置收信人
mimeMessage.addRecipients(Message.RecipientType.CC, "222@.com");//抄送
mimeMessage.setFrom("1510161612@.com");//邮件发送人
mimeMessage.setSubject("测试邮件主题");//邮件主题
mimeMessage.setContent("Hello,这是一封测试邮件", "text/html;charset=utf-8");//正文

第三步:发送邮件

Transport transport = session.getTransport(); transport.connect("smtp..com", "", "刚刚申请到的授权码"); transport.sendMessage(mimeMessage, mimeMessage.getAllRecipients());//发送邮件,第二个参数为收件人 transport.close(); 

复杂邮件

发送复杂邮件,第一步和第三步也是一样的,只有第二步构造邮件的过程比较麻烦,那么接下来给小伙伴们演示一个发送一封图文+两个附件的邮件。要发送复杂邮件,得先熟悉三个概念,如下:

  1. MimeMessage:该类是个能理解MIME类型和头的电子邮件消息
  2. MimeMultipart:该类定义了增加、删除以及获取邮件不同部分内容的方法
  3. MimeBodyPart:该对象代表一个MimeMessage对象内容的一部分。每个MimeBodyPart被认为有两部分:MIME类型和匹配这个类型的内容

完整的邮件生成过程如下(第一步和第三步参考上文):

MimeMessage mimeMessage = new MimeMessage(session);
mimeMessage.addRecipients(Message.RecipientType.TO, "111@.com");//设置收信人
mimeMessage.addRecipients(Message.RecipientType.CC, "222@.com");//抄送
mimeMessage.setFrom("333@.com");//邮件发送人
mimeMessage.setSubject("测试邮件主题");//邮件主题

MimeMultipart mixed = new MimeMultipart("mixed");
mimeMessage.setContent(mixed);//设置整封邮件的MIME消息体为混合的组合关系

MimeBodyPart attach1 = new MimeBodyPart();//创建附件1
MimeBodyPart attach2 = new MimeBodyPart();//创建附件2
MimeBodyPart content = new MimeBodyPart();//创建邮件正文

mixed.addBodyPart(attach1);//将附件一添加到MIME消息体中
mixed.addBodyPart(attach2);//将附件二添加到MIME消息体中
mixed.addBodyPart(content);//将正文添加到消息体中

FileDataSource fds1 = new FileDataSource(new File("C:\Users\sang\Desktop\1.png"));//构造附件一的数据源
DataHandler dh1 = new DataHandler(fds1);//数据处理
attach1.setDataHandler(dh1);//设置附件一的数据源
attach1.setFileName("1.png");//设置附件一的文件名

//附件二的操作与附件一类似,这里就不一一注释了
FileDataSource fds2 = new FileDataSource(new File("C:\Users\sang\Desktop\博客笔记.xlsx"));
DataHandler dh2 = new DataHandler(fds2);
attach2.setDataHandler(dh2);
attach2.setFileName(MimeUtility.encodeText("博客笔记.xlsx"));//设置文件名时,如果有中文,可以通过MimeUtility类中的encodeText方法进行编码,避免乱码

MimeMultipart bodyMimeMultipart = new MimeMultipart("related");//设置正文的MIME类型
content.setContent(bodyMimeMultipart);//将bodyMimeMultipart添加到正文消息体中

MimeBodyPart bodyPart = new MimeBodyPart();//正文的HTML部分
bodyPart.setContent("<h1>Hello大家好,这是一封测试邮件<img src='cid:2.png'/></h1>","text/html;charset=utf-8");

MimeBodyPart picPart = new MimeBodyPart();//正文的图片部分
DataHandler dataHandler = new DataHandler(new FileDataSource("C:\Users\sang\Desktop\2.png"));
picPart.setDataHandler(dataHandler);
picPart.setContentID("2.png");

//将正文的HTML和图片部分分别添加到bodyMimeMultipart中
bodyMimeMultipart.addBodyPart(bodyPart);
bodyMimeMultipart.addBodyPart(picPart);

mimeMessage.saveChanges();

OK,Java Mail 发送 邮件就是这么简单,至于其他的如 163,sina 等,写法类似,这里我就不赘述了。

有问题欢迎留言讨论。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/138529.html

(0)
上一篇 2025-06-12 18:45
下一篇 2025-06-12 19:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信