Symfony 不能使用邮件附件和文件系统
Symfony can't use mailer attachment AND filesystem
我想用 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);
}
有没有人有解决办法?
我认为你的问题是由 symfony swiftmailer 假脱机引起的
When you use spooling to store the emails to memory, they will get sent right before the kernel terminates (https://symfony.com/doc/current/email/spool.html#spool-using-memory)
表示不是直接发送邮件,而是调用$monthlyMailer->sendRentReleaseToLessees($rentRelease);后直接删除了文件。附件有问题。
尝试更改您的 swiftmailer 配置以禁用假脱机,或为 symfony kernel.terminate 事件创建一个事件侦听器并从您的事件侦听器中删除该文件。
禁用电子邮件后台处理:
Apparently the only way to disable email spooling is to completely leave out the spool entry from your configuration file
Disable swiftmailer spool in Symfony per environment
我想用 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);
}
有没有人有解决办法?
我认为你的问题是由 symfony swiftmailer 假脱机引起的
When you use spooling to store the emails to memory, they will get sent right before the kernel terminates (https://symfony.com/doc/current/email/spool.html#spool-using-memory)
表示不是直接发送邮件,而是调用$monthlyMailer->sendRentReleaseToLessees($rentRelease);后直接删除了文件。附件有问题。
尝试更改您的 swiftmailer 配置以禁用假脱机,或为 symfony kernel.terminate 事件创建一个事件侦听器并从您的事件侦听器中删除该文件。
禁用电子邮件后台处理:
Apparently the only way to disable email spooling is to completely leave out the spool entry from your configuration file
Disable swiftmailer spool in Symfony per environment