Autor Zpráva
matak
Profil
hledám celý den, ale netušil jsem, že je to stále skoro neuskutečnitelný úkon, našel jsem snad jen tyto zdroje


https://github.com/plancake/official-library-php-email-parser
nevhodné, neumí parsovat attachments

http://stuporglue.org/mailreader-php-parse-e-mail-and-save-attachments-php-version-3/
spousta nesmyslů jako ukládání do dtb, ale neumí si poradit s většinou emailů

http://code.google.com/p/php-mime-mail-parser/
mailparse extension nelze nainstalovat ani na linux server ani na windows :( prostě ani na jednom se mi to nepodařilo

http://www.nameko.org
nepoužitelné, když nejsou v emailu všechny hlavičky které očekává neumí zpracovat


má někdo ještě tip na další? existuje vůbec něco použitelného?
Micruss
Profil
zkus phpMailer knihovnu
matak
Profil
Micruss:
jestl se nepletu to umí emaily odesílat ne parsovat
aDAm
Profil
matak:
tak to přeju pevné nervy...posledních několik dní zápasím s imap_ funkcemi php pro vytvoření jednoduchého webmail rozhraní do jedné aplikace. Toho co vymyslel jak se budou mail zprávy vytvářet a ukládat bych nejraději vzal trubkou přes hlavu....načtení emailů, tedy jen jejich IDček což je vlastně jen interval 1-x je jeden příkaz, načtení jednotlivých zpráv pak v cyklu co mail to příkaz, pak načtení hlavičky každého mailu, pak vyčtení hlaviček, pak načtení struktury, pak vyčtení struktury.....proč to dělat jednoduše když to jde složitě že ;)
matak
Profil
tak s timhle zapasim uz tak 3 roky :), ale pomalinku vzdavam ze existuje neco co mi dokáže parsovat email v jeho raw podobě
DarkMeni
Profil
Nepodařilo se mi najít, jak vypadá raw podoba emailu, ale jestli je to jen jeho zdroják, jako třeba:
Received: via dmail-2008.19 for +INBOX;
        Tue, 3 Feb 2009 19:29:12 -0600 (CST)
Received: from abc.luxsci.com ([10.10.10.10])
    by xyz.luxsci.com (8.13.7/8.13.7) with
        ESMTP id n141TCa7022588
    for <user-999@xyz.luxsci.com>;
        Tue, 3 Feb 2009 19:29:12 -0600
Return-Path: <test@sender.com>
Received: from [192.168.0.3] (verizon.net [44.44.44.44])
   (user=test@sender.com mech=PLAIN bits=2)
   by abc.luxsci.com (8.13.7/8.13.7) with
   ESMTP id n141SAfo021855
   (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA
   bits=256 verify=NOT) for <test@domain.com>;
   Tue, 3 Feb 2009 19:28:10 -0600
Message-ID: <4988EF2D.40804@domain.com>
Date: Tue, 03 Feb 2009 20:28:13 -0500
From: "Test Sender" <test@sender.com>
User-Agent: Thunderbird 2.0.0.19 (Windows/20081209)
MIME-Version: 1.0
To: "Test Recipient" <test@domain.com>
Subject: Example Message
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
X-Comment: Lux Scientiae SMTP Processor Message ID -
   1233710941-9110394.93984519

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01
 Transitional//EN">
<html><head></head>
<body bgcolor="#ffffff" text="#000000">
<b>&nbsp;Example HTML-formatted
email Message.<br></b>
</body></html>
Tak na to si můžeš napsat vlastní parser, ne?
Ale když je ten raw format něco jinýho, mohl bys mi dát nějakej příklad, jak to asi tak vypadá?
DJ Miky
Profil
DarkMeni:
Ano, to je surová podoba e-mailu, nicméně může být i složitější. Pokud má soubor více částí (tzv. multipart) – např. čistý text, text formátovaný HTML, přílohy (které se ještě navíc enkódují do tisknutelných znaků) apod., může to vypadat třeba takhle:
    From: Laura Rios <laura@oara.sf.ca.us>
    To: steve@ntecom.za
    Subject: Sara is two!
    Mime-Version: 1.0
    Content-Type: multipart/mixed; boundary="Snip snip snip"

    --Snip snip snip
    Content-Type: text/enriched; charset="us-ascii"

    Hi, Steve.  Sara had her second birthday yesterday.  Can you believe it?
    She is so <bold>big</bold>!  Now if we can just live through the
    "terrible twos" for a year, <italic>sigh</italic>.

    Here are a few words from her.  I've also scanned in a picture of her
    party.  Tell your boss thanks for letting us keep in touch by email.


    Laura

    --Snip snip snip
    Content-type: audio/basic
    Content-transfer-encoding: base64
    Content-description: Sara says "I love you, Steve" (awww)

    /Xr++/hoX2lqeXt8d/7z8/D5+PLw7/b+9fD09319/vz5f3j//Pz9fHp7fvrs9Wz/eH59d
    /////////////////y8=

    --Snip snip snip
    Content-type: image/gif
    Content-transfer-encoding: base64
    Content-description: Cutting the cake, sort of

    R0lGODdhQAHIAKMAAAAAAP+2bQAAACQAAAAASEgAAAAkSEgkJG0kJJEkAABIkZFIJCRttrZt
    l7Vry4B9aM+yKjifMosAADs=

    --Snip snip snip--
(příklad převzat odsud)

Samozřejmě i na to jde napsat vlastní parser, ale zabere to zbytečně moc času.
matak
Profil
s tim vlastnim parserem si nejsem jisty, myslím, že to není úplně triviální záležitost a bude to dost složité, protože existuje mnoho standardů a v praxi je také spousta serverů porušuje a je to dost guláš, ve kterém se musí ten programátor vyznat, určitě to není práce na víkend
DarkMeni
Profil
Ještě sháníš ten parser nebo si už něco našel?
matak
Profil
nenašel, pomocí Jyxo\Parseru jsem si email rozparsoval do objektu a s tim pracuju idealni to neni, mam proste dvoji data, zdroj a jeste objekt ve kterem jsou rozhazene prilohy, hlavicky, contenty atd.
DarkMeni
Profil
Něco sem zkusil napsat, ale taky je to psaný objektově - dá se s tim udělat třeba něco takovýho:
(A nepodarí si zatim s typem message/partial)

<?php
include "raw_mail_parser.php";
$mail = new RAWMailParser();
$mail->setCharset('utf-8')->setIgnoreLevel(2)->setTypePriority('text/html')->load("message_1207.eml");
//$mail->debug();
$sender = $mail->getSender();
echo 'Odesílatel: '.$sender['name'].' <'.$sender['email'].">\n",
    'Datum: '.$mail->getDate('d.m.Y H:i:s')."\n",
    'Předmět: '.$mail->getSubject()."\n\n",
    $mail->getMessage('text/html')."\n\n";
$embedded_message = $mail->getEmbeddedMessage('text/html');
if($embedded_message){
    echo "-------Původní zpráva-------\n";
    $headers = $mail->getEmbeddedHeaders();
    if($headers){
        $sender = $headers['sender'];
        echo 'Od: '.$sender['name'].' <'.$sender['email'].'>'."\n",
            'Datum: '.$mail->getDate('d.m.Y H:i:s', $headers['timestamp'])."\n",
            'Předmět: '.$headers['subject']."\n\n";
    }
    echo $embedded_message;
}
echo "\nPočet příloh: ".count($mail->getAttachmentsList())."\n";
$mail->saveAttachments('Attachments/');
echo "\n\nLog: ";
var_dump($mail->getProcessLog());
$mail->freeMemory();
var_dump($mail->getSavedList("Attachments/"));
?>

Takže kdyby si chtěl, tak ti můžu poslat zdroják třídy
Alphard
Profil
Ideálně zdrojáky zveřejněte, jestli funguji. Tazatel není jediný, koho to může zajímat. Bez nich je [#11] DarkMeni zcela bezcenné.
DarkMeni
Profil
Ten zdroják má kolem 600 řádků (asi 25 000 znaků - 25kB) takže by ho to tu asi po 2000 znacích odseklo. Spíš sem to chtěl poslat matakovi na email kdyby měl o ten zdroják zájem.
matak
Profil
rád se podívám, info@romanmatena.cz, ale jak říkám zpracovávám maily v počtu okolo milionu, je v tom úplně všechno, špatné rfc, nevalidní pravidla, formáty, atd. špatně natavené kodování jiný content, prostě potřebuju něco co fakt počítá se vším něco co používá thunderbird, nebo outlook :)

ale rád se podívám co máš
DarkMeni
Profil
Nebo to vlastně můžu dát na pastebin.com, to bude asi jednodušší:
http://pastebin.com/v37ULpFy

Co sem to testoval, tak s většinu emailu zpracoval docela dobře, ale záleží na tom, co s tim pak budeš potřebovat dělat dál (jako jestli děláš nejakou emailovou aplikaci jako seznam.cz nebo něco jinýho)
A zjistil sem že existuje ještě několik dalších typů, na který sem nenašel příklad jak takovej typ vypadá:
třeba message/partial, message/external-body, multipart/signed a multipart/encrptet

Takže jestli máš i několik emailu v tomto typu, tak by pak možná šlo dopsat podporu i pro tyhle typy, ale chtělo by to nějakej příklad s takovým emailem

Edit: oprava několika chyb v dokumentaci
matak
Profil
díky, mrknu na to



snad jen signed, ostatni mi z hlavy nic nerika, signed bude elektronicky podepsaný myslím

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: