Class: Imap/pop3 reader

Door Felix b, 20 jaar geleden, 11.730x bekeken

Ik heb deze class geschreven voor een CRM systeem zodat emails in het systeem konden verwerkt worden. Hij kan gebruikt worden om je imap en/of je pop3 mailbox uit te lezen.

Hoe te gebruiken:

(imap module moet geinstalleert staan op de server)

je roept hem aan als
$imapMail = new imapMail("gebruikersnaam","password","serverAdres","portnr","mailboxnaam",$opties);

opties moet een array zijn waarin je defineert wat je wilt gebruiken(imap of pop3) en bijvoorbeeld ssh wilt gebruiken.
$opties[0] = "pop3";
$opties[1] = "ssh";

nadat je hem heb aangemaakt kan je een connectie opzetten
$imapMail->connect();
Deze returned true of false op basis of hij connectie heeft aan kunnen leggen

als hij een connectie heeft kunnen leggen kan je je mails op 2 manieren ophalen.
Met $imapMail->getMails();
Deze functie haalt al je mails op. Hij heeft ook nog 2 opties.
1ste deleteFromServer als deze op true word gezet worden je mails na het ophalen van de server verwijdert.

2de uids dit is een array variable waarin je unieke berichten id's kan inzetten zodat die worden overgeslagen bij het ophalen van mails, dit heb ik toegevoegt vanwege de slecht/niet bestaande ondersteuning van de SEENFlag in pop3. Hiermee kan je toch steeds nieuwe berichten ophalen zonder de Seenflag.

Je kan ook de mails ophalen via getUnseenMails.
Deze functie kan je gebruiken voor imap om niet gelezen mailtjes op te halen.
1 optionele varialble turnSeen is om mailtje op gelezen te zetten zodat ze de volgende keer niet opgehaalt worden.

allebij deze functies returnen de berichten, in een array ,op deze manier:
$message['subject']
$message['fromaddress']
$message['toaddress']
$message['ccaddress']
$message['bccaddress']
$message['messageId'](kan worden gebruikt voor uids)
$message['date']
$message['attachment'] is een array met alle gegevens van de attachment(s) erin.
De array ziet erzo uit:
$message['attachment'][0]["name"] is de filenaam.
$message['attachment'][0]["goods"] is het bestand zelf.
$message['attachment'][0]["type"] hoe hij binnen gehaald is.(embedded of attachment)

uit lezen kan op deze manier gedaan worden

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?
if($aMessages = $imapMail->getMails(false,$uids))
{

     while(list($key,$message) = each($aMessages))
     {

           $subject = $message['subject']
     }
}

?>


$imapMail->changeMailbox("mailboxNaam");
is om van mailbox te wisselen input is de mailbox naam je krijgt een boolean terug(true gelukt false niet gelukt)

$imapMail->closeConnection()
kun je weer de connectie sluiten;

totale voorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?
include("imap.class.php");
$counter     = 0;
$opties[$counter++] = "pop3";
$imapMail = new imapMail("gebruikersnaam","password","serverAdres","portnr", "mailboxnaam",$opties);
if($imapMail->connect())
{

    if($aMessages = $imapMail->getMails(false))
    {

        echo count($aMessages)." berichten zijn binnen gehaalt<br/>";
        while(list($key,$message) = each($aMessages))
        {

            // doe hier binnen wat met de binnengehaalden berichten
            echo $key." ".$message['subject']."<br/>";
        }
    }

    else
    {
        echo "er is nog geen connectie";
    }

        $imapMail->closeConnection();
}

else
{
    echo "kan connectie niet opbouwen";
}


?>


Todo:
- Mogelijkheid om attachments downloaden uit te zetten

vragen/opmerkingen kunnen natuurlijk gestelt worden.

updates:
embedded gedeelte geheel omgegooit

Gesponsorde koppelingen

PHP script bestanden

  1. class-imappop3-reader

 

Er zijn 35 reacties op 'Class imappop3 reader'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Crispijn -
Crispijn -
20 jaar geleden
 
0 +1 -0 -1
Ziet er heel goed uit. Mooi werk. Misschien kan je om het wat laagdrempelig te maken een voorbeeldje toevoegen hoe je de berichten uitleest. :)

edit: Dat heb je natuurlijk al wel, alleen misschien een iets uitgebreider voorbeeld :)
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Wow, als ik 't zo zie precies wat ik al een poos zoek!
Ga 't zsm uitproberen!

Edit:
Hoe gaat 't met HTML mails om?
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
heb een voorbeeldje neergezet hoe je de berichten uit kan lezen.

in de body krijg je gewoon de html terug word verder niks aan gedaan.

Over de 2000+ berichten zijn er al mee binnen gehaalt geen problemen nog gehad met html berichten enige wat lastig is om inner pictures weer te koppelen maar hoe ik dat heb opgelost zit in me emailclient en niet in me imap functie.

De imap functie is alleen zo gemaakt dat hij de mogelijkheid geeft om berichten binnen te halen(inner pictures worden ook binnen gehaalt alleen niet in de body zelf gekoppelt).
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Je voorbeeld klopt helaas niet echt ;)

Dit zou wel moeten werken als het goed
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
require("imapclass.php");

$opties[0] = "notls";

$imapMail = new imapMail("LOGIN","PASS","SERVER","143","INBOX",$opties);
$imapMail->connect();

$aMessages = $imapMail->getMails();

    while(list($key,$message) = each($aMessages)) {
        $subject .= $message['subject']."<br>";
    }


$imapMail->closeConnection();

echo $subject;
?>
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
Heb hem net gerunned werkt gewoon goed
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Lijkt me sterk, je vergeet bij 't aanmaken van 't object al de mailbox naam ;) Verder werkt ie wel goed hoor! (alleen bijlages nog niet geprobeerd)
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
je heb helemaal gelijk ik had bij het aanmaken van me object gekopieert van me helescript zodat ik niet alles over hoefde te tikken
Crispijn -
Crispijn -
20 jaar geleden
 
0 +1 -0 -1
@Tristan: wat vul jij op de plek van INBOX in? Het volledige emailadres van het account dat je uit wil lezen?
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
@crispijn - INBOX is altijd standaard, dit kun je vaak ook veranderen naar bijv. Sent en Trash, of welke andere IMAP map er ook bestaat. Het is dus zeg maar welke map met mails je vanaf de server wil openen. POP3 heeft volgens mij alleen maar INBOX, of je moet 'm daar leeg laten, dat durf ik niet te zeggen....
Crispijn -
Crispijn -
20 jaar geleden
 
0 +1 -0 -1
aaah, check :)

Ik kan nu wel verbinding maken maar ik krijg een aantal errors terug:

Notice: Undefined variable: options in /home/sitepad/scripts/class.getmail.php on line 27
Notice: Undefined property: stdClass::$ccaddress in /home/sitepad/scripts/class.getmail.php on line 114
Notice: Undefined property: stdClass::$bccaddress in /home/sitepad/scripts/class.getmail.php on line 115
Notice: Undefined property: stdClass::$parts in /home/sitepad/scripts/class.getmail.php on line 195
Notice: Undefined property: stdClass::$parts in /home/sitepad/scripts/class.getmail.php on line 195
Notice: Undefined variable: selectBoxDisplay in /home/sitepad/scripts/class.getmail.php on line 370
Notice: Undefined variable: prefix in /home/sitepad/scripts/class.getmail.php on line 430
Notice: Undefined variable: prefix in /home/sitepad/scripts/class.getmail.php on line 430
Notice: Undefined variable: prefix in /home/sitepad/scripts/class.getmail.php on line 430

Voor de rest wel alles over genomen uit het voorbeeld van Felix... Dus het werkt nog niet foutloos
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
ligt aan je server instellingen, Het zijn geen errors maar meldingen van variable die niet worden gebruikt (je error reporting staat hoog)

oplossingen:
Set error_reporting in php.ini to the required value E_ALL & ~E_NOTICE
of
die variable langs gaan en checks inbouwen dat ze alleen gebruikt worden als er wat in word gedaan.
Jacco Engel
Jacco Engel
20 jaar geleden
 
0 +1 -0 -1
Quote:
je error reporting staat hoog


Die van jou niet dan? Die van mij standaard op e_all.... En ik ben van mening dat alle scripts in de lib hier E_ALL (zonder uitzondering) valid meoten zijn
Crispijn -
Crispijn -
20 jaar geleden
 
0 +1 -0 -1
Oke, check. Je hebt gelijk. Maar die checks maken 't natuurlijk wel af ;) In een debug/ontwikkel fase staat natuurlijk altijd de error reporting op hoog :)
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
ik gebruik om te testen een schone installatie van xamp op windows en mamp op mac nergens last van zal vanavond wel alle variable een definieren maar het zou geen probleem moeten zijn om het zo te runnen
Crispijn -
Crispijn -
20 jaar geleden
 
0 +1 -0 -1
Het is 'geen probleem' maar wanneer ik de error reporting op zijn hoogst zet krijg ik dus dat lijstje met notices... Deze moeten eigenlijk weg wil het script helemaal netjes zijn
Han eev
Han eev
20 jaar geleden
 
0 +1 -0 -1
Even snel bekeken, waar is je commentaar? :P (Ook wel gele stukkies)
Steen
steen
20 jaar geleden
 
0 +1 -0 -1
gmail doet het zeker niet?
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
Gmail doet het wel moet je het wel instellen dat het open is in de gmail instelling menu
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Om de één of andere reden pakt ie de bijlagen niet mee... Waarde blijft leeg.
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
embedded attachment gedeelte verbeterd
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Nu worden inderdaag wel m'n bijlagen weergegeven. Alleen als ik een plaatje in de mail mee stuur (cid verhaal) werkt 't niet, maar da's geen ramp :)
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
Heb het embedded deel weer verandert omdat hoe het werkte ging af en toe gewoon niet goed door het grote verschil hoe embedded attachments werken.

Als je nu weer dingen niet ontvangt kan je de marge op deze regel

if(strlen(trim($itemInhoud))+20 >= $lengthItem && strlen(trim($itemInhoud))-20 <= $lengthItem)
wat groter zetten(20+);
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Helaas, 't mag niet werken... Ook niet als ik de waarden wat groter zet. Het plaatje komt er wel als "gewone" bijlage bij te staan :) Of ik doe wat verkeerd. Ga t van 't weekend uitzoeken :)
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
in 1 van me oudere berichten kun je lezen dat het vervangen van inner pictures niet door de imap functies word afgehandeld
Quote:
De imap functie is alleen zo gemaakt dat hij de mogelijkheid geeft om berichten binnen te halen(inner pictures worden ook binnen gehaalt alleen niet in de body zelf gekoppelt).


heb wel een functie geschreven die dat oplost bij het displayen alleen dat hoort niet bij de functionaliteit van me imap functie.
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Wat bedoel je dan precies met embedded attachments? Ik had die tekst inderdaad gelezen, maar dacht dat je 't opgelost had :)
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
kijk hoe inner plaatjes werken is door het plaatje mee te sturen in de tekst het plaatje zelf haal ik er al uit en krijg je mee in de attachment array maar de link in de body blijft nog wijzen naar het plaatje in de tekst.
die img tag <img src="jouwplaatje" /> moet je gaan vervangen naar het plaatje die je gedownload hebt met de imap functie.

dus gang van zaken word:
1. email binnen halen.
2. attachments weg schrijven.
3. <img> tag veranderen naar naar waar het plaatje is weggeschreven

ik zelf gebruik deze functie(beetje verbasterde versie van me rip alle data van een site)
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?
function getImageTag($body)
    {

        $gCounter     = 0;
        $offset     = 0;
        while(($counter     = strpos($body,"<img",$offset)) !== false)
        {

            $returnArray[$gCounter]['begin'] = $counter;
            $counter++;
            $totalString = "";
            while($body[$counter] != ">")
            {

                $totalString .= $body[$counter];
                if(!$atrC)
                {

                    if($body[$counter] == " ")
                    {

                        $kind="";
                    }

                    else if($body[$counter] == "=")
                    {
                        
                        $atrC = true;
                    }

                    else
                    {
                        $kind .= $body[$counter];
                    }
                }

                else
                {
                    if($body[$counter] == '"')
                    {

                        $counterAtr++;
                    }

                    else if($counterAtr == 2 || $body[$counter] == " ")
                    {

                        $atrC = false;
                        if(!empty($kind) && !empty($atrData))
                        {

                            $returnArray[$gCounter][$kind] = $atrData;
                        }

                        
                        $kind        = "";                    
                        $atrData     = "";
                        $counterAtr = 0;
                    }

                    else
                    {
                        $atrData  .= $body[$counter];
                    }
                }

                            
                $counter++;
            }

            $returnArray[$gCounter]['eind'] = $counter;
            $returnArray[$gCounter]['total'] = "<".$totalString.">";
            
            $kind        = "";                    
            $atrData     = "";
            $counterAtr = 0;
            $offset     = $counter;
            $gCounter++;
        }

        return $returnArray;
    }

?>

en dan dit stukje code te runnen

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?
$rAttachments
= $database->Query("SELECT * FROM Attachment WHERE EmailID = ".$mid);
            $body = html_entity_decode($aEmail['Body'],ENT_QUOTES);
            $arrayImages = $getImageTag($body);
            
            while($aAttachments    = odbc_fetch_array($rAttachments))
            {

                $strFileType     = strrev(substr(strrev($aAttachments['TrueFilename']),0,4));
                
                $eind = count($arrayImages);

                if ($strFileType == ".jpg" || $strFileType == "jpeg" || $strFileType == ".gif" || $strFileType == ".png")
                   {

                       $counter = 0;
                       while($counter < $eind)
                       {

                           
                           if(strpos($arrayImages[$counter]['total'],$aAttachments['TrueFilename']) !== false)
                           {
                       
                               $height = "";
                               $width  = "";
                             if(strpos($arrayImages[$counter]['total'],"http://") === false && strpos($arrayImages[$counter]['total'],"www.") === false)
                             {

                                 if(isset($arrayImages[$counter]['height']))
                                   {

                                       $height = 'height="'.$arrayImages[$counter]['height'].'"';
                                   }

                                   
                                   if(isset($arrayImages[$counter]['width']))
                                   {

                                       $width = 'width="'.$arrayImages[$counter]['width'].'"';
                                   }

                                   
                                   $replace = '<img '.$height.' '.$width.' src="attachments/'.$aAttachments['Filename'].'">';
                                   $body = str_replace($arrayImages[$counter]['total'],$replace,$body);
                             }
                           }

                           $counter++;
                       }           
                   }

?>


ik zelf gebruik een database om de data op te slaan eerst maar dat is natuurlijk niet perse nodig.
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Super bedankt voor je snelle reacties! Ik ga 't zsm proberen, 't klinkt veelbelovend!
Felix b
Felix b
20 jaar geleden
 
0 +1 -0 -1
Heb het hele embedded gedeelte van de attachments verandert moet nu stuk betrouwbaarder zijn.

volgende punt word comments en mogelijkheid voor het uitzetten van attachments downloaden
Tristan nvt
Tristan nvt
20 jaar geleden
 
0 +1 -0 -1
Wat misschien ook nog een idee is, is om een functie erin te zetten die alleen de afzender, onderwerp en datum eruit haalt. Op de manier hoe ik 't nu doe, gaat de flag gelijk naar "SEEN", zonder dat je 't bericht geopend hebt. Ik zal na m'n vakantie eens naar de embedded attachments kijken :)
Sol
sol
19 jaar geleden
 
0 +1 -0 -1
Felix, kan je eens een voorbeeld geven hoe je de array voor attachments gebruikt om bvb een naam van de att weer te geven? want dit lijkt me niet te lukken..
Marcel van Dijk
Marcel van Dijk
17 jaar geleden
 
0 +1 -0 -1
Heeft iemand in de tussen tijd dit script toevallig al aangepast zodat berichten niet direct als SEEN worden gemarkeerd? Ik ben al een tijdje aan het rommelen maar ik krijg het niet voor elkaar...
Niek s
niek s
17 jaar geleden
 
0 +1 -0 -1
Kijk eens op regel 99.
Marcel van Dijk
Marcel van Dijk
17 jaar geleden
 
0 +1 -0 -1
Helaas, dat werkt dus niet... Heb het al in alle mogelijke varianten geprobeerd maar ook dan worden de berichten direct als seen gemarkeerd...
Chris Martinus
chris Martinus
15 jaar geleden
 
0 +1 -0 -1
Beste Felix B of andere deskundigen,

Het is alweer een tijdje terug dat je hiermee bezig bent geweest. Toch heb ik nog een vraagje.

Je class_imappop3_reader werkt, met een kleine aanpassing ($opties[$counter++] = "pop3/novalidate-cert";) uitstekend en ik maak er inmiddels dankbaar gebruik van.

Ik probeer echter een routine te maken waarmee ik de jpg attachments automatisch wil kantelen afhankelijk van de exif orientation.

Deze exif informatie komt niet mee met het omzetten van de $message['attachment'][0]["goods"] naar een afbeelding in jpg formaat.

$Image = imagecreatefromstring($message['attachment'][0]["goods"]);
imagejpeg($Image ,'file.jpg');
rename('file.jpg', $Naam_van_het_jpg_bestand);

Hopelijk ben je nog actief en online op dit forum en weet je een oplossing.

Met vriendelijke groet,
Chris Martinus.
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jeroen VD
Jeroen VD
15 jaar geleden
 
0 +1 -0 -1
Sigh... Laatste reactie is 2 jaar geleden, open een nieuw topic als je een vraag hebt. Niet te vergeten dat het script 5 jaar oud is.

Verder haal je het nu nutteloos op

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. class-imappop3-reader

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.