邮件动态创建的.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); 
} 
+0

可能是一个权限问题,这台服务器处理用户可以访问的/存储/程序/公共/事件/文件夹? –

+0

虽然“dd'ing是被退回该文件的存储路径,因此该文件被正确 – Liam

+0

访问如果我的回答解决你的问题,请标记为接受的真实路径 –

许多类似的门票已经建议你需要传递给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

PHP, Swift-mailer problem

Retrieving a file name to attach to an email with SwiftMailer and PHP

+0

总是返回false,尝试了多种不同的路径作为参数 – Liam

+0

这是假设您的文件系统已正确设置https://laravel.com/docs/5.3/filesystem'请记住,如果您使用的是本地驱动程序,那么应该公开访问的所有文件都应该放在storage/app/public目录中。此外,您应该在公共/存储中创建一个指向存储/应用程序/公共目录的符号链接。' –

+0

我知道,并且找到了该文件。但。实时路径每次都返回false。 – Liam