电子邮箱的概念
电子邮箱其实就是分为邮箱服务器和电子邮箱客户端
邮箱服务器:主要是用于接收并转发邮件,类似于邮局,把用户的邮件接收过来,然后转 发到邮件接收者的电子邮箱中。
服务器地址:一般是 smtp.xxx.com,比如163邮箱是smtp.163.com,qq邮箱是smtp.qq.com。
邮箱客户端:就是每个账号在服务器中开辟的一小段空间。用户在服务器中申请一个账号,服务器就会为这个账号分配一小段空 间,然后用户使用这个账号和空间,进行存储邮件和发送邮件。 客户端可以是可以只安装在电脑上(C/S)的也可 以是网页形式(B/S)的。
邮箱协议
- SMTP :发送邮件协议
端口号:22
定义了邮件在客户端软件和SMTP服务器,或者在SMTP服务器之间的传输格式和规范
- POP3/IMAP/POP :接收邮件协议
端口号:110
定义了邮件在POP3服务器和客户端软件之间的传输格式和规范
接收和发送邮件可以是两个服务器,也可以是一个服务器,大公司一般是分离的。
发送用的协议是SMTP
接收用的协议可能是POP3或者IMAP,或者两者混合用。
作用:约束了邮件在网络传输的过程中的传输格式
邮件发送流程图
- 首先通过smtp协议连接到Smtp服务器,然后发送一封邮件给网易的邮件服务器
- 网易分析发现需要去QQ的邮件服务器,通过smtp协议将邮件转投给QQ的Smtp服务器
- QQ将接收到的邮件存储在545646733@qq.com这个邮件账号的空间中
- 再通过Pop3协议连接到Pop3服务器收取邮件
- 从545646733@qq.com这个邮件账号的空间中取出邮件
- Pop3服务器将取出来的邮件送出去
java邮件发送
概述:邮件在实际项目中的应用非常广泛,比如:对用户注册、登录发送邮件进行验证, 对当天生日的员工发邮件祝福.......
使用java发送邮件需要使用到两个包 :
- mail.jar
- activation.jar
可以通过repository 仓库下载:
https://mvnrepository.com/artifact/javax.mail/mail
https://mvnrepository.com/artifact/javax.activation/activation
如果使用maven也可以直接导入commons-email 依赖(内部会自动导入mail.jar 和activation.jar包 )
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-email -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-email</artifactId>
<version>1.4</version>
</dependency>
注意:下面的那段发送电子邮件的代码中所用到的一些类,是导入的下面这些邮件包中的类,就比如说session这个类,并不是咱们平常用的HttpServletSession,而是mail包中的。
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
开启邮箱stmp 服务
想要在java项目中使用java代码发送电子邮件,那么你的发件人 的邮箱必须是开通了stmp服务。至于为什么是stmp服务而不是别的服务,因为我在上面使用的stmp邮件协议。所以需要开通该服务。
- 登录发件人邮箱,我们这里使用的是qq邮箱,点击设置/账户
2.开启服务,会弹出这个授权码(记住他,我们一会要使用到)
-----------------------------------开始发送邮件啦 ----------------------------------------------------
邮件发送工具类 (发送邮件的工具类,不用刻意去记,用滴时候 copy 就好啦)
import java.util.Properties;
import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
public class MailUtil {
/* 邮件发送
* path是指你要发给哪个邮箱号,title是指你的邮件的标题。msg是指你的邮件的内容。
*/
public static void sendEmail(String path,String title, String msg) {
// 创建Properties 类用于记录邮箱的一些属性
Properties properties = new Properties();
properties.put("mail.transport.protocol", "smtp");// 连接协议,即:邮件协议
properties.put("mail.smtp.host", "smtp.qq.com");// 设置qq邮件服务器
properties.put("mail.smtp.port", 465);// 端口号 :qq邮箱给出的两个端口号 587和465
properties.put("mail.smtp.auth", "true");
properties.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接 ---一般都使用 (如果使用465端口,必须开启ssl协议)
properties.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息
// 得到回话对象
Session session = Session.getInstance(properties);
// 获取邮件对象
Message message = new MimeMessage(session);
try {
// 设置发件人邮箱地址
message.setFrom(new InternetAddress("5479xxxx@qq.com"));
// 设置收件人邮箱地址
message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress(path)});
//message.setRecipient(Message.RecipientType.TO, new InternetAddress("xxx@qq.com"));//一个收件人
// 设置邮件标题
message.setSubject(title);
// 设置邮件内容
message.setText(msg);
// 得到邮差对象
Transport transport = session.getTransport();
// 连接自己的邮箱账户
transport.connect("5479xxxxxx@qq.com", "xxxxxxxxxxxx");// 密码为QQ邮箱开通的stmp服务后得到的客户端授权码(你可以进入你的邮箱的设置里面查看)
// 发送邮件
transport.sendMessage(message, message.getAllRecipients());
transport.close();
}catch (Exception e) {
System.out.println("邮件发送失败");
}
}
}
发送邮件
public static void main(String[] args) {
MailUtil.sendEmail("xxxxxx@163.com","hello 你好","见到你很高兴");
}
【注意】有可能填写的收件人地址,发件人地址等信息都正确了,控制台也打印了正确的信息,但是在收件箱就是收不到信息。这是因为可能收件箱服务器拒收了你发的邮件(比如认为你的邮件是广告),这时候可能在垃圾箱里能找到,可能找不到。解决办法是重复的邮件内容不要多次发送,或者更换收件箱试试
内容转载自:
https://blog.csdn.net/weixin_44142032/article/details/89319167
https://blog.csdn.net/qq_41151659/article/details/96475739