IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Java 邮件发送 -> 正文阅读

[网络协议]Java 邮件发送

简介

在日常的开发中,在Java项目中调用邮件服务,进行邮件的发送的场景是比较常见的,本篇将介绍Java中邮件的相关使用

发送邮件配置类

发送邮件,肯定是需要相关的邮件服务配置,我们将其进行一个封装

@Data
@Builder
public class EmailConfig {

    private String host;
    private String port;
    private String user;
    private String password;
}

如上所示,常用的配置是主机路径、端口、用户名和密码,这些东西基本上在项目中是一个通用的配置,自行获取

邮件发送服务

下面是目前常用的一个通用封装,感觉应该是能覆盖目前大部分的使用场景

import com.sun.mail.util.MailSSLSocketFactory;
import lombok.SneakyThrows;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.util.ByteArrayDataSource;
import java.nio.charset.StandardCharsets;
import java.security.GeneralSecurityException;
import java.util.Calendar;
import java.util.Date;
import java.util.Map;
import java.util.Properties;

public class EmailService {

    private final EmailConfig config;
    private final Session session;

    @SneakyThrows
    public EmailWarnService(final EmailWarnConfig emailSendConfig) {
        config = emailSendConfig;

        Properties props = new Properties();
        //设置邮件地址
        props.setProperty("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", config.getHost());
        //开启认证
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", config.getPort());
        //使用SSL,企业邮箱必需!
        //开启安全协议
        MailSSLSocketFactory sf = new MailSSLSocketFactory();
        sf.setTrustAllHosts(true);
        props.put("mail.smtp.ssl.enable", "true");
        props.put("mail.smtp.ssl.socketFactory", sf);

        //获取Session对象
        session = Session.getDefaultInstance(props, new Authenticator() {
            //此访求返回用户和密码的对象
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                //邮箱账号,密码
                return new PasswordAuthentication(config.getUser(),
                        config.getPassword());
            }
        });

    }

    /**
     * 发送邮件
     * @param receiveAddress 收件人地址,多个地址之间用英文逗号分隔
     * @param title 邮件标题
     * @param message 邮件正文内容
     * @param attachments 邮件附件列表 key 是附件名称 value是附件内容
     */
    @SneakyThrows
    public void sendsMessage(String receiveAddress, String title, String message, Map<String, String> attachments) {
        try {
            // 根据session创建一个邮件消息
            Message mailMessage = new MimeMessage(session);
            // 创建邮件发送者地址
            Address from = new InternetAddress(config.getUser());
            // 设置邮件消息的发送者
            mailMessage.setFrom(from);

            String[] recipientList = receiveAddress.split(",");
            InternetAddress[] recipientAddress = new InternetAddress[recipientList.length];
            int counter = 0;
            for (String recipient : recipientList) {
                recipientAddress[counter] = new InternetAddress(recipient.trim());
                counter++;
            }
            mailMessage.setRecipients(Message.RecipientType.TO, recipientAddress);

            // 设置邮件消息的主题
            mailMessage.setSubject(title);
            // 设置邮件消息发送的时间
            mailMessage.setSentDate(Calendar.getInstance().getTime());

            // MimeMultipart类是一个容器类,包含MimeBodyPart类型的对象
            Multipart multiPart = new MimeMultipart();
            // 创建一个包含HTML内容的MimeBodyPart
            BodyPart bodyPart = new MimeBodyPart();
            // 设置html邮件消息内容
            bodyPart.setContent(message, "text/html; charset=utf-8");
            multiPart.addBodyPart(bodyPart);

            //添加附件
            for (String fileName: attachments.keySet()) {
                byte[] bytes = attachments.get(fileName).getBytes(StandardCharsets.UTF_8);
                ByteArrayDataSource barrds = new ByteArrayDataSource(bytes, "application/octet-stream");
                bodyPart = new MimeBodyPart();
                //得到附件本身并放入BodyPart
                bodyPart.setDataHandler(new DataHandler(barrds));
                //得到文件名并编码(防止中文文件名乱码)同样放入BodyPart
                bodyPart.setFileName(MimeUtility.encodeText(fileName));
                multiPart.addBodyPart(bodyPart);
            }

            // 设置邮件消息的主要内容
            mailMessage.setContent(multiPart);
            // 发送邮件
            Transport.send(mailMessage);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

如上所示,在构造函数中进行了连接相关的初始化,后面基本上是复用这个session,目前使用下来基本正常

下面的发送函数是一个通用的,可以发送给多个邮箱和附件

附件可能需要比较少,但有的话,还是挺关键的,这里使用一个map结构,key是文件名,value是附件内容,使其能进行多个附件的发送

在使用过程中需要注意大小,避免一些数据量比较大的操作

邮件发送的使用

目前使用下来的最佳实践还是将邮件模板保存到数据库中,使用时进行加载,然后替换其中的占位符之类的比较方便

如下,我们定义了一个邮件模板:

【xxx邮件】xxxx <br><br>时间:%s <br><br> %s。(具体查看附件)

其中我们将时间和正文内容设置为占位符,后面的使用,对应的进行填充即可

参考链接

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-05-01 16:06:29  更:2022-05-01 16:07:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 2:56:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码