[PHP / IMAP] PHP wil niet connecten naar imap

Pagina: 1
Acties:
  • 319 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • XiN-eViL
  • Registratie: Maart 2004
  • Laatst online: 29-08 10:13

XiN-eViL

kzie-nie-veel

Topicstarter
OK, nadat m'n vorige topic was gesloten ben ik zelf verder op onderzoek uitgegaan (jaja, ik leer het mss nog wel eens) op de php site.
Om te proberen wil ik eerst gewoon mn mailbox openen en kijken hoeveel berichten erin stonden.
Dat deed ik met dit script:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php

/* Dit script haalt van alle mails van <mail>@xinevil.com
  de bijlages en zet ze in een map */

$imapmail = imap_open('{imap.xinevil.com:143/imap}INBOX','<mail>@xinevil.com','<wachtwoord>');

$num_msg = imap_num_msg($imapmail);

echo $num_msg;

imap_close($imapmail);

?>

Dit werkte niet. Ik kreeg een leeg scherm, en als ik het woordje INBOX wegliet (mocht volgens de php-site) kreeg ik een fout en dat ik in mn log moest kijken (maar die kan ik niet vinden).
Dus ik dacht, ok misschien is de mailbox fout, laten we even de mailboxen listen.
Dat deed ik met dit script (rechtstreeks van php-site):
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$mbox = imap_open("{imap.xinevil.com:143/imap}", "<mail>@xinevil.com", "<wachtwoord>", OP_HALFOPEN)
     or die("can't connect: " . imap_last_error());
 
$list = imap_getmailboxes($mbox, "{imap.xinevil.com}", "*");
if (is_array($list)) {
  reset($list);
  while (list($key, $val) = each($list)) {
   echo "($key) ";
   echo imap_utf7_decode($val->name) . ",";
   echo "'" . $val->delimiter . "',";
   echo $val->attributes . "<br />\n";
  }
} else {
  echo "imap_getmailboxes failed: " . imap_last_error() . "\n";
}
 
imap_close($mbox);
?> 


Maar dan krijg ik deze fout:
can't connect: Certificate failure for imap.xinevil.com: self signed certificate: /C=US/ST=NY/L=New York/O=Courier Mail Server/OU=Automatically-generated IMAP SSL key/CN=localhost/Email=postmaster@example.com
Wat doe ik nu fout :? ?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 15:14

Creepy

Tactical Espionage Splatterer

Niks waarschijnlijk. Je maakt een connectie via SSL, en je krijgt een niet officieel gesigned certificaat terug. Er zal wel ergens een optie zijn om een self-signed certificaat wel te accepteren. En anders kan je ook nog eens proberen om zonder SSL een connectie te maken (dat is ook via een andere poort waarschijnlijk, aangezien je zelf niet expliciet opgeeft dat je connectie via SSL moet verlopen).

[ Voor 15% gewijzigd door Creepy op 21-01-2005 15:03 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • XiN-eViL
  • Registratie: Maart 2004
  • Laatst online: 29-08 10:13

XiN-eViL

kzie-nie-veel

Topicstarter
Creepy schreef op vrijdag 21 januari 2005 @ 15:02:
Niks waarschijnlijk. Je maakt een connectie via SSL, en je krijgt een niet officieel gesigned certificaat terug. Er zal wel ergens een optie zijn om een self-signed certificaat wel te accepteren. En anders kan je ook nog eens proberen om zonder SSL een connectie te maken (dat is ook via een andere poort waarschijnlijk, aangezien je zelf niet expliciet opgeeft dat je connectie via SSL moet verlopen).
Hmmmm, maar als ik imap.xinevil.com in outlook invul met dezelfde username en password, doet hij het wel, en zegt ie ook dat het via poort 143 gaat :? .

Edit:
Misschien weet iemand waar ik de connect-regels kan vinden in squirrelmail? Want deze kon ik met 1ClickSite installeren zonder iets te veranderen, maar ik zie in al die bestandjes door de bomen het bos niet meer. Maar ik ben er al wel achter dan imap.xinevil.com en poort 143 klopt.

[ Voor 19% gewijzigd door XiN-eViL op 21-01-2005 15:27 ]


Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
Ik heb/ben bezig met een eigen mail client in php middels IMAP
zal mijn connect regels even voor je opzoeken...

edit:

PHP:
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
//
// Connect to IMAP
// 

function mbox_connect_imap() {

    global $mbox;

    $mail_user  = "x";
    $mail_pass  = "x";
    
    if ($_GET['box']) {

        $box = $_GET['box'];

    } else {

        $box = "INBOX";

    }

    $mbox = imap_open("{localhost:143}$box", "$mail_user", "$mail_pass");
    
    static $mbox;

}

//
// Disconnect from IMAP
//

function mbox_disconnect_imap() {

    global $mbox;

    imap_close($mbox);

}


edit2: AARG LAAT IK DAN WEL ME PWD ERUIT KNIPPEN |:(

[ Voor 102% gewijzigd door vriesdude op 21-01-2005 15:35 ]

/dev/null


Acties:
  • 0 Henk 'm!

  • XiN-eViL
  • Registratie: Maart 2004
  • Laatst online: 29-08 10:13

XiN-eViL

kzie-nie-veel

Topicstarter
OK, om nu het aantal berichten te krijgen, gebruik ik deze code:
PHP:
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
<? 
// 
// Connect to IMAP 
//  

function mbox_connect_imap() { 

    global $mbox; 

    $mail_user    = "x"; 
    $mail_pass    = "x"; 
     
    if ($_GET['box']) { 

        $box = $_GET['box']; 

    } else { 

        $box = "INBOX"; 

    } 

    $mbox = imap_open("{imap.xinevil.com:143}$box", "$mail_user", "$mail_pass"); 
     
    static $mbox; 

} 

// 
// Disconnect from IMAP 
// 

function mbox_disconnect_imap() { 

    global $mbox; 

    imap_close($mbox); 

} 

mbox_connect_imap();

echo 'test';

$num_msg = imap_num_msg($mbox);

echo $num_msg;

mbox_disconnect_imap();
?>


Maar de uitvoer is gewoon 'test'. Ook als ik van imap.xinevil.com localhost maak, doet hij niks. Terwijl ik zeker weet dat ik poort 143 moet hebben, want die gebruikt outlook ook.

Acties:
  • 0 Henk 'm!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Krijg je helemaal geen errors? ( error_reporting(E_ALL); )
En je hebt wel die 2 x'jes in je echte username en password veranderd? ;)

[ Voor 4% gewijzigd door Radiant op 21-01-2005 16:30 ]


Acties:
  • 0 Henk 'm!

  • XiN-eViL
  • Registratie: Maart 2004
  • Laatst online: 29-08 10:13

XiN-eViL

kzie-nie-veel

Topicstarter
Radiant schreef op vrijdag 21 januari 2005 @ 16:30:
Krijg je helemaal geen errors? ( error_reporting(E_ALL); )
En je hebt wel die 2 x'jes in je echte username en password veranderd? ;)
Die 2 x'jes heb ik vervangen.
En dit zijn de fouten:
Warning: imap_open(): Couldn't open stream {imap.xinevil.com:143}INBOX in /data/members/paid/x/i/xinevil.com/htdocs/ic/mail.php on line 16
test
Warning: imap_num_msg(): supplied argument is not a valid imap resource in /data/members/paid/x/i/xinevil.com/htdocs/ic/mail.php on line 38

Warning: imap_close(): supplied argument is not a valid imap resource in /data/members/paid/x/i/xinevil.com/htdocs/ic/mail.php on line 30

Notice: (null)(): Certificate failure for imap.xinevil.com: self signed certificate: /C=US/ST=NY/L=New York/O=Courier Mail Server/OU=Automatically-generated IMAP SSL key/CN=localhost/Email=postmaster@example.com (errflg=2) in Unknown on line 0
Maar de server bestaat echt (dit vul ik ook in in outlook) het lijkt wel of ie SSL wil doen maar dat moet niet :S .

Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
ok, het lijkt er op dat je mailserver deze vorm van beveiliging niet accepteerd.
als het een exchange server is (dat idee krijg ik een beetje door de laatste serie text) kun je gebruik maken van kerobos of een lagere vorm van beveiliging toestaan in exchange.

Als het geen exchange server is moet je de server configuratie nalopen (is een verbinding van dit adres wel toegestaan bijv ?), hoe hoog is de authenticatie beveiliging en ondersteund PHP dit?
Opmerking: Depending how the c-client was configured, you might also need to add --with-imap-ssl=/path/to/openssl/ and/or --with-kerberos=/path/to/kerberos into the PHP configure line.
bron: http://nl.php.net/manual/nl/ref.imap.php

/dev/null


Acties:
  • 0 Henk 'm!

  • XiN-eViL
  • Registratie: Maart 2004
  • Laatst online: 29-08 10:13

XiN-eViL

kzie-nie-veel

Topicstarter
vriesdude schreef op vrijdag 21 januari 2005 @ 18:26:
ok, het lijkt er op dat je mailserver deze vorm van beveiliging niet accepteerd.
als het een exchange server is (dat idee krijg ik een beetje door de laatste serie text) kun je gebruik maken van kerobos of een lagere vorm van beveiliging toestaan in exchange.

Als het geen exchange server is moet je de server configuratie nalopen (is een verbinding van dit adres wel toegestaan bijv ?), hoe hoog is de authenticatie beveiliging en ondersteund PHP dit?


[...]


bron: http://nl.php.net/manual/nl/ref.imap.php
Me mailserver en website zitten allebij bij lycos, dus het lijkt me dat het wel toegestaan is. En ik kan niks instellen mbt kerberos, en volgens mij gebruikt lycos linux servers.

Edit:
uit m'n phpinfo():

--with-imap-ssl=/usr/'

Edit2:
AAAARRRRRRRGGGGGGGHHHHHHHHHH
Ik moest er /novalidate-cert achter zetten, dan disabled tie ssl

[ Voor 11% gewijzigd door XiN-eViL op 21-01-2005 19:05 ]


Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
XiN-eViL schreef op vrijdag 21 januari 2005 @ 18:58:
[...]

Edit2:
AAAARRRRRRRGGGGGGGHHHHHHHHHH
Ik moest er /novalidate-cert achter zetten, dan disabled tie ssl
^^ with stupid

stond inderdaad gewoon in de handleiding, zie je maar weer hoe handig het is om die goed door te lezen >:)

/dev/null


Acties:
  • 0 Henk 'm!

  • XiN-eViL
  • Registratie: Maart 2004
  • Laatst online: 29-08 10:13

XiN-eViL

kzie-nie-veel

Topicstarter
OK, het wil nu allemaal wel een beetje lukken. Maar hoe krijg ik nu makkelijk de attachments eruit?
Want het enige dat me lukt is alles op het scherm weergeven.
En dan zijn sommige attachments nog eens base64 encoded, die kan ik natuurlijk met base64_decode() wel un-encoden, maar hoe herken ik die tov andere attachments :? ?

Acties:
  • 0 Henk 'm!

  • Bartjuh
  • Registratie: Oktober 2001
  • Niet online

Bartjuh

Hej

XiN-eViL schreef op vrijdag 21 januari 2005 @ 23:57:
OK, het wil nu allemaal wel een beetje lukken. Maar hoe krijg ik nu makkelijk de attachments eruit?
Want het enige dat me lukt is alles op het scherm weergeven.
En dan zijn sommige attachments nog eens base64 encoded, die kan ik natuurlijk met base64_decode() wel un-encoden, maar hoe herken ik die tov andere attachments :? ?
Toevallig ben ik voor mij stage bezig met het maken van een soort 'correspondentie-manager'.
E-mails die volledig worden gestript enzo.

Hoe ik dit in grote lijnen gedaan heb is als volgt.
Ik heb 2 klassen, email en part. Een object op basis van de email klasse bestaat uit een collectie met parts (representeert elk part van de email) en gegevens met bettrekking tot de email (zoals prioriteit, senderaddress, subject etc). Aan de constructor geef ik de uid van de email en de mbox connectie (de resource van imap_open). Deze fetcht dan met allerlei functies de e-mail uit elkaar. Zeker 700 regels aan code alleen voor de email klass. En nog zon 300 voor de part klasse.
Er zit een soort loopje in die alle parts fetcht. Je creeert eerst een object van de structure van de gehele email met imap_fetchstructure. Ik creeer dan dus een part van de gehele email. Wanneer het type (object->type) gelijk is aan 'MULTIPART' betekent dit dat daaronder weer meer parts zitten. Dan verkrijg ik met (object-parts) de array met daarin weer de parts die eronder zitten. Roep dan dezelfde functie weer aan en itereer weer door. Bij elk part maak ik dan een nieuwe instantie aan van de part klasse, die dan weer het 'part-number' meegeef om met imap_fetchbody de body te fetchen, en het part-structure object. De parts komen dan in de collectie van het email object. Het werkt bij mij allemaal perfect. Het lastige is alleen om het goede 'part-number' voor fetchbody te creeeren.
Op het laatst kan ik gewoon door de collectie heen itereren op zoek of de isAttachment variable true is en bekijk ik de objectvariable encoding om te checken welke encoding het is.
Beetje raar uitgelegd allemaal, maar het is niet zo makkelijk en kort uit te leggen ;)
Misschien als ik van de week weer op me stage ben ik wat code kan plakken hier :)
En ik gebruik dan base64_decode voor het omzetten van de gegevens uit de attachements van de email. Met fwrite kan je die gewoon wegschrijven. Ohja, en check ook de parameters van de part om daaruit de filename te halen.

Acties:
  • 0 Henk 'm!

  • vriesdude
  • Registratie: Februari 2002
  • Laatst online: 19-09 19:14
Ik ben ook met zo een geheel bezig, en ik kan je alvast vertellen dat je het heel moeilijk gaat krijgen O-) , hier volgt wat code...

viewmessage
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//
// Bijlage'n..
//

$sections = parse($structure);
$bijlage = get_attachments($sections); 

if (sizeof($bijlage) > 0) {

    echo "    <tr>
            <td valign=\"top\"> Bijlagen: </td>
            <td valign=\"top\">";

    for($a = 0; $a < sizeof($bijlage); $a++ ) { 

        echo "  <a target=\"_blank\" href=\"attachment.php?box={$_GET['box']}&msgno={$_GET['msgno']}&pid=". $bijlage[$a]["pid"] ."\">".$bijlage[$a]["name"]."</a> (". ceil($bijlage[$a]["size"]/1024) . " KB)  <br>";

    }

    echo "      </td>
              </tr>";

}


Functions
PHP:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
//
// Parse messagebody
//

function parse($structure) {

    $type       = array("text", "multipart", "message", "application", "audio", "image", "video", "other");
    $encoding   = array("7bit", "8bit", "binary", "base64", "quoted-printable", "other");
        
    //
    // Een array aanmaken om de resultaten in op te slaan
    //

    $ret = array();
    
    //
    // Mailstructuur in stukken opdelen
    //

    $parts = $structure->parts;
    
    //
    // Voor elk part gegevens ophalen
    //

    for($x=0; $x<sizeof($parts); $x++) {

        $return[$x]["pid"] = ($x+1);    
    
        $this = $parts[$x];
    
        //
        // default to text ??
        //

        if ($this->type == "") { $this->type = 0; }
        $return[$x]["type"] = $type[$this->type] . "/" . strtolower($this->subtype);    
    
        //
        // default to 7bit ?
        //

        if ($this->encoding == "") { $this->encoding = 0; }
        $return[$x]["encoding"] = $encoding[$this->encoding];

        //
        // Grote 
        //  
        
        $return[$x]["size"] = strtolower($this->bytes); 

        //
        // Disposition
        //
        
        $return[$x]["disposition"] = strtolower($this->disposition);    
        
        if (strtolower($this->disposition) == "attachment") {
        
            $params = $this->dparameters;
            
            if (is_array($params)) {

                
                foreach ($params as $p) {
                
                    if($p->attribute == "FILENAME") {
                    
                        $return[$x]["name"] = $p->value;        
    
                    }
    
                }
                
            }       

        }

    }

    return $return;

}

//
// De array die afgeleverd is door de functie parse doorlopen
// en een nieuwe array aanmaken voor alleen attachments
//

function get_attachments($arr) {

    for($x=0; $x<sizeof($arr); $x++) {

        if($arr[$x]["disposition"] == "attachment") {
        
            $return[] = $arr[$x];

        }

    }

    return $return;

}


Attachtments
PHP:
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
mbox_connect_imap();

$structure  = imap_fetchstructure($mbox, $_GET['msgno']);
$sections   = parse($structure);
$bijlage    = get_attachments($sections); 

$file       = $bijlage[$_GET['pid'] - 2]["name"];
$size       = $bijlage[$_GET['pid'] - 2]["size"];
$encoding   = $bijlage[$_GET['pid'] - 2]["encoding"];

header ("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header ("Content-Type: application/octet-stream");
header ("Content-Length: ". $size);
header ("Content-Disposition: attachment; filename=". $file .""); 

$data = imap_fetchbody($mbox, $_GET['msgno'], $_GET['pid']["pid"]);

if ($encoding == "base64") {
    
    $data = base64_decode($data);
    
}

echo $data;

mbox_disconnect_imap();


Opmerking: Alle mbox functie's heb ik zelf geschreven, die zul je dus niet terugvinden op de site. Ze bestaan wel uit voornamelijk imap functie's.

Succes.. Enne, we spreken je nog op het moment dat je berichten wilt gaan uitlezen (met alle mogelijke vormen van dien) })

edit: php tag foutje |:(

[ Voor 14% gewijzigd door vriesdude op 22-01-2005 19:34 ]

/dev/null

Pagina: 1