Java发送附件到邮箱

2023-10-31

1.配置

导入依赖以及在yml中写好邮箱的配置信息

<dependency>

    <groupId>javax.mail</groupId>

    <artifactId>mail</artifactId>

    <version>1.4.7</version>

</dependency>
 mail:
    host: smtp.exmail.qq.com   //QQ 邮件服务器 
    username: 用户名
    password: 密码
    properties.mail.smtp.port: 465
    from: 发件人邮箱
    properties.mail.smtp.starttls.enable: true
    properties.mail.smtp.starttls.required: true
    properties.mail.smtp.ssl.enable: true
    default-encoding: utf-8

2.获取自己的附件

这一步根据自己的业务代码获取需要发送邮件的附件文件,(流的格式)

ByteArrayOutputStream byteArrayOutputStream = fileUtilService.getFile(fileName);
//将获取的文件流转换为邮件service方法的参数ByteArrayInputStream格式
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());

3.文件名参数拼接

//发送的文件名为:`附件名称-20220101.pdf`
Calendar calendar = Calendar.getInstance();
StringBuilder timeString = new StringBuilder();
        timeString.append(“附件名称”);
        timeString.append("-");
        timeString.append(calendar.get(Calendar.YEAR));
        timeString.append(calendar.get(Calendar.MONTH)+1);
        timeString.append(calendar.get(Calendar.DATE));
        timeString.append(".pdf");

4.调用emailService发送邮件的方法

// 参数分别为: 发送邮箱,邮件主题,邮件正文,邮件名称,附件流
Boolean isSuccess = emailService.sendAttachmentsMail(getEmail(), EMAIL_SUBJECT,
        EMAIL_CONTENT_NAMEPREFIX + name + EMAIL_CONTENT,
        timeString.toString(), byteArrayResource);

5.发送邮箱业务层代码Impl

@Service
@Log
public class EmailServiceImpl implements EmailService,EmailRpcService {

    //静态代码块用于设置附件名编码和长度自动切割的问题,可以解决文件名后缀错误(***.bin)问题
    static {
        System.setProperty("mail.mime.splitlongparameters", "false");
        System.setProperty("mail.mime.charset", "UTF-8");
    }
    @Autowired
    private JavaMailSender javaMailSender;

    //value注解读取yml文件的邮箱配置信息
    @Value("${spring.mail.from}")
    private String from;
    @Value("${spring.mail.host}")
    private String host;
    @Value("${spring.mail.username}")
    private String username;
    @Value("${spring.mail.password}")
    private String password;
    @Value("${spring.mail.properties.mail.smtp.port}")
    private String port;

    @Override
    public void sendSimpleMail(String to, String subject, String content) {

    }

    @Override
    public void sendHtmlMail(String to, String subject, String content) {

    }

    @Override
    public Boolean sendAttachmentsMail(String to, String subject, String content,String fileName ,ByteArrayResource byteArrayResource) {
            log.info("==========================发送邮件==========================");
        MimeMessage message = javaMailSender.createMimeMessage();
        MimeMessageHelper messageHelper;
        try {
            messageHelper = new MimeMessageHelper(message,true,"utf-8");
            messageHelper.setFrom(from);
            messageHelper.setTo(to);
            messageHelper.setSubject(subject);
            messageHelper.setText(content,true);

filePath.substring(filePath.lastIndexOf(File.separator))
                messageHelper.addAttachment(MimeUtility.encodeText(fileName,"utf-8","B"),byteArrayResource);
            javaMailSender.send(message);
            log.info("邮件发送成功!");
            return true;
        } catch (MessagingException e) {
            log.info("发送失败:"+e);
            return false;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            log.info("发送失败:"+e);
            return false;
        }
    }

6.注意在emailService上的static静态代码块里的内容,这个是设置文件名编码和文件名分割内容的设置,挺必要的,因为我一开始写出来的时候,自己测试没有出现什么问题,当时也没有加这两行设置,但是测试人员测试的时候发现,文件名可能会因为文件名过长或者存在某些特殊字符使得最后邮件内附件的文件名不完全正确,后缀变成了乱码+.bin,造成文件打不开的原因。。。加上这两行配置代码后功能实现就正常了!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java发送附件到邮箱 的相关文章

  • Hibernate注解放置问题

    我有一个我认为很简单的问题 我见过两种方式的例子 问题是 为什么我不能将注释放在字段上 让我举一个例子 Entity Table name widget public class Widget private Integer id Id G
  • 插入最大日期(独立于数据库)

    在我的本地设置中 我使用一个简单的 H2 数据库 托管 解决方案将有另一个 类似但不相同 数据库 我需要将最大可能日期插入到日期时间列中 我尝试使用 Instant MAX 但是 这会导致列中出现 169104626 12 11 20 08
  • 如何创建一个显示 Spinners 的 x 和 y 值的表格?

    我想创建一个位于图表右侧的表格 其中显示 2 列 x 和 y 值已输入到xSpin and ySpin旋转器 我已经画了一张我想要桌子放置的位置的图 我尝试过在网格窗格布局中使用文本框来创建表格并将值直接输入到文本框网格中 但是我无法将它们
  • 使用 JPA Criteria API 进行分页的总行数

    我正在系统中为实体实现 高级搜索 功能 以便用户可以使用该实体的属性上的多个条件 eq ne gt lt 等 来搜索该实体 我正在使用 JPA 的 Criteria API 动态生成 Criteria 查询 然后使用setFirstResu
  • 这个函数(for循环)空间复杂度是O(1)还是O(n)?

    public void check 10 for string i list Integer a hashtable get i if a gt 10 hashtable remove i 这是 O 1 还是 O n 我猜测 O n 但不是
  • SAML 服务提供商 Spring Security

    当使用预先配置的服务提供者元数据时 在 Spring Security 中 是否应该有 2 个用于扩展元数据委托的 bean 定义 一份用于 IDP 元数据 一份用于 SP 元数据
  • Java:如何从转义的 URL 获取文件?

    我收到了一个定位本地文件的 URL 事实上我收到的 URL 不在我的控制范围内 URL 按照 RFC2396 中的定义进行有效转义 如何将其转换为 Java File 对象 有趣的是 URL getFile 方法返回一个字符串 而不是文件
  • Android在排序列表时忽略大小写

    我有一个名为路径的列表 我目前正在使用以下代码对字符串进行排序 java util Collections sort path 这工作正常 它对我的 列表进行排序 但是它以不同的方式处理第一个字母的情况 即它用大写字母对列表进行排序 然后用
  • java中如何连接字符串

    这是我的字符串连接代码 StringSecret java public class StringSecret public static void main String args String s new String abc s co
  • 如何在不超过最大值的情况下增加变量?

    我正在为学校开发一个简单的视频游戏程序 我创建了一个方法 如果调用该方法 玩家将获得 15 点生命值 我必须将生命值保持在最大值 100 并且由于我目前的编程能力有限 我正在做这样的事情 public void getHealed if h
  • Hibernate.createBlob() 方法从 Hibernate 4.0.1 开始已弃用,并移至 Hibernate.getLobCreator(Session session).createBlob()

    Method Hibernate createBlob 已弃用自休眠4 0 1并搬到Hibernate getLobCreator Session session createBlob 任何解决方案我应该在方法内传递什么getLobCrea
  • 使用 AES SecretKey 的 Java KeyStore setEntry()

    我目前正在 Java 中开发一个密钥处理类 特别是使用 KeyStore 我正在尝试使用 AES 实例生成 SecretKey 然后使用 setEntry 方法将其放入 KeyStore 中 我已经包含了代码的相关部分 The KS Obj
  • 将 SignedHash 插入 PDF 中以进行外部签名过程 -workingSample

    遵循电子书第 4 3 3 节 PDF 文档的数字签名 https jira nuxeo com secure attachment 49931 digitalsignatures20130304 pdf 我正在尝试创建一个工作示例 其中 客
  • 如何在JSTL中调​​用java方法? [复制]

    这个问题在这里已经有答案了 这可能是重复的问题 我只想调用不是 getter 或 setter 方法的方法例如 xyz 类的 makeCall someObj stringvalue Java类 Class XYZ public Strin
  • 我可以创建自定义 java.* 包吗?

    我可以创建一个与预定义包同名的自己的包吗在Java中 比如java lang 如果是这样 结果会怎样 这难道不能让我访问该包的受保护的成员 如果不是 是什么阻止我这样做 No java lang被禁止 安全管理器不允许 自定义 类java
  • 无法在 Intellij 上创建 Groove 脚本 - @NotNull 参数的参数

    我正在尝试开始学习 Groovy 以便在 JIRA 上使用 ScriptRunner 执行 API 调用 所以我从基础开始 我的问题是我什至无法使用 Intellij 创建 Groovy 脚本 在项目创建时它选择Groovy并选择项目SDK
  • 为什么这个作业不起作用?

    我有课Results which extends ArrayList
  • 在 RESTful Web 服务中实现注销

    我正在开发一个需要注销服务的移动应用程序 登录服务是通过数据库验证来完成的 现在我陷入了注销状态 退一步 您没有提供有关如何在应用程序中执行身份验证的详细信息 并且很难猜测您在做什么 但是 需要注意的是 在 REST 应用程序中 不能有会话
  • GUI Java 程序 - 绘图程序

    我一直试图找出我的代码有什么问题 这个想法是创建一个小的 Paint 程序并具有红色 绿色 蓝色和透明按钮 我拥有我能想到的让它工作的一切 但无法弄清楚代码有什么问题 该程序打开 然后立即关闭 import java awt import
  • 如何修复:“无法解析类型 java.lang.CharSequence。它是从所需的 .class 文件间接引用的”消息? [复制]

    这个问题在这里已经有答案了 我正在尝试使用这个字符串 amountStr amountStr replace replace replace 但我收到一条错误消息 我知道我收到的错误消息是因为我刚刚发布的字符串已过时 所以我想知道该字符串的

随机推荐

  • [靶场] SQLi-Labs Less62-Less69

    66 Less62 请求方式 注入方式 备注 GET 盲注 130次语句以内完成 分析 我们需要指定challenges数据库中表名 表名为10个字符 包含数字和小写字母 还需要知道表中的字段名 字段名为secret XX XX为4个字符
  • LDO的原理以及重要指标

    http t csdn cn YaR0G 本文告诉你三件事 LDO的基本原理 LDO都有哪些参数 有什么意义 选型时的注意事项 1 LDO基本原理 LDO是Low Dropout Regulator的缩写 意思是低压差线性稳压器 低压差 是
  • 深度学习中的常用八种卷积运算简介

    参考资料 https towardsdatascience com a comprehensive introduction to different types of convolutions in deep learning 66928
  • iOS 14 自定义画中画悬浮窗 Custom AVPictureInPictureController 实现方案

    iOS 14 基于 AVPictureInPictureController 实现自定义画中画 涵盖所有功能与难点 市面上的各种悬浮钟和提词器的原理都是基于此 Demo源码在文末 使用 iOS 画中画的要求 真机 不能使用模拟器 iOS 1
  • 重构Webpack系列之二 ---- 入口起点

    重构Webpack系列之二 入口起点 一 概念 入口起点 entry point 指示Webpack应该使用哪个模块 来作为构建其内部依赖图的开始 进入入口起点后 Webpack会找出哪些模块和库是跟入口起点 直接或间接 有依赖的关系 默认
  • 开源云原生与行业应用

    ChinaOSC 2022开源云原生与行业应用论坛将于2022年8月21日13 30 17 15在陕西省西安高新国际会议中心召开 本论坛将邀请多位知名开源云原生领域的贡献者 实践者 分享和探讨开源云原生赋能产品迭代 行业应用创新的最佳实践
  • json格式请求http

    例子 JsonObject response postJsonData url gson toJson applyInfo applyInfo 一个java对象 发送 post 请求 param url 地址 return link Jso
  • Python---数据清洗

    首先导入数据 并读取前5行 然后处理店铺数据 清洗comment字段 先筛选出有 条 字的评论 再用spilt分割数据 提取评论条数后转换数据类型 用的是astype转换 并查看前5行 清洗其他字段也是一样的处理 比如清洗人均价格这个字段
  • el-table选中数据勾选状态不清空的做法&&监听拿到勾选的所有数据

    1 el table结合el pagination 在翻页之后再返回勾选的数据状态会消失 解决办法
  • RocketMQ Bug修复记录

    文章目录 1 Bug详情及解决 1 1 Bug 来龙去脉 1 2 验证这真的是一个BUG 1 2 1 BrokerFixedThreadPoolExecutor 1 2 2 FutureTaskExt 1 2 3 RegisterBroke
  • Ubuntu下通过CMake文件编译CUDA+OpenCV代码操作步骤

    在 CUDA Test 工程中 CUDA测试代码之前仅支持在Windows10 VS2013编译 今天在Ubuntu 14 04下写了一个CMakeLists txt文件 支持在Linux下也可以通过CMake编译CUDA Test工程 C
  • IELTS listening lesson from Simon

    IELTS listening lesson from Simon Video Lines Recorded by Marshal Zheng 文章目录 IELTS listening lesson from Simon overall s
  • Python实验及注意点总结

    第一次上机 实验一 随机生成两个小于100的整数 打印其中一个数的数据类型和存储地址 求这两个数的和 差 积 商 幂运算 import random x random randint 1 100 y random randint 1 100
  • L2TP或者PPTP拨号后只能访问远端内网而无法访问Internet的原因及解决办法

    原理 PPTP L2TP拨号成功后 由于修改了主机的缺省路由 导致访问外网的数据都通过VPN隧道转发 也就是访问远端局域网以及外网的数据都发送给了TL ER6110 6120 从而只能访问远端内网 而不能访问Internet 以 win11
  • Win10相机端无法启动解决方案

    Win10相机端无法启动解决方案 背景 设备驱动正常以及没有被其他应用占用相机端的情况下 偶然发现一个问题 利用第三方软件如微信 QQ以及VS结合Opencv库都可以打开系统摄像头 但是手动打开摄像头总是失败 返回错误码0xA00F4246
  • 前端系列——vue2+高德地图web端开发(使用和引入)

    vue2 高德地图web端开发 使用和引入 前言 基础 准备工作 高德地图的个人开发者注册 高德api网址 1 点击进行注册 2 注册完之后进入控制台 3 创建新应用 4 添加 高德 2 0 新增 创建vue2的项目 npm 引入高德 官方
  • pytorch BUG :.grad=NONE? pytorch参数的使用

    在实验中 输出发现网络的某个新增的参数不更新 在输出 tensor grad NONE 然后查找资料进行修改输出从 tensor 0 9925 device cuda 0 grad fn
  • 面试题目搜集(3)

    本博客的 面试题目搜集系列不错 1 面试题目搜集1 2 面试题目搜集2 3 面试题目搜集3 4 面试题目搜集4 5 面试题目搜集5 6 面试题目搜集6 1 有这样一个数组A 大小为n 相邻元素差的绝对值都是1 如 A 4 5 6 5 6 7
  • R-基础:数据框操作

    title dataframe author intro date 2022 1 20 output html document knitr opts chunk set echo TRUE R基础 在学习中分享 在分享中学习 R中数据框是
  • Java发送附件到邮箱

    1 配置 导入依赖以及在yml中写好邮箱的配置信息