У меня есть приложение Symfony 3.3, которое успешно отправляет электронное письмо с вложением. Соответствующая функция выглядит так:
private function sendEmail($data)
{
$vgmsContactMail = self::contactMail;
$mailer = $this->get('mailer');
/* @var $uploadedFile UploadedFile */
$uploadedFile = $data["attachment"];
$extension = $uploadedFile->guessExtension();
if (!in_array($extension, ['pdf','rtf']) ){
die('Please upload a .pdf or .rtf file.');
}
$newFilePath = '/tmp';
$newFileName = 'temporary' . rand(0,10000) . '.rtf';
$uploadedFile->move($newFilePath, $newFileName);
$attachment = \Swift_Attachment::fromPath('/tmp/' . $newFileName);
$message = \Swift_Message::newInstance("VGMS Contact Form: ". $data["subject"])
->setFrom(array($vgmsContactMail => "Message by ".$data["name"]))
->setTo(array(
$vgmsContactMail => $vgmsContactMail
))
->setBody($data["message"]."<br>ContactMail :".$data["email"])
->attach($attachment)
;
return $mailer->send($message);
}
Моя проблема в том, что жесткое кодирование каталога /tmp кажется очень хрупким. Есть ли более элегантный способ получить путь к каталогу, в котором хранятся временные файлы?






чтобы узнать фактическую папку tmp, вы можете использовать эту функцию
sys_get_temp_dir();
Источник: http://php.net/manual/fr/function.sys-get-temp-dir.php
Вы можете использовать это так:
$newFileName = tempnam(sys_get_temp_dir(), 'myAppNamespace');, и у вас будет полный путь к файлу со случайным и уникальным именем.
Не ссылка на ваш первый вопрос, но я заметил небольшую проблему с вашим кодом:
$newFileName = 'temporary' . rand(0,10000) . '.rtf';
В вашем коде жестко задан тип расширения. но ваша предыдущая проверка касается расширения pdf / rtf.
Мое решение также устранит эту проблему.