2017-06-30 3 views
0

Ich muss in der Lage sein, eine, vielleicht mehr, auf einem Amazon S3-Server gespeicherte Dateien als Anhänge in einer mit SendGrid erstellten E-Mail senden.PHP: SendGrid Mail-Anhänge von S3-Server

Das Problem, das ich habe, ist, dass ich kein Web-Dev-Experte bin und die spärlichen PHP-Beispiele, die ich finden kann, mir nicht viel helfen.

Muss ich die Dateien vom S3-Server in das lokale Verzeichnis/tmp herunterladen und sie auf diese Weise als Anlagen hinzufügen, oder kann ich den Dateikörper vom FileController übergeben und ihn so als Anhang einfügen?

Ich bin nicht wirklich sicher, wo ich anfangen soll, aber hier ist, was ich bisher getan habe:

$attachments = array(); 
// Process the attachment_ids 
foreach($attachment_ids as $attachment_id) { 
     // Get the file if it is attached to the Activity 
     if (in_array($attachment_id, $activity_file_ids)) { 
       $file = File::find($attachment_id); 
       $fileController = new FileController($this->_app); 
       $fileObject = $fileController->getFile($attachment_id); 
error_log(print_r($fileObject, true)); 
       $attachment = array(); 
       $attachment['content'] = $fileObject; 
       $attachment['type'] = $fileController->mime_content_type($file->file_ext); 
       $attachment['name'] = explode(".", $file->filename, 2)[0]; 
       $attachment['filename'] = $file->filename; 
       $attachment['disposition'] = "inline"; 
       $attachment['content_id'] = ''; 
     } 
} 

Mein nächster Schritt die $ Befestigungs Array an den $ Attachments Array wäre zu schieben. Sobald $ Attachments abgeschlossen ist, durchlaufen Sie es und fügen Sie jeden $ Anhang zum SendGrid E-Mail-Objekt hinzu (die E-Mail funktioniert ohne Anhänge, BTW.)

Problem ist, ich bin mir nicht sicher, ob ich bin die richtige Straße damit gehen oder wenn es eine viel kürzere und sauberere (und funktionierende) Art und Weise ist, dies zu tun?

FileController-> getFile() im Wesentlichen Folgendes aus:

$file = $this->_s3->getObject(array(
    'Bucket' => $bucket, 
    'Key' => $filename, 
)); 
return $file['Body']; 

Jede Hilfe (insbesondere Code-Beispiele) würde sehr geschätzt!

Antwort

1

Okay, ich habe eine funktionierende Lösung für dieses Problem jetzt haben - hier ist der Code:

// Process the attachment_ids 
foreach($attachment_ids as $attachment_id) { 
     // Get the file if it is attached to the Activity 
     if (in_array($attachment_id, $activity_file_ids)) { 
       // Get the file record 
       $file = File::find($attachment_id); 
       // Get an instance of FileController 
       $fileController = new FileController($this->_app); 
       // Set up the Attachment object 
       $attachment = new \SendGrid\Attachment(); 
       $attachment->setContent(base64_encode($fileController->getFile($attachment_id))); 
       $attachment->setType($fileController->mime_content_type($file->file_ext)); 
       $attachment->setFilename($file->filename); 
       $attachment->setDisposition("attachment"); 
       $attachment->setContentId($file->file_desc); 
       // Add the attachment to the mail 
       $mail->addAttachment($attachment); 
     } 
} 

Weiß nicht, ob es jemand anderes helfen, aber es gibt sie. Die Lösung bestand darin, die Datei vom S3-Server zu holen und base64_encode ($ file ['Body']) an die setContent-Funktion eines instanziierten Attachment-Objekts zu übergeben, zusammen mit einigen anderen Feldern dafür.

Verwandte Themen