2016-11-23 8 views
4

環境読み込むためのファイルを開くことができません添付ファイル:
- Laravelを5.3メール動的に作成の.icsが

ケース:iCalendarファイルの添付ファイルを含む 'イベント' について
メール(.ics )。ファイルicsPHPを使用して生成されています。

問題:
でLaravelは以下のエラーを返しicsファイルメールを送信中:

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

ストレージパスを 'dd'ing中にファイルが返されているので、ファイルが正しくアクセスされています – 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ディレクトリに置かれます。さらに、storage/app/publicディレクトリを指すpublic/storageにシンボリックリンクを作成する必要があります。 –

+0

私は知っていて、ファイルが見つかりました。しかし。 Realpathは毎回falseを返します。 – Liam

関連する問題