Java使用QQ邮箱发送邮件

该文章介绍了如何利用SpringBoot集成QQ邮箱的SMTP服务来发送邮件,包括添加相关依赖,配置邮件服务,创建邮件类和邮件工具类,以及使用Thymeleaf模板引擎发送含验证码的HTML邮件。同时,文章还展示了发送纯文本和HTML模板邮件的示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. QQ邮箱开启SMTP服务

2. 引入依赖

<!-- 配置thymeleaf模板依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

<!-- 支持发送邮件依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-mail</artifactId>
</dependency>

3. 引入配置

spring
  mail:
    default-encoding: UTF-8
    host: smtp.qq.com
    username: 你的邮箱地址
    password: 你的授权码
    port: 22
    protocol: smtp
    properties:
      mail:
        smtp:
          ssl:
            enable: true
          socketFactory:
            port: 465
            class: javax.net.ssl.SSLSocketFactory

4. 编写发送邮件类

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.thymeleaf.context.Context;

import java.util.List;

@Data
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
public class EmailBean {
    /**
     * 填充内容
     */
    private Context context;

    /**
     * 使用模板,和text互斥,优先使用模板,模板不存在发送text内容
     */
    private String templateName;

    /**
     * 发送给谁
     */
    private String toUser;

    /**
     * 抄送给谁
     */
    private String[] ccUser;

    /**
     * 邮件主体
     */
    private String subject;

    /**
     * 邮件内容,和templateName互斥,优先使用模板,模板不存在发送text内容
     */
    private String text;

    /**
     * 附件列表
     */
    private List<String> attachmentList;
}

5. 创建邮件工具类


import com.maple.demo.config.bean.EmailBean;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.io.FileSystemResource;
import org.springframework.mail.javamail.JavaMailSender;
import org.springframework.mail.javamail.MimeMessageHelper;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.thymeleaf.TemplateEngine;

import javax.mail.MessagingException;
import javax.mail.internet.MimeMessage;

@Service
@RequiredArgsConstructor
public class EmailUtil {

    private final JavaMailSender mailSender;

    private final TemplateEngine templateEngine;

    @Value("${spring.mail.username}")
    private String from;

    @Async
    public void sendEmail(EmailBean emailBean) {
        try {
            // 解决附件名称过长导致的附件名称乱码问题
            System.setProperty("mail.mime.splitlongparameters", "false");
            // 定义邮件信息
            MimeMessage message = mailSender.createMimeMessage();
            MimeMessageHelper helper;
            helper = new MimeMessageHelper(message, true);
            helper.setFrom(from);
            helper.setTo(emailBean.getToUser());
            helper.setSubject(emailBean.getSubject());
            if (emailBean.getCcUser() != null && emailBean.getCcUser().length > 0) {
                helper.setCc(emailBean.getCcUser());
            }

            // 如果存在模板,定义邮件模板中的内容,context的内容对应email.html的${project}占位的内容
            if (emailBean.getContext() != null && StringUtils.isNotBlank(emailBean.getTemplateName())) {
                String emailContent = templateEngine.process(emailBean.getTemplateName(), emailBean.getContext());
                helper.setText(emailContent, true);
            } else {
                helper.setText(emailBean.getText());
            }

            // 如果存在附件,定义邮件的附件
            if (emailBean.getAttachmentList() != null && !emailBean.getAttachmentList().isEmpty()) {
                for (String attachment : emailBean.getAttachmentList()) {
                    FileSystemResource file = new FileSystemResource(attachment);
                    if (StringUtils.isNotBlank(file.getFilename())) {
                        helper.addAttachment(file.getFilename(), file);
                    }

                }
            }
            mailSender.send(message);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
    }
}

6. 使用html发送验证码的页面模板

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <title>xiaoxiaofeng</title>
    <style>
        body {
            text-align: center;
            margin-left: auto;
            margin-right: auto;
        }
        #main {
            text-align: center;
        }
    </style>
</head>
<body>
<div id="main">
    <h3>欢迎使用 <span th:text="${project}"></span></h3>
    您的验证码是:<h2><span th:text="${code}"></span></h2>
    <span>本站由<a href="https://www.xiaoxiaofeng.com" target="_blank">笑小枫(https://www.xiaoxiaofeng.com)</a>提供技术支持</span>
</div>
</body>
</html>

7. 功能测试

import com.yang.demo.config.bean.EmailBean;
import com.yang.demo.util.EmailUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.context.Context;

import java.util.ArrayList;
import java.util.List;

@RestController
@AllArgsConstructor
@RequestMapping("/example")
@Api(tags = "实例演示-发送邮件")
public class TestSendEmailController {

    private final EmailUtil emailUtil;

    @PostMapping("/sendEmailText")
    @ApiOperation(value = "发送纯文本带附件的邮件")
    public void sendEmailText(String text) {
        List<String> attachmentList = new ArrayList<>();
        // 定义绝对路径
        attachmentList.add("E:\\雪山.jpg");
        // 定义相对路径
        attachmentList.add("src/main/resources/templates/email.html");

        EmailBean emailBean = EmailBean.builder()
                .text(text)
                .subject("QQ邮箱纯文本带附件信息发送")
                .toUser("2294397905@qq.com")
                .attachmentList(attachmentList)
                .build();

        emailUtil.sendEmail(emailBean);
    }

    @PostMapping("/sendEmailTemplate")
    @ApiOperation(value = "根据html模板发送验证码邮件")
    public void sendEmailTemplate() {
        Context context = new Context();
        context.setVariable("project", "给爱楼发验证码");
        // 生成6位数字验证码
        String code = String.valueOf((int) (Math.random() * 900000 + 100000));
        context.setVariable("code", code);
        EmailBean emailBean = EmailBean.builder()
                .context(context)
                .templateName("email")
                .subject("给爱楼发验证码")
                .toUser("2294397905@qq.com")
                .build();

        emailUtil.sendEmail(emailBean);
    }
}

### Java 使用 QQ邮箱 SMTP 发送邮件 #### 准备工作 为了能够成功地通过QQ邮箱发送邮件,需要先完成一些准备工作。确保已开启QQ邮箱的SMTP服务,并获取授权码用于程序认证[^1]。 #### Maven依赖引入 在项目的`pom.xml`文件中加入JavaMail API的支持库: ```xml <dependency> <groupId>com.sun.mail</groupId> <artifactId>javax.mail</artifactId> <version>1.6.2</version> </dependency> ``` #### 编写发送邮件的核心逻辑 下面是一个完整的示例代码片段展示如何利用JavaMailSender接口配合QQ邮箱的SMTP服务器来发送带附件的邮件: ```java import javax.activation.DataHandler; import javax.activation.DataSource; import javax.activation.FileDataSource; import javax.mail.*; import javax.mail.internet.InternetAddress; import javax.mail.internet.MimeBodyPart; import javax.mail.internet.MimeMessage; import javax.mail.internet.MimeMultipart; import java.util.Properties; public class SendEmailExample { public static void main(String[] args) throws MessagingException { String host = "smtp.qq.com"; final String user = "your_qq_number@qq.com"; // 替换成自己的qq号 final String password = "authorization_code"; // 授权码而非登录密码 Properties props = new Properties(); props.put("mail.smtp.host", host); props.put("mail.smtp.auth", "true"); props.put("mail.smtp.port", "465"); props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory"); Session session = Session.getDefaultInstance(props, new Authenticator() { protected PasswordAuthentication getPasswordAuthentication() { return new PasswordAuthentication(user,password); } }); Message message = new MimeMessage(session); try{ message.setFrom(new InternetAddress(user)); message.setRecipients(Message.RecipientType.TO, InternetAddress.parse("recipient@example.com")); // 收件人地址 message.setSubject("Test Email from Java App via QQ Mail"); // 创建消息部分 BodyPart messageBodyPart = new MimeBodyPart(); messageBodyPart.setText("This is a test email sent using Java and QQ mail."); Multipart multipart = new MimeMultipart(); multipart.addBodyPart(messageBodyPart); // 添加附件 messageBodyPart = new MimeBodyPart(); DataSource source = new FileDataSource("/path/to/file.txt"); messageBodyPart.setDataHandler(new DataHandler(source)); messageBodyPart.setFileName("file.txt"); multipart.addBodyPart(messageBodyPart); message.setContent(multipart ); Transport.send(message); System.out.println("Sent message successfully...."); }catch (MessagingException e){ throw new RuntimeException(e); } } } ``` 此段代码实现了创建并配置Session对象、构建邮件正文及附加文件的过程,最后调用Transport类的方法将构造好的邮件发出[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值