fastapi_mail发送邮件,邮件附件文件重命名

当fastapi_mail发送邮件的时候,想对附件的名称进行重命名
以下是fastapi_mail下的schemas.py的源码

import os
from enum import Enum
from mimetypes import MimeTypes
from typing import Dict, List, Optional, Unionfrom pydantic import BaseModel, EmailStr, validator
from starlette.datastructures import UploadFilefrom fastapi_mail.errors import WrongFileclass MultipartSubtypeEnum(Enum):"""for more info about Multipart subtypes visit:https://en.wikipedia.org/wiki/MIME#Multipart_subtypes"""mixed = 'mixed'digest = 'digest'alternative = 'alternative'related = 'related'report = 'report'signed = 'signed'encrypted = 'encrypted'form_data = 'form-data'mixed_replace = 'x-mixed-replace'byterange = 'byterange'class MessageSchema(BaseModel):recipients: List[EmailStr]attachments: List[Union[UploadFile, Dict, str, Tuple]] = []subject: str = ''body: Optional[Union[str, list]] = Nonetemplate_body: Optional[Union[list, dict]] = Nonehtml: Optional[Union[str, List, Dict]] = Nonecc: List[EmailStr] = []bcc: List[EmailStr] = []reply_to: List[EmailStr] = []charset: str = 'utf-8'subtype: Optional[str] = Nonemultipart_subtype: MultipartSubtypeEnum = MultipartSubtypeEnum.mixedheaders: Optional[Dict] = None@validator('attachments')def validate_file(cls, v):temp = []mime = MimeTypes()for file in v:file_meta = Noneif isinstance(file, dict):keys = file.keys()if 'file' not in keys:raise WrongFile('missing "file" key')file_meta = dict.copy(file)del file_meta['file']file = file['file']if isinstance(file, str):if os.path.isfile(file) and os.access(file, os.R_OK) and validate_path(file):mime_type = mime.guess_type(file)f = open(file, mode='rb')_, file_name = os.path.split(f.name)u = UploadFile(file_name, f, content_type=mime_type[0])temp.append((u, file_meta))else:raise WrongFile('incorrect file path for attachment or not readable')elif isinstance(file, UploadFile):temp.append((file, file_meta))else:raise WrongFile('attachments field type incorrect, must be UploadFile or path')return temp@validator('subtype')def validate_subtype(cls, value, values, config, field):"""Validate subtype field."""if values['template_body']:return 'html'return valueclass Config:arbitrary_types_allowed = Truedef validate_path(path):cur_dir = os.path.abspath(os.curdir)requested_path = os.path.abspath(os.path.relpath(path, start=cur_dir))common_prefix = os.path.commonprefix([requested_path, cur_dir])return common_prefix == cur_dir

需要修改源码,让函数调用的时候传入修改后的文件名

import os
from enum import Enum
from mimetypes import MimeTypes
from typing import Dict, List, Optional, Union, Tuplefrom pydantic import BaseModel, EmailStr, validator
from starlette.datastructures import UploadFilefrom fastapi_mail.errors import WrongFileclass MultipartSubtypeEnum(Enum):"""for more info about Multipart subtypes visit:https://en.wikipedia.org/wiki/MIME#Multipart_subtypes"""mixed = 'mixed'digest = 'digest'alternative = 'alternative'related = 'related'report = 'report'signed = 'signed'encrypted = 'encrypted'form_data = 'form-data'mixed_replace = 'x-mixed-replace'byterange = 'byterange'class MessageSchema(BaseModel):recipients: List[EmailStr]attachments: List[Union[UploadFile, Dict, str, Tuple]] = []subject: str = ''body: Optional[Union[str, list]] = Nonetemplate_body: Optional[Union[list, dict]] = Nonehtml: Optional[Union[str, List, Dict]] = Nonecc: List[EmailStr] = []bcc: List[EmailStr] = []reply_to: List[EmailStr] = []charset: str = 'utf-8'subtype: Optional[str] = Nonemultipart_subtype: MultipartSubtypeEnum = MultipartSubtypeEnum.mixedheaders: Optional[Dict] = None@validator('attachments')def validate_file(cls, v):temp = []mime = MimeTypes()for file in v:file_meta = Noneif isinstance(file, dict):keys = file.keys()if 'file' not in keys:raise WrongFile('missing "file" key')file_meta = dict.copy(file)del file_meta['file']file = file['file']if isinstance(file, str):if os.path.isfile(file) and os.access(file, os.R_OK) and validate_path(file):mime_type = mime.guess_type(file)f = open(file, mode='rb')_, file_name = os.path.split(f.name)u = UploadFile(file_name, f, content_type=mime_type[0])temp.append((u, file_meta))else:raise WrongFile('incorrect file path for attachment or not readable')if isinstance(file, tuple):file, file_name = fileif os.path.isfile(file) and os.access(file, os.R_OK) and validate_path(file):mime_type = mime.guess_type(file)f = open(file, mode='rb')_, file_name = os.path.split(file_name)u = UploadFile(file_name, f, content_type=mime_type[0])temp.append((u, file_meta))else:raise WrongFile('incorrect file path for attachment or not readable')elif isinstance(file, UploadFile):temp.append((file, file_meta))else:raise WrongFile('attachments field type incorrect, must be UploadFile or path')return temp@validator('subtype')def validate_subtype(cls, value, values, config, field):"""Validate subtype field."""if values['template_body']:return 'html'return valueclass Config:arbitrary_types_allowed = Truedef validate_path(path):cur_dir = os.path.abspath(os.curdir)requested_path = os.path.abspath(os.path.relpath(path, start=cur_dir))common_prefix = os.path.commonprefix([requested_path, cur_dir])return common_prefix == cur_dir

这里增加对元组的验证,元组第一个参数是文件路径,第二个参数是修改后的文件名称
这是请求的代码

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

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

相关文章

HarmonyOS | UI开发 (一) | 基础组件(Text/Span,TextInput/TextArea,Button,Image)

文章目录 前言一、基础组件1.1.Text的概述1.2.Text的创建方式- string字符串创建- 引用Resource资源 1.3.Text自定义文本样式- 通过textAlign属性设置文本对齐样式- 通过textOverflow属性控制文本超长处理- 通过lineHeight属性设置文本行高- 通过copyOption属性设置文本是否可复…

python大数据分析游戏行业中的 Apache Kafka:用例 + 架构!

python大数据分析游戏行业中的 Apache Kafka:用例 架构! 这篇博文探讨了使用 Apache Kafka 的事件流如何提供可扩展、可靠且高效的基础设施,让游戏玩家开心并让游戏公司取得成功。讨论了游戏行业中的各种用例和架构,包括在线和移…

C++初阶篇----类与对象中卷

目录 引言1. 构造函数1.1概念1.2 特性 2. 析构函数2.1 概念2.2 特性 3. 拷贝构造函数3.1 概念3.2特征 4. 赋值运算符重载4.1 运算符重载4.2 赋值运算符重载4.3 前置和后置重载 5.日期类的实现6.const成员7.取地址及const取地址操作符重载 引言 当一个类既没有成员变量又没有成…

汉诺塔问题(C语言)

一:问题 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从…

wordpress相册gallery的几种不同调用方式

常规方式调用 if ( $gallery get_post_gallery( get_the_ID() ) ) :echo $gallery; endif; 调用循环中的所有图片并可以自字义样式 if ( $gallery get_post_gallery( get_the_ID(), false ) ) :foreach ( $gallery[src] AS $src ) {echo <img src" . $src . "…

QVector和QString互相转换

我的画图项目需要读写自定义虚线样式 {...comboBox_penStyle new QComboBox;QStringList SL_penStyle;SL_penStyle << "______" << "----------" << ".........." << "-.-.-.-.-." << "-..-..-..…

【OJ】日期差值与日期累加

个人主页 &#xff1a; zxctscl 如有转载请先通知 文章目录 1. KY111 日期差值1.1 题目分析1.2 代码 2. KY258 日期累加2.1 题目分析2.2 代码 1. KY111 日期差值 1.1 题目分析 日期之间比较可能会出现给的两个年月日都不相同&#xff0c;这个就不好作差&#xff0c;每个月给的…

LeetCode每日一题 二叉树的最大深度(二叉树)

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1,nul…

VUE:key属性的作用

在 Vue.js 中&#xff0c;key属性的主要作用是帮助 Vue 在进行 DOM 更新时&#xff0c;能够更准确地识别哪些节点可以复用。 当key值发生变化时&#xff0c;Vue 会执行以下步骤&#xff1a; 1.查找旧节点&#xff1a;Vue 会查找虚拟 DOM 中具有旧key值的节点。 2.匹配新节点…

Kubernetes编排系统:实现云原生应用的自动化部署与管理

随着云计算和容器技术的日益普及,如何高效、自动化地部署和管理应用成为了企业面临的重要挑战。Kubernetes,作为一个开源的容器编排系统,凭借其强大的功能、灵活性和可扩展性,逐渐成为了业界的宠儿。本文将首先简要介绍Kubernetes编排系统的基本概念,然后详细阐述其核心组…

前端知识点、技巧、webpack、性能优化(持续更新~)

1、 请求太多 页面加载慢 &#xff08;webpack性能优化&#xff09; 可以把 图片转换成 base64 放在src里面 减少服务器请求 但是图片会稍微大一点点 以上的方法不需要一个一个自己转化 可以在webpack 进行 性能优化 &#xff08;官网有详细描述&#xff09;

【详识C语言】自定义类型之一:结构体

本文重点 结构体 结构体类型的声明 结构的自引用 结构体变量的定义和初始化 结构体内存对齐 结构体传参 结构体实现位段&#xff08;位段的填充&可移植性&#xff09; 结构体 结构体的声明 结构的基础知识 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个…

nohup 命令

1. nohup 是 no hang up 的缩写&#xff0c;就是不挂断的意思 如果你正在运行一个进程&#xff0c;而且你觉得在退出帐户时该进程还不会结束&#xff0c;那么可以使用nohup命令。 该命令可以在你退出帐户/关闭终端之后继续运行相应的进程。 2. nohup和&的区别 nohup …

在 SpringBoot3 中使用 Mybatis-Plus 报错

在 SpringBoot3 中使用 Mybatis-Plus 报错 Property ‘sqlSessionFactory’ or ‘sqlSessionTemplate’ are required Caused by: java.lang.IllegalArgumentException: Property sqlSessionFactory or sqlSessionTemplate are requiredat org.springframework.util.Assert.no…

Vue中有哪些优化性能的方法?

Vue是一款流行的JavaScript框架&#xff0c;用于构建交互性强的Web应用程序。在前端开发中&#xff0c;性能优化是一个至关重要的方面&#xff0c;尤其是当应用程序规模变大时。Vue提供了许多优化性能的方法&#xff0c;可以帮助开发人员提升应用程序的性能&#xff0c;从而提升…

管理心理--程序员如何选择职业赛道

不小心看到了这个活动话题&#xff0c;本人前后带过三四百程序员&#xff0c;并成功为不少程序员指明了方向&#xff0c;不少程序员到现在还经常约我吃饭表示感谢。对这个话题应该是有比较深的感触。 一、程序员方向本身的赛道。 一开始呆的都是大厂&#xff0c;程序员一般都…

成员静态函数和回调函数的灵活应用

回调函数与类静态函数 使用typedey定义函数指针使用 std::function<void(void*)> 包装 定义函数回调函数有两种方法 使用typedey定义函数指针 #typedef int (*func)(void*);使用 std::function<void(void*)> 包装

用spark读取及存储数据

读取数据 data spark.sql("""select * from temp.tables""") data.show(3)# 转成pandas方式 # df data.toPandas() # df.head(3)存储数据 table "temp.new_tables" data.write.format("hive").mode("overwrite&qu…

Leetcode刷题(三十七)

全排列II&#xff08;Medium&#xff09; 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。示例 1&#xff1a;输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]] 示例 2&#xff1a;输入&#xff1a;nums [1,2…

鸿蒙NEXT开发实战:【网络管理-数据请求】

概述 本示例仿postman输入API接口地址&#xff0c;获取相应数据&#xff0c;介绍数据请求接口的用法。 样例展示 基础信息 Http 介绍 本示例通过[ohos.net.http]等接口&#xff0c;实现了根据URL地址和相关配置项发起http请求的功能。 效果预览 首页结果页 使用说明 1.…