邮件动态创建的.ics文件附件无法打开文件进行读取
问题描述:
环境:
- Laravel 5.3邮件动态创建的.ics文件附件无法打开文件进行读取
案例:
邮件大约一个 '事件',包括与iCalendar文件的附件(.ics
)。正在使用PHP
生成ics
文件。
问题:
虽然发送邮件与的ics
文件Laravel返回以下错误:在使用它没有邮件
Swift_IoException in FileByteStream.php line 144: Unable to open file for reading [/storage/app/public/events/eventname.ics]
生成的文件似乎罚款。事件被添加到日历中,因此文件没有损坏。在调试时(路径上的dd
)文件正在返回,因此文件夹/访问权限看起来不错。
代码:
// Build mail
public function build()
{
$event = $this->createEvent($this->data[2]->planned_at, $this->data[2]->subject, $this->data[2]->content);
return $this->view('emails.template')
->from('[email protected]', '*')->subject($this->data[2]->subject)
->with([
'token' => $this->data[0],
'email' => $this->data[1],
'mail' => $this->data[2],
'sponsors' => $this->data[3],
'name' => $this->data[4],
])
->attach(Storage::url('app/public/events/' . $this->data[2]->subject . '.ics'), [
'as' => $this->data[2]->subject . '.ics',
'mime' => 'calendar/event',
]);
}
// Build ics file
static function createEvent($date, $subject, $content)
{
$dateTimeArr = explode(' ', $date);
$newDate = $dateTimeArr[0];
$dateArr = explode('-', $newDate);
$newDate = $dateArr[0] . $dateArr[1] . $dateArr[2] . '-' . $dateTimeArr[1];
$date = substr($newDate, 0, -9);
$startTime = str_replace(":", "", substr($newDate, 9, -3));
$strip = str_replace("\r", "", strip_tags($content));
$desc = str_replace("\n", "", $strip);
// ICS
$mail[0] = "BEGIN:VCALENDAR";
$mail[1] = "-//WEBSITE v1.0//NL";
$mail[2] = "VERSION:2.0";
$mail[3] = "METHOD:PUBLISH";
$mail[4] = "BEGIN:VCALENDAR";
$mail[5] = "DTSTART:" . $date . "T" . $startTime . "00Z";
$mail[6] = "DTEND:" . $date . "T" . $startTime . "00Z";
$mail[7] = "DTSTAMP:" . gmdate('Ymd') . 'T' . gmdate('His') . "Z";
$mail[8] = "UID:" . md5(uniqid(mt_rand(), true));
$mail[9] = "ORGANIZER;" . "*";
$mail[10] = "CREATED:" . $date . "T" . $startTime . "00Z";
$mail[11] = "DESCRIPTION:" . $desc;
$mail[12] = "LAST-MODIFIED:" . $date . "T" . $startTime . "00Z";
$mail[13] = "LOCATION:" . "";
$mail[14] = "SEQUENCE:0";
$mail[15] = "STATUS:CONFIRMED";
$mail[16] = "SUMMARY:" . "";
$mail[17] = "TRANSP:OPAQUE";
$mail[18] = "END:VEVENT";
$mail[19] = "END:VCALENDAR";
//set correct content-type-header
$filename = $subject . '.ics';
$mail = implode("\r\n", $mail);
header("text/calendar");
Storage::put('public/events/' . $filename , $mail);
}
答
许多类似的门票已经建议你需要传递给swiftmailer真实路径。
事情是这样的:
public function build()
{
$event = $this->createEvent($this->data[2]->planned_at, $this->data[2]->subject, $this->data[2]->content);
$path=realpath('app/public/events/' . $this->data[2]->subject . '.ics');
return $this->view('emails.template')
->from('[email protected]', '*')->subject($this->data[2]->subject)
->with([
'token' => $this->data[0],
'email' => $this->data[1],
'mail' => $this->data[2],
'sponsors' => $this->data[3],
'name' => $this->data[4],
])
->attach($path), [
'as' => $this->data[2]->subject . '.ics',
'mime' => 'calendar/event',
]);
}
https://laracasts.com/discuss/channels/laravel/unable-to-open-file-for-reading-swift-ioexception
Retrieving a file name to attach to an email with SwiftMailer and PHP
可能是一个权限问题,这台服务器处理用户可以访问的/存储/程序/公共/事件/文件夹? –
虽然“dd'ing是被退回该文件的存储路径,因此该文件被正确 – Liam
访问如果我的回答解决你的问题,请标记为接受的真实路径 –