2016-11-23 5 views
4

환경 읽기 위해 파일을 열 수 없습니다 첨부 파일 :
- Laravel을 5.3메일 동적으로 생성을 .ics이

케이스 :에서 iCalendar 파일을 첨부 파일을 포함하는 '이벤트'에 대한
메일 (.ics). ics 파일은 PHP을 사용하여 생성됩니다.

문제 :
하면 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]', 'Stackoverflow')->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;" . "Stackoverflow"; 
    $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

저장 경로를 찾는 동안 파일이 반환되므로 파일이 올바르게 액세스되고 있습니다 – Liam

+0

내 대답으로 문제가 해결되면 –

답변

1

유사한 티켓의 수는 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]', 'Stackoverflow')->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

Realpath는 항상 false를 반환하고 매개 변수로 여러 경로를 시도했습니다 – Liam

+0

이것은 가정합니다 파일 시스템이 올바르게 설정되었는지 확인하십시오 https://laravel.com/docs/5.3/filesystem'로컬 드라이버를 사용하는 경우 공개적으로 액세스 할 수있는 모든 파일은 storage/app/public 디렉토리에 저장해야합니다. 게다가 저장 장치/응용 프로그램/공용 디렉토리를 가리키는 public/storage에서 심볼릭 링크를 만들어야합니다. " –

+0

나는 알고 있으며 그 파일이 발견되었습니다. 그러나. Realpath는 매번 false를 반환합니다. – Liam