Ankündigung

Einklappen
Keine Ankündigung bisher.

ZendMail -> E-Mail + Anhang u. Weiterleitung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • ZendMail -> E-Mail + Anhang u. Weiterleitung

    Hallo Leute

    hab heute ein Script geschrieben das e-Mails aus meinem Postfach liest und ggf. den Anhang mit ausliest und abspeichert!

    Nun habe ich das Problem das wenn ich eine E-Mail + Anhang weitergeleitet bekomm das der Anhang im base64_encode dem normalen E-Mail Content anhängt!

    Hier mal der Code Schnipsel:

    PHP-Code:
    foreach($mail AS $message){
        
    $countParts $message->countParts();

        
    $from $message->getHeader("reply-to");

        
    $subject $message->subject;

        
    $content $message->getContent();

        
    $data = array();
        
    $data['from'] = $from;
        
    $data['subject'] = $subject;
        
    $data['content'] = $content;
        
    $data['attachment'] = array();

        if(
    $message->isMultipart()){
            for(
    $x 2$x <= $countParts$x++){
                
    $part $message->getPart($x);

                
    $header $part->getHeader('content-type');

                
    preg_match("/name=\"(.*)\"/"$header$filename);

                
    $filename $filename[1];

                
    $data['attachment'][] = $filename;

                
    $partContent $part->getContent();

                
    $contentAtt base64_decode($partContent);

                
    $file fopen($filename"w");

                
    fwrite($file$contentAtt);

                
    fclose($file);
            }
        }

    Hoffe ihr könnt mir helfen. Verbesserungsvorschläge wären auch super!


  • #2
    Gibts auch ne Frage?
    --

    „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
    Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


    --

    Kommentar


    • #3
      Ja. Wie muss ich es programmieren das die Anhänge von weitergeleiteten E-Mails nicht im Body sind sondern im Attachment Teil.

      bzw. wie ich diesen Teil aus dem Body heraus bekomme.

      Habe es schon mit Regex probiert ist aber eher daneben gegangen!

      Kommentar


      • #4
        PHP-Code:
        foreach($mail AS $message){
            
        $countParts $message->countParts();

            
        $from $message->getHeader("reply-to");

            
        $subject $message->subject;

            
        $content $message->getContent();

            
        $data = array();
            
        $data['from'] = $from;
            
        $data['subject'] = $subject;
            
        $data['content'] = $content;
            
        $data['attachment'] = array();

            if(
        $message->isMultipart()){
                for(
        $x 2$x <= $countParts$x++){
                    
        $part $message->getPart($x);

                    
        $header $part->getHeader('content-type');

                    
        preg_match("/name=\"(.*)\"/"$header$filename);

                    
        $filename $filename[1];

                    
        $data['attachment'][] = $filename;

                    
        $partContent $part->getContent();

                    
        $contentAtt base64_decode($partContent);

                    
        $file fopen($filename"w");

                    
        fwrite($file$contentAtt);

                    
        fclose($file);
                }
            else

        Mache es ma so ... ich habe ncoh eine Else zwischen gesetzt

        Kommentar


        • #5
          Super. Ein else ohne Klammern. Das hilft ihm sicher weiter
          --

          „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
          Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


          --

          Kommentar


          • #6
            Mit korrekt formatierten Mails kann ich das Problem nicht rekonstruieren.

            Ich denke, die Schwierigkeit besteht darin, ein "inline attachment" (also ein Attachment im Body) in einer weitergeleiteten Mail überhaupt als solches zu identifizieren. Wenn das in deinem Fall keinem Standard folgt, weil ein Client es zum Beispiel für eine schlaue Idee hielt, die Daten einfach in den Body reinzukopieren, dürfte es knifflig werden. (Wobei ich nicht weiß, ob es für sowas überhaupt Standards gibt. Eigentlich dienen dafür ja Multipart-Nachricht.)

            Wie zeigt denn ein normaler Mailclient eine entsprechende Mail an?

            Kopiere im Zweifel mal eine Nachricht inklusive Headern hier in den Thread.

            Kommentar


            • #7
              Ja genau! Bei GoogleMail ist das so! Da gibts Inline Attachments und die werden von der Überprüfung $message->isMultipart() nicht erfasst! Habe es wie gesagt schon mit einer Regex probiert die Anhand der "Trenner" den kompletten Attachment String ausliest/löscht!

              EDIT: Ich stelle gleich mal ne Kurzfassung einer Mail mit Attachment rein!

              Kommentar


              • #8
                eMail Header (als var_dump):

                array(15) {
                ["return-path"]=>
                string(30) ""
                ["delivery-date"]=>
                string(31) "Tue, 30 Mar 2010 15:56:52 +0200"
                ["received"]=>
                array(7) {
                [0]=>
                string(203) "********"
                [1]=>
                string(187) "********"
                [2]=>
                string(221) "********"
                [3]=>
                string(186) "********"
                [4]=>
                string(105) "********
                [5]=>
                string(65) "********"
                [6]=>
                string(101) "********"
                }
                ["x-novuage-virus"]=>
                string(25) "********"
                ["mime-version"]=>
                string(3) "1.0"
                ["reply-to"]=>
                string(2 "********"
                ["in-reply-to"]=>
                string(60) "<********@mail.gmail.com>"
                ["references"]=>
                string(60) "<********@mail.gmail.com>"
                ["from"]=>
                string(5 "********"
                ["date"]=>
                string(31) "Tue, 30 Mar 2010 15:56:25 +0200"
                ["message-id"]=>
                string(60) "<********@mail.gmail.com>"
                ["subject"]=>
                string(11) "Fwd: 2.Test"
                ["to"]=>
                string(21) "********"
                ["content-type"]=>
                string(54) "multipart/mixed; boundary=001517477f862c9ee004830500ff"
                ["envelope-to"]=>
                string(21) "********"
                }

                Der eMail Body mit Inline Attachment:

                --001517477f862c9ee004830500ff
                Content-Type: text/plain; charset=ISO-8859-1
                Content-Transfer-Encoding: quoted-printable

                ---------- Weitergeleitete Nachricht ----------
                Von: *********
                Datum: 30. M=E4rz 2010 09:23
                Betreff: 2.Test
                An: *********


                Mit Datei

                --001517477f862c9ee004830500ff
                Content-Type: application/pdf; name="anleitung_teamviewer.pdf"
                Content-Disposition: attachment; filename="anleitung_teamviewer.pdf"
                Content-Transfer-Encoding: base64
                X-Attachment-Id: f_g7edpqpw0

                JVBERi0xLjQKJcOkw7zDtsOfCjIgMCBvYmoKPDwvTGVuZ3RoID MgMCBSL0ZpbHRlci9GbGF0ZURl
                Y29kZT4+CnN0cmVhbQp4nJVVS2/bMAy++1foXMCuSOtlwBCQl4ftli1AD8NO27rLsqG99O+PpCxb
                TpwiQwFXEV8f+ZGUbkC9VS9KK00n29mmVcFA06nXn+rpQf1JMv p7/VVtT5V1TVDedQ2q0w/1OIAC
                p07PX3sNsW57jfHb6VN1OFXHVUNr6ZsNdTJsY217beRrI2A+u0 hHH+uu1yGS6y6aLPIRer3RW9bY
                iYa/ittYDZ0bo0MLlN5q+H0M/KmRvxg4BQp2mINt9MCoQEugAoVYyhEgQuuSKSBQRqQ0lJBAQFH U
                Asj3c0Uo1dsC7+cPlVa1JgLOBLFrXPrxW325Kika3fj1pKRAUh 4X69CD4Zz4EixnAY6z4FQILdUc
                5pqTdrK+p+bkz3PlIFDOLpcxheQQYyU2Eh86kYof8TtMwWATWx y1YcuBd6wlIoGeq8zeZnQJmPia
                +YLduy1orKdyLnsX9nf0rjHYmIs6E27kTGt3o5r/1cGLZLMxXR4kbTHmy0ThgmJky9qP+kLuZsXX
                LSBJdXHJTRIIYDEHIveJF/Y0oYeSVMtgElGXsSFE0JmlgSuVeJt4zxmIkwXnU54l0cXQrcx/yV2r
                ebstSUd9B+kYDE3oknQE5huR0dzK9sb8jCxd3l4Vmvup6BAYCG YuDrZcslAMS5qYVBOZurUZn1pm
                SRsrXrP/HiaaeNChR0P/XLkjsUdbpmfzPshsUdGcaBfDKyG2sjC2047Ags2JEuKDlx0QHy bwA8WU
                ...
                CjAwMDEyODk5MzggMDAwMDAgbiAKMDAwMTI3NDQzNSAwMDAwMC BuIAowMDAxMjg4MTI1IDAwMDAw
                IG4gCjAwMDEyODgxNDggMDAwMDAgbiAKMDAwMTI4ODMzOCAwMD AwMCBuIAowMDAxMjg4ODkyIDAw
                MDAwIG4gCjAwMDEyODkyODQgMDAwMDAgbiAKMDAwMTI4OTMxNy AwMDAwMCBuIAowMDAxMjkwMTk5
                IDAwMDAwIG4gCjAwMDEyOTAyOTcgMDAwMDAgbiAKdHJhaWxlcg o8PC9TaXplIDM1L1Jvb3QgMzMg
                MCBSCi9JbmZvIDM0IDAgUgovSUQgWyA8QzQ2QzM4QTNDMjk4NE E2QzAwNEQwQUIyRkJBQ0MyQzQ+
                CjxDNDZDMzhBM0MyOTg0QTZDMDA0RDBBQjJGQkFDQzJDND4gXQ ovRG9jQ2hlY2tzdW0gL0VDRURC
                RjU3NTI5OTVDQUQxOTcwOEE0RTNEREREQ0Y5Cj4+CnN0YXJ0eH JlZgoxMjkwNDg0CiUlRU9GCg==
                --001517477f862c9ee004830500ff--

                Kommentar


                • #9
                  Das dürfte schon Multipart sein und deshalb korrekt geladen werden können.

                  Probier es mal hiermit:

                  PHP-Code:
                  <?php

                  // ...

                  $messages = array();

                  foreach (
                  $mail as $message) {
                      
                  $data['from']    = ($message->headerExists("from"))
                                       ? 
                  $message->getHeader("from")
                                       : 
                  '';
                      
                  $data['subject'] = $message->subject;
                      
                  $data['parts']   = array();

                      if (
                  $message->isMultipart()) {
                          
                  $countParts $message->countParts();
                          
                          for (
                  $x 1$x <= $countParts$x++) {
                              
                  $part $message->getPart($x);

                              
                  $contentType $part->getHeader('content-type');

                              if (
                  $part->headerExists('content-disposition')
                                  && 
                  strpos($part->getHeader('content-disposition'), 'attachment') !== false
                              
                  ) {
                                  
                  // Anhang
                                  
                  $content base64_decode($part->getContent());
                              } else {
                                  
                  $content $part->getContent();
                              }

                              
                  $data['parts'][] = array(
                                  
                  'content-type' => $contentType,
                                  
                  'content'      => $content
                              
                  );
                          }
                      } else {
                          
                  $data['parts'][] = array(
                              
                  'content-type' => $message->getHeader('content-type'),
                              
                  'content'      => $message->getContent()
                          );
                      }

                      
                  $messages[] = $data;
                  }

                  ?>

                  <?php foreach ($messages as $m): ?>

                  <h1><?php echo htmlspecialchars($m['subject'])
                          . 
                  ' (' htmlspecialchars($m['from']) . ')'?></h1>

                      <?php foreach ($m['parts'] as $p): ?>

                          <p style="background: #ccc;"><?php echo htmlspecialchars($p['content-type']); ?></p>

                          <pre><?php echo htmlspecialchars($p['content']); ?></pre>

                          <hr />

                      <?php endforeach; ?>

                  <?php endforeach; ?>
                  Der Code spuckt den Inhalt des Anhangs allerdings einfach aus. Ergibt bei einer PDF wohl nicht so viel Sinn.

                  Kommentar


                  • #10
                    Musste dein Stück etwas umschreiben da die Funktion headerExists() nicht existiert! Im Moment gibt er mir den Fehler aus:
                    Nachricht: no Header with Name content-disposition found
                    Stack trace:
                    #0 C:\xampp\htdocs\ZendMail\application\controllers\M ailController.php(25): Zend_Mail_Part->getHeader('content-disposi...')
                    #1 C:\xampp\htdocs\ZendMail\library\Zend\Controller\A ction.php(503): MailController->indexAction()
                    #2 C:\xampp\htdocs\ZendMail\library\Zend\Controller\D ispatcher\Standard.php(285): Zend_Controller_Action->dispatch('indexAction')
                    #3 C:\xampp\htdocs\ZendMail\library\Zend\Controller\F ront.php(934): Zend_Controller_Dispatcher_Standard->dispatch(Object(Zend_Controller_Request_Http), Object(Zend_Controller_Response_Http))
                    #4 C:\xampp\htdocs\ZendMail\public\index.php(3: Zend_Controller_Front->dispatch()
                    #5 {main}

                    Kommentar


                    • #11
                      Also mindestens seit Rev 17687 als auch im Trunk existiert headerExists() in der Zend_Mail_Part - da solltest du also mal deine ZF-Version prüfen.
                      Wenn ich mich nicht irre hatte ich genau dieses Problem nämlich auch schon mit einer zu alten Version.
                      Damit dürfte dann wohl auch deine Exception erledigt sein, da du ja vorher prüfst, ob der Header existiert.
                      VokeIT GmbH & Co. KG - VokeIT-oss @ github

                      Kommentar


                      • #12
                        Meine Version ist eig. recht neu. In der Zend_Mail_Part wird die Funktion benutzt nur er möchte das von der Zend_Mail_Message haben!

                        Fehler:
                        Fatal error: Call to undefined method Zend_Mail_Message::headerExists() in C:\xampp\htdocs\ZendMail\application\controllers\M ailController.php on line 13
                        EDIT: Lade mir gerade die aktuelle Version herunter!

                        EDIT: Ok jetzt läufts!

                        Kommentar


                        • #13
                          Habe jetzt noch ein Problem!

                          Einige E-Mails kommen auch von web.de.

                          Wie ihr bestimmt wisst hat web.de unter dem Body Werbung!

                          Diese wird jetzt nicht als Part angenommen und taucht weiterhin im Body auf!

                          Habt ihr da noch eine Idee?

                          Kommentar


                          • #14
                            Natürlich taucht das nicht als Part auf - ist ja ein Teil des Bodys, damit's angezeigt wird.
                            Dir bleibt an sich nur die Möglichkeit, zu prüfen, ob die Mail von web.de kommt und dann den Body nach entsprechenden Merkmalen zu scannen.
                            Wobei ich das nicht unbedingt als zuverlässig ansehen und mir daher die Arbeit einfach sparen würde - wen interessiert schon Werbung?
                            VokeIT GmbH & Co. KG - VokeIT-oss @ github

                            Kommentar


                            • #15
                              Wenn man die Mails mit nem normalen Programm empfängt ist das ja auch teil des bodys weil es angehängt wird, stört es denn ?
                              robo47.net - Blog, Codeschnipsel und mehr
                              | Caching-Klassen und Opcode Caches in php | Robo47 Components - PHP Library extending Zend Framework

                              Kommentar

                              Lädt...
                              X