php.de

Zurück   php.de > Webentwicklung > PHP Einsteiger > PHP Tipps 2005

 
 
LinkBack Themen-Optionen Thema bewerten
Alt 08.05.2005, 12:41  
Gast
 
Beiträge: n/a
Standard encoding der Mime-Mails macht mir immer noch Kopfschmerzen

PHP-Code:
<?php
this may be the way
how to obtain all those part_numbers.... even when a message contains another message attached, and it contains another message attached...

<?
 
$parttypes = array ("text""multipart""message""application""audio""image""video""other");
 function 
buildparts ($struct$pno "") {
   global 
$parttypes;
   switch (
$struct->type):
     case 
1:
       
$r = array (); $i 1;
       foreach (
$struct->parts as $part)
         
$r[] = buildparts ($part$pno.".".$i++);

       return 
implode (", "$r);
     case 
2
       return 
"{".buildparts ($struct->parts[0], $pno)."}";
     default:
       return 
'[url="?p='.substr ($pno1).'"]'.$parttypes[$struct->type]."/".strtolower ($struct->subtype)."[/url]";
   endswitch;
 }

  
$struct imap_fetchstructure ($pop3mbox$msguidFT_UID);
  echo 
buildparts ($struct);
?>

it will print something like: 

[url="?p=1"]text/plain[/url], {[url="?p=2.1"]text/plain[/url], [url="?p=2.2"]text/html[/url]} 

?>

ich habe mir obigen Source code aus einem Board gerade mal als HTML-Email geschickt und als Output bekomme ich von meinem Script nur ein dämliches "text/plain, {text/plain, text/html}".


Mein Skript unterscheidet zwischen type 0 email und type 1 email. type 0 ist kein Thema, klappt wunderbar. Type 1 (mime multipart) geht im prinzip auch, sogar mit attachments, aber nur solange die email kein HTML enthält!

PHP-Code:
<?php
// wenn type 1 (multipart)
    
if($ttype == 1) {
           
$parts $structure->parts;
           
$i 0;
           
$endwhile false;

           
$stack = array(); // Stack while parsing message
           
$mailtext "";    // Message content
           
$attachment = array(); // Attachments

        
unset($endwhile);
           while(!
$endwhile) {
               if(!
$parts[$i]) {
                   if(
count($stack) > 0) {
                       
$parts $stack[count($stack)-1]["p"];
                       
$i    $stack[count($stack)-1]["i"] + 1;
                       
array_pop($stack);
                   } else {
                       
$endwhile true;
                   }
               }
        
               if(!
$endwhile) {
                
// Message-Part raus fischen
                
unset($partstring);
                foreach(
$stack as $s) {
                    
$partstring .= ($s["i"]+1) . ".";
                }
                
$partstring .= ($i+1);
            
                if(
strtoupper($parts[$i]->disposition) == "ATTACHMENT") { // Wenn's sich beim Part um eine Anlage handelt
                    
$attachment[] = array(
                        
"filename" => $parts[$i]->parameters[0]->value,
                        
"filedata" => imap_fetchbody($mailbox$mailcount$partstring)
                    );
                } elseif(
strtoupper($parts[$i]->subtype) == "PLAIN") { // Wenn's sich bei dem Part um Text handelt
                    
$mailtext .= imap_fetchbody($mailbox$mailcount$partstring);
                }
            }

            if (
$parts[$i]->parts) {
                
$stack[] = array(
                    
"p" => $parts,
                    
"i" => $i
                
);
                
$parts $parts[$i]->parts;
                
$i 0;
            } else {
                
$i++;
            }
        }

    
$anzahl_anlagen count($attachment); // Anzahl der Attachments??
    
$mailtext quoted_printable_decode($mailtext);
    }
?>
als Ergebnis will ich reine Textmails, also Plain Text ohne HTML. Ich vermute (!) das in diesen mime multipart mails die als HTML gesendet werden, die eigentliche Textnachricht nochmal getrennt vorhanden ist. Hat jemand einen Plan wie ich da dran komme?
 
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 08.05.2005, 13:01  
Gast
 
Beiträge: n/a
Standard

ich hab zum debuggen mal ein echo eingesetzt:

PHP-Code:
<?php
                
if(strtoupper($parts[$i]->disposition) == "ATTACHMENT") { // Wenn's sich beim Part um eine Anlage handelt
                    
$attachment[] = array(
                        
"filename" => $parts[$i]->parameters[0]->value,
                        
"filedata" => imap_fetchbody($mailbox$mailcount$partstring)
                    );
                } elseif(
strtoupper($parts[$i]->subtype) == "PLAIN") { // Wenn's sich bei dem Part um Text handelt
                    
$mailtext .= imap_fetchbody($mailbox$mailcount$partstring);
                    echo 
"<font color=red>[b]([/b]$mailtext[b])[/b]</font>,";
                }
            }

?>
an dieser Stelle erscheint der komplette Mailtext so wie gewünscht. Der Aufruf erfolgt nur einmal! Trotzdem bringt mein Browser unten den Feedback text/plain, {text/plain, text/html}



wassn da faul?
 
Alt 08.05.2005, 13:07  
Gast
 
Beiträge: n/a
Standard

Meine lieben Mitmenschen und Leidensgenossen, ich freue mich euch mitteilen zu dürfen das ich den Fehler entdeckt habe:

auf die $mailtext Variable habe ich weiter unten nochmal strip_tags() angewandt. Aus irgend einem Grund macht mir strip_tags() aus dem HTML-Text ein "{text/plain, text/html}".

Ein kleines Problem besteht daher immer noch; Ich will den schwachsinns HTML Code aus den E-Mails nicht. Wenn nicht mit strip_tags(), womit dann? *kopfkratz*
 
Alt 08.05.2005, 14:28  
Gast
 
Beiträge: n/a
Standard

Zitat:
Ich will den schwachsinns HTML Code aus den E-Mails nicht. Wenn nicht mit strip_tags(), womit dann? *kopfkratz*
Dann laß ihn doch weg. Eine korrekte HTML Email besteht aus 2 Parts:
- plain
- HTML
Ist also multipart.

Ist die Email nicht so aufgebaut, dann isses zu 99% automatisch erzeugter SPAM.
 
Alt 08.05.2005, 15:01  
Gast
 
Beiträge: n/a
Standard

na ja, meikel... ganz so kann es ja nicht sein, da ich mit outlook einfach html-content aus dem web an eine test-adresse geschickt hab. das war KEIN SPAM, hätte ja genauso gut was ernstes sein können.

egal... speichere die mails vorläufig auch als HTML ab. Vielleicht funzt strip_tags() ja beim wieder-rausholen aus der db (noch nicht getestet).
 
Alt 08.05.2005, 15:10  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von NewBert
na ja, meikel... ganz so kann es ja nicht sein, da ich mit outlook einfach html-content aus dem web an eine test-adresse geschickt hab. das war KEIN SPAM, hätte ja genauso gut was ernstes sein können.
Laut Spezifikation muß es so sein. Daß Outlook keine Referenz für korrekte Emails ist, setze ich mal als bekannt voraus.

Reine HTML Emails, die keinen Text Part enthalten, sind syntaktisch falsch.
Ist auch logisch so, weil solche Emails mit einem Kommandozeilentool praktisch nicht lesbar bzw. leer sind.

Zitat:
egal... speichere die mails vorläufig auch als HTML ab. Vielleicht funzt strip_tags() ja beim wieder-rausholen aus der db (noch nicht getestet).
Wie Du den Kram (ordentlich escaped) in der DB ablegst, ist Dein Ding. Probleme gibt es möglicherweise dann, wenn UTF8 enthalten ist und Dein MySQL keine UTF8 versteht.
 
Alt 08.05.2005, 16:21  
Gast
 
Beiträge: n/a
Standard

ehrlich gesagt ist es mir völlig egal, ob Outlook syntaktisch korrekte E-Mails sendet oder nicht. Es juckt den Rest der Welt auch nicht, und berechtigt niemanden, "syntaktisch falsche E-Mails" zu ignorieren. Du ignorierst deine Gesprächspartner ja auch nicht und versteht sie trotzdem, auch wenn sie stottern oder lispeln.

Wenn du weiter oben gelesen hättest, wüsstest du das ich den Inhalt der Mail dennoch extrahiert habe, merkwürdigerweise aber strip_tags() hier eine Fehlfunktion hat. Aus welchem Grund auch immer. Ich kann mit 1.1 bzw. 1.2 nicht auf die Parts zugreifen, weil es offenbar nur einen Part gibt. Das speichern in der DB hat jedenfalls nach ersten Telnet-Einsichten geklappt.

Fehlertoleranz ist das A und O eines guten Skripts, deshalb mache ich mir selbst um diese "syntaktisch falschen Mails" sehr wohl Gedanken. Wäre dumm, dies nicht zu tun.
 
Alt 08.05.2005, 16:59  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von NewBert
ehrlich gesagt ist es mir völlig egal, ob Outlook syntaktisch korrekte E-Mails sendet oder nicht. Es juckt den Rest der Welt auch nicht,
Das nun wieder juckt mich nicht. Wer mir ine Email schicken will, der soll sie so verfassen (betrifft nicht nur die Syntax sondern auch die Sprache), daß ich sie lesen und verstehen kann.

Zitat:
und berechtigt niemanden, "syntaktisch falsche E-Mails" zu ignorieren.
Hömma, Alter: ich habe allen Bekannten, die mir schreiben wollen, mitgeteilt, daß ich keine HTML Emails u/o ausführbare Dateianhänge (einschließlich DOC, XLS ua.) haben will. Und wer sich daran nicht hält, der hat eben genauso Pech wie die Vi.ag.ra Verkäufer und Phischer, deren Mails ebenfalls in der Tonne landen.

Zitat:
Du ignorierst deine Gesprächspartner ja auch nicht und versteht sie trotzdem, auch wenn sie stottern oder lispeln.
Wenn sie mit mir auf chinesisch lispeln wollen, schon.

Zitat:
Wenn du weiter oben gelesen hättest, wüsstest du das ich den Inhalt der Mail dennoch extrahiert habe, merkwürdigerweise aber strip_tags() hier eine Fehlfunktion hat.
strip_tags hat keine Fehlfunktion. Allerdings findet Strip_tags nur dann Tags, wenn sie aus handelsüblichen 7BIT ASCII bestehen. Mehr muß es nicht können!

Zitat:
Fehlertoleranz ist das A und O eines guten Skripts, deshalb mache ich mir selbst um diese "syntaktisch falschen Mails" sehr wohl Gedanken. Wäre dumm, dies nicht zu tun.
Dein Ding, Dich auch noch um SPAM zu kümmern.

Kleiner Tip noch am Rande:
achte darauf, daß Dein Script bei der Darstellung vonm HTML Müll vorher eventuell enthaltenes JavaScript sowie alle verweise auf externe SRCs rauslöscht und bei den internen SRCs ausführbare Anhänge ebenfalls nicht beachtet. Sonst wird das Script zum Trojaner- u/o Virenverteildienst.
 
Alt 09.05.2005, 00:14  
Gast
 
Beiträge: n/a
Standard

Klar doch, großer E-Mail Meister

Aber nur zur Info: Ich progge das Skript nicht für meinen privat-unwichtigen Eigenbedarf, sondern es kommt auch bei Geschäftskunden zum Einsatz. Und die legen garantiert wert darauf was sie von ihrer Kundschaft gemailt bekommen.

Ganz einfach:

Code:
if(E-Mail ignorieren = Kunde ignorieren = Kunde vergraulen = Ruf schädigen = Imageschaden = Umsatzverlust = Gewinnverlust = niedrigeres EBIT) { 

$erfolg = 0;

} elseif(besser E-Mails NICHT ignorieren = Kunde das Gefühl geben er sei wichtig = Für guten Ruf sorgen = Image pflegen = Umsatz erhöhen = Gewinne erhöhen = EBIT verbessern){

$erfolg = 1;

}
Eine Formel, die man kennen sollte wenn mal selbständig ist oder eine Firma hat. :wink:

Aber ich geb dir recht, im privaten Bereich wo die E-Mails meist unwichtig sind kann man auch mal was löschen oder ignorieren ohne sich gross drum zu kümmern, seinen Kumpel anrufen und sagen "ey hömma alter, ich hasse HTML E-Mails. Geh kacken alter. Schick mir Plain Text oder ich mach dich plain"

Das geht aber nicht bei Kunden. Verstehste?

jetzt müsste dir eine aufgehen.

 
Alt 09.05.2005, 00:30  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von NewBert
Aber nur zur Info: Ich progge das Skript nicht für meinen privat-unwichtigen Eigenbedarf, sondern es kommt auch bei Geschäftskunden zum Einsatz. Und die legen garantiert wert darauf was sie von ihrer Kundschaft gemailt bekommen.
Sowas programmiert man grundsätzlich anders:
- postfix reicht die Mail an locale User an ein Shellscript weiter, welches die Mail zustellt. In dem Falle dann weder MBOX noch maildir sondern eben MySQL.
- setzt einen eigenen Server voraus, den man allerdings haben sollte, wenn man Geschäftskunden zufriedenstellen will.
 
 


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
HILFE: zurücksenden von Mails deren Mailadresse falsch ist PHP Tipps 2006 3 01.05.2006 12:50
[Erledigt] Exim --- Mailserver empfängt keine Mails Server, Hosting und Workstations 4 23.12.2005 18:28
Mails kommen nicht an mit Hamster/Mercury bicpi PHP-Fortgeschrittene 10 26.10.2005 15:03
mail() versucht die Mails als wwwrun an den SMTP Server zu l Server, Hosting und Workstations 3 15.06.2005 11:25
was bedeutet: standard MIME compliant PHP Tipps 2005 5 26.04.2005 13:10
Senden von mails mit Anlage aber die Anlage ist corrupt PHP-Fortgeschrittene 5 20.04.2005 12:19
Timeout beim Mails versenden PHP-Fortgeschrittene 5 08.03.2005 15:48
Mails mit PHP empfangen themonk PHP Tipps 2005 11 04.01.2005 20:09
[Erledigt] Mails und MySQL Datenbanken 2 10.06.2004 13:25

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php imap_fetchbody multipart emails, email partstring, php create mime multipart mail from html, php imap_fetchbody corrupt image, php imap_fetchbody mercury, mime mails php

Alle Zeitangaben in WEZ +2. Es ist jetzt 13:22 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.