Java 发送邮件教程
前言
之前在写项目的时候,有关于用户注册的时候,使用邮箱和密码进行登录注册,我就想到了一个问题邮箱的验证可以通过正则表达式来进行匹配判断是否合理,但是如何判断邮箱是否可以用呢。我就想到能不能将验证码和邮箱结合起来,将验证码当作邮件发送注册的邮箱之中。
前期准备工作
首先需要将邮箱的 smtp 服务打开
我这里以QQ邮箱为例(腾讯打钱!)
登入账户后进入 设置=>账户=> POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务
打开相对应的 SMTP 服务,按照网站的提示进行验证,会给你一个授权码,把授权码复制下来
有了这些东西,我们就可以开心的写代码了
代码
依赖
我是用 Spring Boot 搭配 spring-boot-starter-mail 进行实现的,maven如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
配置文件
然后就是 配置文件 的编写
spring:
mail:
# 主机名称,我这里用QQ的个人邮箱举例
host: smtp.qq.com
# 邮箱账号
username: xxxxxxxx@qq.com
# 刚刚获得的授权码
password: shouquanma
# 字符集
default-encoding: UTF-8
properties:
mail:
smtp:
auth: true
socketFactory:
class: javax.net.ssl.SSLSocketFactory
# 发送的端口
port: 465
debug: true
- QQ邮箱:smtp.qq.com(个人)
- QQ邮箱:smtp.exmail.qq.com(企业)
- 163邮箱:smtp.163.com(个人)
- 163邮箱:smtp.qiye.163.com(企业)
Java 代码编写
到这里基本上就配置完成了,然后就是代码编写的部分了,这部分更简单了
因为 Spring Boot 提供了一个发送邮件的接口 JavaMailSender
,直接注入即可使用
package com.example.sendemail.service.impl;
import com.example.sendemail.service.EmailService;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.SimpleMailMessage;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.stereotype.Service;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.File;
/**
* @description:
* @author: xiaoming
* @date: 2022/10/03 22:09
*/
@Service
@Slf4j
public class EmailServiceImpl implements EmailService {
@Autowired
private JavaMailSender mailSender;
// 配置文件中配置的邮箱
@Value("${spring.mail.username}")
private String from;
/**
* 发送邮件
* @param to 收件人
* @param subject 主题
* @param content 内容
*/
@Override
public void sendMail(String to, String subject, String content) {
// 创建SimpleMailMessage对象
SimpleMailMessage message = new SimpleMailMessage();
// 设置邮件发送人
message.setFrom(from);
// 设置邮件接收人
message.setTo(to);
// 设置邮件主题
message.setSubject(subject);
// 设置邮件内容
message.setText(content);
// 设置发送邮件
mailSender.send(message);
}
}
测试
@SpringBootTest
class EmailServiceTest {
@Autowired
private EmailService emailService;
@Test
void sendSimpleMail() {
String to = "xxxxxx@gmail.com";
String subject = "验证码";
String content = "测试邮件";
emailService.sendMail(to,subject,content);
}
}
然后成功了
外传
网易篇
虽然说成功了,但我是这么容易满足的人吗,当然不是。这样用户收到的邮件后缀要是是我们项目自己的域名该多好呀,然后我就想自己拿服务器搭一个,正按照网路上的教程进行到第一步,隔壁那天天打我服务器的狗看到了,跟我说可以拿网易企业邮箱搭建,我就浅浅试了一下。
不得不说,成功了,但是也没完全成功。。
确实可以发送也可以接收,只不过只限制在了网页中。
我将那些邮箱和密码粘贴到我的程序中,他告诉我
org.springframework.mail.MailAuthenticationException: Authentication failed; nested exception is javax.mail.AuthenticationFailedException: 535 5.7.0 LOGIN.PERMDENY
搜完了意思就是不允许客户端登录,按照官方给的教程去操作,结果
总结两个字充钱,emmmm
还得是你,让我狗格200块出仨头像,让我炉石一张金色传说抽不到,呜呜呜
宝塔篇
既然网易不靠谱,那就换一个吧,抱着尝试的心态去搜了搜,发现宝塔里面有邮局可以用
在这里贴上官方教程链接 宝塔官方教程
进去搜索以后点击设置,按照其中的提示进行配置,将域名的 dns 记录按照上面的要求进行设置就好了
然后浅浅发了个测试邮件
搜了一下,发现国内的服务器 25 端口都是锁着的
然后我不死心的找朋友借了几个服务器发现都一样的效果,25 端口都是封着的。
虚拟机篇
既然外面的服务器都封 25 端口,那我自己弄一台总可以了吧
拿 Vmware 开了台 CentOS 7 ,按照上述的方式进行了一遍,一切顺利~!
最后附上一张昨晚实验成功的截图
还有一点,最好在配置邮局的时候添加一下证书,要不然大概率会被扔进垃圾邮件中
最后
感谢皮总的图床