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

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

import os
from enum import Enum
from mimetypes import MimeTypes
from typing import Dict, List, Optional, Union

from pydantic import BaseModel, EmailStr, validator
from starlette.datastructures import UploadFile

from fastapi_mail.errors import WrongFile


class 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]] = None
    template_body: Optional[Union[list, dict]] = None
    html: Optional[Union[str, List, Dict]] = None
    cc: List[EmailStr] = []
    bcc: List[EmailStr] = []
    reply_to: List[EmailStr] = []
    charset: str = 'utf-8'
    subtype: Optional[str] = None
    multipart_subtype: MultipartSubtypeEnum = MultipartSubtypeEnum.mixed
    headers: Optional[Dict] = None

    @validator('attachments')
    def validate_file(cls, v):
        temp = []
        mime = MimeTypes()

        for file in v:
            file_meta = None
            if 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 value

    class Config:
        arbitrary_types_allowed = True


def 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, Tuple

from pydantic import BaseModel, EmailStr, validator
from starlette.datastructures import UploadFile

from fastapi_mail.errors import WrongFile


class 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]] = None
    template_body: Optional[Union[list, dict]] = None
    html: Optional[Union[str, List, Dict]] = None
    cc: List[EmailStr] = []
    bcc: List[EmailStr] = []
    reply_to: List[EmailStr] = []
    charset: str = 'utf-8'
    subtype: Optional[str] = None
    multipart_subtype: MultipartSubtypeEnum = MultipartSubtypeEnum.mixed
    headers: Optional[Dict] = None

    @validator('attachments')
    def validate_file(cls, v):
        temp = []
        mime = MimeTypes()

        for file in v:
            file_meta = None
            if 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 = file
                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(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 value

    class Config:
        arbitrary_types_allowed = True


def 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

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

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如何监测文件的变化并自动发送邮件呢?我们可以借助一些工具来实现这一功能。 首先,我们需要选择一个能够监测文件变化的工具。在Windows操作系统中,我们可以使用PowerShell命令或者使用第三方工具实现,如FreeFileSync或Karen's Replicator等。在Linux系统下,我们可以使用inotify工具。 接下来,我们需要配置邮件服务器信息以及发送邮件的脚本。在配置好邮件服务器信息之后,我们可以通过PowerShell命令或者Python脚本来实现自动发送邮件。 在设置监测文件并自动发送邮件之前,我们需要考虑一些注意事项。例如,在选择监测文件的时候要确保该文件经常发生变化,同时要选择监测文件的合适时间间隔。此外,在设置邮件发送脚本的时候,要确保邮件的安全性,比如使用SSL或TLS加密协议等。 总之,通过选择合适的监测文件工具、设置邮件服务器信息、编写自动发送邮件的脚本等步骤,我们可以轻松实现监测文件变化并自动发送邮件的功能,为我们的工作提供更多的便利。 ### 回答2: 监测文件变化自动发送邮件是一种非常方便的方法,可以实时地监测文件的修改情况,保证文件的安全性,避免误操作和丢失。 为了实现这一功能,我们可以使用一些常用的工具或者编程语言,如Linux环境下的inotify工具,或Python语言中的Watchdog库。通过简单的配置,这些工具可以自动监测所需文件的变化,如文件的编辑、删除和命名等操作,并在检测到变化时自动触发指定的操作。 其中,发送邮件是常见的操作之一。我们可以使用SMTP协议连接到指定的邮件服务器,发送邮件到指定的邮箱,同时在邮件正文中添加所需的内容,如修改详情、变化时间等等,方便我们随时随地了解文件的变化情况。 然而,需要注意的是,在实际应用中,我们还需要考虑一些安全性问题,如邮件的加密传输、权限的控制等等,以确保数据的安全性和保密性。 总之,监测文件变化自动发送邮件是一项非常实用的功能,不仅可以提高工作效率和数据的安全性,还能为IT工作者带来更好的工作体验。 ### 回答3: 在软件开发和信息技术行业中,经常需要对代码和文件进行监测,以确保它们在被修改和更新后能够正常运行。对于程序员和系统管理员来说,能够及时了解这些变化非常要,因此监测文件变化自动发送邮件的功能非常有用。 为实现此功能,可以使用一些第三方工具,如:inotify-tools, md5sum等。 这些工具可以通过监测文件系统的事件,来检测到文件的变化。当系统检测到文件有修改,就会执行一个shell脚本,脚本会通过邮件客户端接口来发送邮件通知。邮件内容通常包括被修改文件的详细信息,如文件名、路径、时间戳和修改者等。 使用此功能可以让开发人员和系统管理员能够及时了解文件的变化,把握系统的变更情况。这个功能可以适用于一些紧急项目,要求及时响应问题的环境中,可以减少疏漏和人为失误,提高工作效率,确保项目进展和数据的安全性。 总之,监测文件变化自动发送邮件是一项非常有用的功能,对于程序员和系统管理员来说都非常实用,可以方便地了解系统的变化情况,提高工作效率和数据的安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值