Symfony无法使用邮件程序附件和文件系统

问题描述 投票:1回答:1

我想发送一封附有文件的电子邮件,附带swiftMailer,然后我要删除同一个文件。但是当我这样做时,它不起作用。我的文件没有删除,邮件没有发送,有一个奇怪的事情。创建了两封电子邮件。这是控制器:

public function rentIsPaid(
    RentRelease $rentRelease,
    PdfGenerator $pdfGenerator,
    MonthlyMailer $monthlyMailer
): Response {
    if (!$this->isGranted('EDIT_RENT_RELEASE', $rentRelease)) {
        $this->addFlash('danger', 'Vous n\'etes pas autorisé à effectuer cette action.');

        return $this->redirectToRoute('rent_release_index');
    }

    $rentRelease->setStatus('Payé');

    $entityManager = $this->getDoctrine()->getManager();
    $entityManager->persist($rentRelease);
    $entityManager->flush();

    $pdfGenerator->generateRentReleasePdf($rentRelease);
    $monthlyMailer->sendRentReleaseToLessees($rentRelease);

    $filesystem = new Filesystem();

    $pdfFile = $rentRelease->getPdf();
    $filesystem->remove("generated/pdf/$pdfFile"); //if I don't remove the file but I keep the attachment, it works

    $entityManager = $this->getDoctrine()->getManager();

    $rentRelease->setPdf(null);

    $entityManager->persist($rentRelease);
    $entityManager->flush();

    return $this->redirectToRoute('rent_release_index');
}

服务在这里:

public function generateRentReleasePdf(RentRelease $rentRelease)
{
    $currentDate = new DateTime();
    $currentDate = $currentDate->format('m-Y');

    if ($rentRelease->getStatus() === 'Payé') {
        $propertyName = $rentRelease->getPropertyName();
        $propertyName= str_replace(' ', '_', $propertyName);

        $lesseeName = str_replace(' ', '-', $rentRelease->getLesseeName());
        $fileName = $propertyName . '_' . $lesseeName . '_' . date("m-Y") . '_';
        $fileName = $fileName . bin2hex(random_bytes(5)) . '.pdf';
        $fileName = $this->removeAccents($fileName);

        $html = $this->twig->render('rent_release/pdf.html.twig', [
            'rent_release' => $rentRelease,
            'current_date' => $currentDate,
        ]);

        $this->knpSnappyPdf->generateFromHtml("$html", "generated/pdf/$fileName");

        $rentRelease->setPdf($fileName);
        $this->manager->persist($rentRelease);
        $this->manager->flush();
    }
}


public function sendRentReleaseToLessees(RentRelease $rentRelease)
{
    $mail = $rentRelease->getRentRelease()->getEmail();

    $name = $rentRelease->getLesseeName();
    $owner = $rentRelease->getUserRentRelease()->getName();
    $owner = $owner . ' ' . $rentRelease->getUserRentRelease()->getLastName();
    $property = $rentRelease->getPropertyName();

    $pdf = $rentRelease->getPdf();

    $message = (new \Swift_Message('Votre quittance de loyer'))
        ->setFrom(getenv('MAILER_FROM_ADDRESS'))
        ->setTo("$mail")
        ->setBody(
            $this->twig->render(
                'emails/rentReleaseMail.html.twig',
                [
                    'name' => $name,
                    'owner' => $owner,
                    'property' => $property,
                ]
            ),
            'text/html'
        )
        ->attach(Swift_Attachment::fromPath("generated/pdf/$pdf")); //if I don't set attachment but I keep the delete, it works

    $this->mailer->send($message);
}

有没有人有任何想法来解决它?

php symfony filesystems symfony4 swiftmailer
1个回答
3
投票

我认为你的问题是由symfony swiftmailer假脱机引起的

当您使用假脱机将电子邮件存储到内存时,它们将在内核终止之前发送(https://symfony.com/doc/current/email/spool.html#spool-using-memory

这意味着电子邮件不会直接发送,但是因为您在调用$ monthlyMailer-> sendRentReleaseToLessees($ rentRelease)后直接删除了该文件;附件存在问题。

尝试更改swiftmailer配置以禁用假脱机,或者创建symfony kernel.terminate事件的事件侦听器并从事件侦听器中删除该文件。

要禁用电子邮件假脱机:

显然,禁用电子邮件假脱机的唯一方法是从配置文件中完全省略假脱机条目

Disable swiftmailer spool in Symfony per environment

© www.soinside.com 2019 - 2024. All rights reserved.