Datei wird im falschen Ordner zwischengespeichert

Werner S

Neues Mitglied
Grüß euch,

um Mails via PHP aufzurufen und in der DB zu speichern, habe ich auf folgende Klasse zurück gegriffen und in Laravel eingefügt

Soweit klappt auch alles. Lediglich die Mail Anhänge werden im Ordner app/Http/Controllers als .bin File zwischengespeichert was natürlich nicht sein soll.
Optimal wäre im Ordner public bzw. das diese am Ende gelöscht werden oder alternativ erst gar nicht angelegt.

Ich habe schon so einiges versucht, hänge aber fest.

app/Http/Controllers/MailController

PHP:
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Mail;
use Illuminate\Mail\Mailer;
use Illuminate\Support\Facades\Auth;
use PhpImap\Exceptions\ConnectionException;
use PhpImap\Mailbox;
use Illuminate\Support\Facades\DB;
use function GuzzleHttp\Promise\all;




class MailController extends Controller
{


 
    public function checking()
    {

        .......

            // Save attachments one by one
            if (!$mailbox->getAttachmentsIgnore()) {
                $attachments = $email->getAttachments();

                foreach ($attachments as $attachment) {

                    // Set individually filePath for each single attachment
                    // In this case, every file will get the current Unix timestamp
                    $attachment->setFilePath('files/' . $attachment->name);
                    $attachment->saveToDisk();
                    // Anhänge speichern
                    DB::table('mails_attachements')->insert(
                        ['name' => $attachment->name, 'mail_id' => $mail->id]
                    );

                    echo $attachment->sizeInBytes.'<br>';
                }
            }

            // Mail auf dem Server als gelesen markieren
            $mailbox->markMailAsRead($mail_id);


        }

        $mailbox->disconnect();

    }
}
Mailbox.php (aus der Klasse)
PHP:
$attachmentsDir = $this->getAttachmentsDir();

        if (null != $attachmentsDir) {
            $fileSysName = \bin2hex(\random_bytes(16)).'.bin';
            $filePath = $attachmentsDir.DIRECTORY_SEPARATOR.$fileSysName;

            if (\strlen($filePath) > self::MAX_LENGTH_FILEPATH) {
                $ext = \pathinfo($filePath, PATHINFO_EXTENSION);
                $filePath = \substr($filePath, 0, self::MAX_LENGTH_FILEPATH - 1 - \strlen($ext)).'.'.$ext;
            }
            $attachment->setFilePath($filePath);
            $attachment->saveToDisk();
        }
Evtl. könnt Ihr auch dies mal helfen.
 
Zuletzt bearbeitet:

asc

Mitglied
devCommunity-Experte
Hey, du kannst im constructor der Klasse angeben wo Anhänge abgelegt werden sollen:
PHP:
// Create PhpImap\Mailbox instance for all further actions
$mailbox = new PhpImap\Mailbox(
    '{imap.gmail.com:993/imap/ssl}INBOX', // IMAP server and mailbox folder
    'some@gmail.com', // Username for the before configured mailbox
    '*********', // Password for the before configured username
    __DIR__, // Directory, where attachments will be saved (optional)
    'UTF-8' // Server encoding (optional)
);
 

Werner S

Neues Mitglied
Hi,

Hey, du kannst im constructor der Klasse angeben wo Anhänge abgelegt werden sollen:
Es wird wohl immer ein Rätsel bleiben wieso ich das übersehen habe :D

Jetzt muss ich noch einen weg finden wie ich HTML Mails auch als HTML ausgeben kann (Bild) und nicht als Text
 

Anhänge

Zuletzt bearbeitet:

asc

Mitglied
devCommunity-Experte
Kommt drauf an wie du das darstellen lässt. HTML E-Mails im Browser sind generell eine schlechte Idee :D
Wenn du wirklich HTML-Emails im Browser darstellen lassen willst, solltest du den Inhalt so sehr beschneiden wie möglich.
  • <img> muss raus (tracking)
  • <audio> und <video> muss raus (tracking)
  • <iframe> muss raus (tracking, externe scripts)
  • <style> muss kastriert werden(click-jacking, externe medien, tracking)
  • <script> muss raus
  • Event-Handler Attribute (onclick usw.) müssen raus.
und noch mehr
 

Werner S

Neues Mitglied
Hi,

Kommt drauf an wie du das darstellen lässt. HTML E-Mails im Browser sind generell eine schlechte Idee :D
Genau so wie diese auch in Outlook / Thunderbird / Roundcube und anderen Mailclients angezeigt wird.

Wenn du wirklich HTML-Emails im Browser darstellen lassen willst, solltest du den Inhalt so sehr beschneiden wie möglich.
  • <img> muss raus (tracking)
  • <audio> und <video> muss raus (tracking)
  • <iframe> muss raus (tracking, externe scripts)
  • <style> muss kastriert werden(click-jacking, externe medien, tracking)
  • <script> muss raus
  • Event-Handler Attribute (onclick usw.) müssen raus.
und noch mehr
Und ich glaube da liegt das Problem. Ich könnte Sie als reinen Text speichern, wäre nur eine Zeile abändern aber genau das möchte ich nicht.

EDIT: Jetzt hab ich es. Ich hatte nach den ganzen Jahren wo ich es nicht mehr eingesetzt habe komplett vergessen. Was ich gesucht habe ist iframe bzw. jetzt ja object und embed

In Laravel eigene Route angelegt und dann den HTML Inhalt aus der Datenbank mit onject und embed ausgegeben
 
Zuletzt bearbeitet:
Oben Unten