java发送邮件email实战

news2024/10/3 18:34:54

1.首先在项目中增加依赖,在pom文件中添加如下坐标

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

2.发邮件工具类如下

package com.example.demo.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.InputStreamSource;
import org.springframework.mail.javamail.JavaMailSenderImpl;
import org.springframework.mail.javamail.MimeMessageHelper;

import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.File;
import java.util.Properties;
import java.util.concurrent.locks.ReentrantLock;

@Slf4j
public class MailSender {
    private static volatile JavaMailSenderImpl sender;
    private static ReentrantLock lock = new ReentrantLock();

    private static void initServer() {
        JavaMailSenderImpl senderImpl = new JavaMailSenderImpl();
        // 我用的 163 邮箱
        senderImpl.setHost("smtp.163.com");
        senderImpl.setPort(25);
        senderImpl.setUsername("你的邮箱");
        senderImpl.setPassword("你的授权码");
        Properties prop = new Properties();
        prop.put("mail.smtp.auth", "true");
        prop.put("mail.smtp.timeout", "25000");
        prop.put("mail.smtp.ssl.enable", "false");
        senderImpl.setJavaMailProperties(prop);
        senderImpl.setDefaultEncoding("UTF-8");
        sender = senderImpl;
    }

    public static void sendHTML(String from, String[] recipients,
                                String subject, String content) {
        try {
            sendAttachment(new InternetAddress(from), recipients, null, subject, null, null, content);
        } catch (MessagingException e) {
            log.error("发送邮件异常,e:{}", e);
        }

    }

    /**
     * 发邮件
     *
     * @param from       发件人
     * @param recipients 收件人
     * @param cc         未知
     * @param subject    邮件主题
     * @param fileName   文件名称
     * @param file       文件
     * @param text       邮件正文
     */
    public static void sendAttachment(InternetAddress from, String[] recipients, String[] cc,
                                      String subject, String fileName, File file, String text) {
        initServer();
        MimeMessage mimeMessage = sender.createMimeMessage();
        MimeMessageHelper helper;
        try {
            helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            helper.setFrom(from);
            helper.setTo(recipients);
            if (cc != null && cc.length > 0) {
                helper.setCc(cc);
            }
            helper.setSubject(subject);
            if (fileName != null && file != null) {
                helper.addAttachment(fileName, file);
            }
            helper.setSubject(subject);
            helper.setText("", text);
            sender.send(mimeMessage);
        } catch (MessagingException e) {
            log.error("发送邮件异常,e:{}", e);
        }
    }

    /**
     * 带附件发送邮件
     *
     * @param from              发件人
     * @param recipients        收件人
     * @param cc                未知
     * @param subject           邮件主题
     * @param fileName          附件文件名
     * @param inputStreamSource 附件文件
     * @param text              邮件正文
     */
    public static void sendAttachment2(InternetAddress from, String[] recipients, String[] cc,
                                       String subject, String fileName, InputStreamSource inputStreamSource, String text) {
        initServer();
        MimeMessage mimeMessage = sender.createMimeMessage();
        MimeMessageHelper helper;
        try {
            System.getProperties().setProperty("mail.mime.splitlongparameters", "false");
            helper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
            helper.setFrom(from);
            helper.setTo(recipients);
            if (cc != null && cc.length > 0) {
                helper.setCc(cc);
            }
            helper.setSubject(subject);
            if (fileName != null) {
                helper.addAttachment(fileName, inputStreamSource);
            }
            helper.setText(text, true);
            sender.send(mimeMessage);
        } catch (Exception e) {
            log.error("发送邮件异常,e:{}", e);
        }
    }
}

3.发送邮件的服务端


import com.example.demo.utils.MailSender;
import lombok.extern.slf4j.Slf4j;
import org.springframework.mail.MailSendException;
import org.springframework.stereotype.Service;

@Service
@Slf4j
public class MailService {
    private String mailText = "xxx发来邮件";
    private String mailer = "接收邮箱";

    public boolean sendMail() {
        boolean accept = false;
        try {
            MailSender.sendHTML("发送邮箱", new String[]{mailer}, mailText, "巴拉拉小魔仙");

            accept = true;
        } catch (MailSendException mailSendException) {
            log.info("邮件发送失败", mailSendException);
            // 是否需要重试
        } catch (Exception e) {
            log.error("邮件发送失败,收件人:{}", mailer, e);
        }
        return accept;
    }
}

4.需要打开对应邮箱的smtp服务
并且获取到授权码
那网易邮箱举例子如下
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2186684.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安卓13默认使用大鼠标 与配置分析 andriod13默认使用大鼠标 与配置分析

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.彩蛋1.前言 android13里面的鼠标貌似比以前版本的鼠标小了,有些客户想要把这个鼠标改大。这个功能,android有现成的,就在这里,设置 =》无障碍 =》色彩和动画 =》 大号鼠标指针。 我们通过…

JavaWeb - 8 - 请求响应 分层解耦

请求响应 请求&#xff08;HttpServletRequest&#xff09;&#xff1a;获取请求数据 响应&#xff08;HttpServletResponse&#xff09;&#xff1a;设置响应数据 BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程…

【解决方案】关于 UART 接收数据时丢失数据的解决办法——环形缓冲存储区

文章目录 UART 通信丢失数据的常见原因总结串口&#xff08;UART&#xff09;数据丢失 Bug 的复现引入环形队列解决数据丢失问题总结 在嵌入式系统和物联网&#xff08;IoT&#xff09;设备中&#xff0c;串行通信是一种非常普遍且重要的数据传输方式。无论是通过 UART、RS-232…

【Godot4.3】基于中心点连线的矩形重叠检测

概述 这个方法是我自己想到的&#xff0c;经典的矩形重叠&#xff08;碰撞&#xff09;检测&#xff0c;是一段很复杂的逻辑判断&#xff0c;而根据两个矩形中点连线&#xff0c;与两个矩形宽度和高度之和一半的比较&#xff0c;就可以判断两个矩形是否重叠&#xff0c;并且能…

SQL进阶技巧:统计各时段观看直播的人数

目录 0 需求描述 1 数据准备 2 问题分析 3 小结 如果觉得本文对你有帮助&#xff0c;那么不妨也可以选择去看看我的博客专栏 &#xff0c;部分内容如下&#xff1a; 数字化建设通关指南 专栏 原价99&#xff0c;现在活动价39.9&#xff0c;十一国庆后将上升至59.9&#…

TransFormer 视频笔记

TransFormer BasicsAttention单头注意力 single head attentionQ&#xff1a; query 查寻矩阵 128*12288K key matrix 128*12288SoftMax 归一 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/19e3cf1ea28442eca60d5fc1303921f4.png)Value matrix 12288*12288 MLP Bas…

边缘概率 | 条件概率

关于什么是边缘概率分布和条件概率分布&#xff0c;在理论上&#xff0c;我自己也还没有理解&#xff0c;那么现在就根据我学习到的理解方式来记录一下&#xff0c;有错误指出&#xff0c;请大家指正&#xff01;&#xff01;&#xff01; 例如&#xff0c;一个箱子里有十个乒乓…

YOLO11改进|上采样篇|引入CARAFE上采样模块

目录 一、CARAFE上采样模块1.1CARAFE上采样模块介绍1.2CARAFE核心代码 五、添加MLCA注意力机制5.1STEP15.2STEP25.3STEP35.4STEP4 六、yaml文件与运行6.1yaml文件6.2运行成功截图 一、CARAFE上采样模块 1.1CARAFE上采样模块介绍 CARAFE 的主要思想&#xff1a; 将特征图的上采…

C# (.net6)实现Redis发布和订阅简单案例

概念&#xff1a; 在 .NET 6 中使用 Redis 的/订发布阅模式。发布/订阅&#xff08;Pub/Sub&#xff09;是 Redis 支持的一种消息传递模式&#xff0c;其中一个或多个发布者向一个或多个订阅者发送消息,Redis 客户端可以订阅任意数量的频道。 多个客户端可以订阅一个相同的频道…

【Java】—— 集合框架:Collection接口中的方法与迭代器(Iterator)

目录 1. 集合框架概述 1.1 生活中的容器 1.2 数组的特点与弊端 1.3 Java集合框架体系 1.4 集合的使用场景 2. Collection接口及方法 2.1 添加 2.2 判断 2.3 删除 2.4 其它 3. Iterator(迭代器)接口 3.1 Iterator接口 3.2 迭代器的执行原理 3.3 foreach循环 1. 集…

【rust/egui/android】在android中使用egui库

文章目录 说在前面AndroidStudio安装编译安装运行问题 说在前面 操作系统&#xff1a;windows11java版本&#xff1a;23android sdk版本&#xff1a;35android ndk版本&#xff1a;22rust版本&#xff1a; AndroidStudio安装 安装AndroidStudio是为了安装sdk、ndk&#xff0c;…

【Matlab绘图】从Excel导入表格并进行三维绘图

前言 今天手头上拿到一份论文的xlsx数据&#xff0c;要求使用MATLAB绘制进行三维图标坐标绘制。那么我们来看看如何使用如下数据进行绘图。 如上数据所示&#xff0c;数据是一个30行25列的数据&#xff0c;数据的内容是论文某项模型模拟的结果&#xff0c;我们希望把横坐标x取…

【ADC】ADC 系统失调和增益误差的校准方法

概述 本文学习于TI 高精度实验室课程&#xff0c;讨论如何计算增益和偏移误差并通过校准消除。首先对数据转换器系统进行偏移和增益误差计算&#xff0c;然后讨论几种校准此误差的方法。最后介绍一些难以校准的误差源。 文章目录 概述一、误差校准原理与方法二、实际应用问题举…

Linux进程概念二

我们利用fork函数来辅助我们讲解进程 首先认识两个调用进程地址的函数&#xff1a;getpid(),和getppid()&#xff0c;他们分别可以调用自己的pid和父进程的pid fork()可以在代码层面来创建子进程&#xff0c;一般而言&#xff0c;父进程fork出来的子进程与父进程代码和数据相…

【Docker】配置文件

问题 学习Docker期间会涉及到docker的很多配置文件&#xff0c;可能会涉及到的会有&#xff1a; /usr/lib/systemd/system/docker.service 【docker用于被systemd管理的配置文件】 /etc/systemd/system/docker.service.d【覆盖配置文件的存放处】 /etc/systemd/system/mul…

[Cocoa]_[初级]_[绘制文本如何设置断行效果]

场景 在开发Cocoa程序时&#xff0c;表格NSTableView是经常使用的控件。其基于View Base的视图单元格模式就是使用NSCell或其子类来控制每个单元格的呈现。当一个单元格里的文字过多时&#xff0c;需要截断超出宽度的文字&#xff0c;怎么实现&#xff1f; 说明 Cocoa下的文本…

【java数据结构】顺序表

【java数据结构】顺序表 一、了解List接口二、顺序表2.1 线性表2.2 顺序表2.2.1 顺序表接口的实现给数组增加新元素判断数组数据是否为满在 pos 位置新增元素判定是否包含某个元素查找某个元素对应的位置获取 pos 位置的元素给 pos 位置的元素设为 value删除第一次出现的关键字…

Manim:使用Python绘制数学动画

Manim是一个由3Blue1Brown的Grant Sanderson开发的开源框架&#xff0c;用户可以通过编写Python代码来创建数学动画&#xff0c;适用于教学、科研和科普宣传等多个领域。 Manim的核心功能之一是动画效果的创建和控制。它提供了多种动画效果&#xff0c;如创建、变换、淡入淡出…

分布式数据库知识详解

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

QT学习笔记3.1(建立项目、执行_建立第一个工程)

QT学习笔记3.1&#xff08;建立项目、执行_建立第一个工程) 建立第一个工程&#xff0c;使用widget模板 使用的版本是 Qt Creator 4.11.0 Based on Qt 5.14.0 (MSVC 2017, 32 bit) 1.选择Application-》QT Widget Application&#xff08;最常使用&#xff09; 2.项目保存位…