You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Symfony 6.1:如何不保存文件直接作为邮件附件发送

在Symfony 6.1中直接将上传文件作为邮件附件发送(跳过本地保存)

完全可以跳过本地保存步骤,直接利用上传的UploadedFile对象生成邮件附件,无需先将文件写入服务器磁盘。以下是具体实现方法:

核心实现思路

Symfony的Mailer组件支持通过DataPart或FilePart类直接从上传文件的内存内容创建附件,不需要依赖本地文件路径。

1. 获取表单提交的上传文件

表单提交后,从表单字段中取出UploadedFile实例:

/** @var \Symfony\Component\HttpFoundation\File\UploadedFile $file */
$file = $form->get('your_file_field')->getData();

// 先判断是否有有效文件上传
if ($file instanceof UploadedFile) {
    // 后续处理逻辑
}

2. 创建邮件附件

有两种常用方式生成附件:

方式一:使用DataPart直接传入文件内容

use Symfony\Component\Mime\Part\DataPart;

$attachment = new DataPart(
    $file->getContent(),       // 读取上传文件的内存内容
    $file->getClientOriginalName(), // 保留用户上传的原始文件名
    $file->getMimeType()       // 传入文件的MIME类型
);

方式二:使用FilePart直接包装UploadedFile

use Symfony\Component\Mime\Part\FilePart;

$attachment = new FilePart($file);
$attachment->setFilename($file->getClientOriginalName()); // 指定附件显示的文件名

3. 将附件添加到邮件并发送

将生成的附件添加到邮件对象,然后通过Mailer发送:

use Symfony\Component\Mime\Email;

$email = (new Email())
    ->from('sender@example.com')
    ->to('recipient@example.com')
    ->subject('带有上传文件的邮件')
    ->text('请查看附件内容')
    ->attach($attachment); // 加入附件

// 发送邮件
$mailer->send($email);

完整控制器示例

// src/Controller/UploadController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Mime\Email;
use Symfony\Component\Mime\Part\DataPart;
use Symfony\Component\Routing\Annotation\Route;

class UploadController extends AbstractController
{
    #[Route('/upload', name: 'app_upload')]
    public function upload(Request $request, \Symfony\Component\Mailer\MailerInterface $mailer): Response
    {
        // 创建未关联实体的表单
        $form = $this->createFormBuilder()
            ->add('upload_file', \Symfony\Component\Form\Extension\Core\Type\FileType::class, [
                'mapped' => false,
                'label' => '选择要发送的文件'
            ])
            ->add('submit', \Symfony\Component\Form\Extension\Core\Type\SubmitType::class)
            ->getForm();

        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $file = $form->get('upload_file')->getData();

            if ($file) {
                // 生成附件
                $attachment = new DataPart(
                    $file->getContent(),
                    $file->getClientOriginalName(),
                    $file->getMimeType()
                );

                // 构建邮件
                $email = (new Email())
                    ->from('your@domain.com')
                    ->to('target@domain.com')
                    ->subject('用户上传的文件附件')
                    ->text('这是用户通过表单上传并发送的文件,请查收。')
                    ->attach($attachment);

                // 发送邮件
                $mailer->send($email);

                $this->addFlash('success', '文件已作为附件发送成功!');
                return $this->redirectToRoute('app_upload');
            }
        }

        return $this->render('upload/index.html.twig', [
            'form' => $form->createView(),
        ]);
    }
}

注意事项

  • 如果上传的文件体积过大,直接在内存中处理可能会导致内存溢出,这种情况建议先将文件保存到临时目录,发送完成后再删除临时文件;
  • 确保php.ini中的upload_max_filesize和post_max_size参数值足够大,避免文件上传失败。

内容的提问来源于stack exchange,提问作者Wolfone

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 23:36:19