Avatar billede kjeldsted Novice
23. januar 2008 - 18:20 Der er 19 kommentarer og
1 løsning

imap funktion i php

Jeg sidder og er ved at lave et mail system i php, hvor jeg tager brug af imap funktionen. Men jeg har det lille problem at jeg ikke kan få php til at fortælle om en mail er læst eller ej. Jeg har pt. følgende kode på siden:

    $header=imap_header($imap, $messageid);
    $message['subject'] = $header->subject;
    $message['fromaddress'] =  $header->fromaddress;
    $message['date'] = strtotime($header->date);
    $message['date'] = date("d-m-Y H:i",$message['date']);
    $message['Unseen'] = $header->Unseen;
    $message['Recent'] = $header->Recent;

Fra og med subject og til og med date virker det fint. Men problemet er at Unseen udskriver '', mens Recent udskriver N på ALLE mails. I følge php.net betyder det at mine mails er "seen OR not seen and recent" samt "recent and not seen". Men da halvdelen af alle mails er læste hvor den anden halvdel ikke er, forstår jeg ikke hvad den udskriver.

Jeg læste mig frem til koden på http://dk2.php.net/manual/da/function.imap-headerinfo.php. Nogen der kan hjælpe med dette problem?
Avatar billede jakobdo Ekspert
23. januar 2008 - 20:16 #1
Måske dette er fejlen: http://bugs.php.net/bug.php?id=1702
Avatar billede kjeldsted Novice
23. januar 2008 - 20:30 #2
Så vidt jeg kan se fra http://bugs.php.net/bug.php?id=1702 blev denne fejl rette ved en opdatering af gcc. Eftersom han fik rette denne fejl tilbage i 1999 og at jeg har min side hosted hos one.com, hvor jeg så formoder jeg min server ikke er af en SÅ gammel gcc version tror jeg ikke dette er problemet.
Avatar billede jakobdo Ekspert
23. januar 2008 - 20:35 #3
Undskyld.
Avatar billede kjeldsted Novice
23. januar 2008 - 21:19 #4
Er det ellers nogle gode forslag? Dette har generet mig i mange måneder nu, og ville gerne slippe for dette problem.
Avatar billede bobslaede Nybegynder
24. januar 2008 - 09:54 #5
Du skal huske at sætte headeren til seen, når du har læst mailen, det skal du selv gøre i php.
Avatar billede kjeldsted Novice
24. januar 2008 - 16:15 #6
Hm. Et andet mailsystem der fulgte med da jeg købte serverplads, kan godt se hvilke mails der er læste og hvilke der ikke er.

Men hvad er det for en imap kode der sætter headeren til seen?
Avatar billede bobslaede Nybegynder
24. januar 2008 - 16:24 #7
http://dk.php.net/manual/en/function.imap-setflag-full.php
nok den vil jeg tro. Lang tid siden jeg har lavet noget imap.
Avatar billede kjeldsted Novice
25. januar 2008 - 19:14 #8
Tak for linket. Jeg kan dog desværre ikke få det til at virke. Alle mine mails er desværre stadig makeret som ulæste.
Avatar billede kjeldsted Novice
25. januar 2008 - 21:10 #9
For at give lidt ekstra info kan jeg sige at oversigten over ens indbox ser sådan ud:

      {
      $header=imap_header($imap, $messageid);
      $message['subject'] = $header->subject;
      $message['fromaddress'] = $header->fromaddress;
      $message['date'] = strtotime($header->date);
      $message['date'] = date("d-m-Y H:i",$message['date']);
      $message['Unseen'] = $header->Unseen;
      $message['Recent'] = $header->Recent;
      echo "Besked nr. ".$messageid."<br><br>";
      if($message['Unseen']=="U" || $message['Recent']=="N"){$style1="font-weight:bold";}
      else {$style1="font-weight:normal";}
      $message['suject'] = str_replace('=?iso-8859-1?B?5g==?=', 'æ', $massage['subject']);
      $bgcolor1 = "#666666";
      $bgcolor2 = "#ffffff";
      if(!isset($bgcolor)){$bgcolor = $bgcolor1;}
      $style2 = "style='".$style1."'; bgcolor='".$bgcolor."';";
      $style3 = "style='".$style1."'; bgcolor='#cccccc';";
  ?>
    <tr id="inbox" <?=$style2?> title="<?=$message['subject']?>" onMouseOver="java script:inbox.style='background-color:#CCCCCC';" onClick="java script:window.open('show_mail.php?messageid=<?=$messageid?>','mywin','left=20,top=20,width=500,height=500,toolbar=0,resizable=1');" style="cursor:pointer">
      <td><input type="checkbox"></td>
      <td><?=$message['fromaddress']?></td>
      <td><?=$message['date']?></td>
      <td><?=$message['subject']?></td>
      <td><?=$message['Unseen']." | ".$message['Recent']?>

Hvor den altså udskriver at mailen er ulæst. Og klikker man så på en mail bliver følgende funktion udført:

imap_setflag_full($imap,$messageid,"\\Seen");

Håber der er nogle der kan hjælpe.
Avatar billede kjeldsted Novice
25. januar 2008 - 21:50 #10
Efter at have rodet med scriptet lidt tid har jeg draget den konklusion at fejlen sker et sted i denne kode:

    <?
    $settings[server]=$_SESSION['server'];
    $settings[port]="110";
    $mailbox = "{".$settings[server];
    if($_SESSION['type']=="POP3"){$mailbox .= '/pop3';}
    $mailbox .= ":".$settings[port]."}INBOX";
    $imap=imap_open($mailbox,$_SESSION['brugernavn'],$_SESSION['password']);
    $headers = imap_headers($imap);
        $antal_beskeder = sizeof($headers);
    $messageid=1;
    while($messageid<($antal_beskeder+1))
      {
      $header=imap_headerinfo($imap, $messageid);
      $message['subject'] = $header->subject;
      $message['fromaddress'] = $header->fromaddress;
      $message['date'] = strtotime($header->date);
      $message['date'] = date("d-m-Y H:i",$message['date']);
      $message['Unseen'] = $header->Unseen;
      $message['Recent'] = $header->Recent;

Og det er sker her er at scriptet ændre Recent værdien fra R (læst) til N (ulæst). Hvad kan dette skyldes?
Avatar billede gonza.dk Nybegynder
26. januar 2008 - 16:43 #11
$header->Unseen giver dig et U hvis mailen ikke læst og den ikke er ny.
$header->Recent giver dig et N hvis mailen ikke er læst og ny.

Derfor bliver du nødt til at tjekke op på begge for at se om en mail er læst om den er ny er gammel.

if (($header-Unseen == "U") OR ($header->Recent == "N")) {
echo "Mailen er ikke læst";
}
else {
echo "Mailen er læst";
}

Efter mine erfaringer virker $header->Unseen og $header->Recent ikke hvis du bruger pop3-protokollen, men virker fint med imap.

Håber det hjalp?
Avatar billede kjeldsted Novice
28. januar 2008 - 10:34 #12
Som jeg har beskrevet i en meddelse ovenfor har jeg følgende i min kode:
if($message['Unseen']=="U" || $message['Recent']=="N")
Altså går jeg ind og skriver det samme som du lige skrev.

Men jeg har fundet frem til at fejlen ligger i at når jeg bruger imap_open() funktionen så sætter den $header->Recent til at være N hver gang jeg åbner indboxen. Når så jeg åbner en mail sætter den ganske rigtigt $header->Recent til R, hvilket kun gælder indtil jeg igen åbner oversigten over mine mails i indboxen. Så nu er mit problem at alle mine mails bliver markeret som læste ved brug af imap_open($mailbox, $_SESSION['brugernavn'], $_SESSION['password']);
Avatar billede kjeldsted Novice
28. januar 2008 - 10:34 #13
Som jeg har beskrevet i en meddelse ovenfor har jeg følgende i min kode:
if($message['Unseen']=="U" || $message['Recent']=="N")
Altså går jeg ind og skriver det samme som du lige skrev.

Men jeg har fundet frem til at fejlen ligger i at når jeg bruger imap_open() funktionen så sætter den $header->Recent til at være N hver gang jeg åbner indboxen. Når så jeg åbner en mail sætter den ganske rigtigt $header->Recent til R, hvilket kun gælder indtil jeg igen åbner oversigten over mine mails i indboxen. Så nu er mit problem at alle mine mails bliver markeret som læste ved brug af imap_open($mailbox, $_SESSION['brugernavn'], $_SESSION['password']);
Avatar billede kjeldsted Novice
31. januar 2008 - 17:05 #14
Problemet er blevet løst :-)

Mange tak for alle de gode forslag til hvad jeg kunne ændre...
Avatar billede jakobdo Ekspert
31. januar 2008 - 19:18 #15
Hvad blev løsningen?
Avatar billede kjeldsted Novice
31. januar 2008 - 22:09 #16
Jeg ændrede port 110 til 143 samt at ændrede pop3 til imap så imap_open() nu ser sådan ud:

    $settings[server]=$_SESSION['server'];
    $settings[port]="143";
    $mailbox = "{".$settings[server];
    if($_SESSION['type']=="POP3"){$mailbox .= '/imap';}
    $mailbox .= ":".$settings[port]."}INBOX";
    $imap=imap_open($mailbox,$_SESSION['brugernavn'],$_SESSION['password'], OP-HALFOPEN);

Så jeg nu kunne få lov til at bruge options i imap_open() som jeg altså satte til OP_HALFOPEN.
Avatar billede gonza.dk Nybegynder
05. februar 2008 - 10:55 #17
Altså løsningen som jeg gav dig 26/1-2008 16:43:42:

"Efter mine erfaringer virker $header->Unseen og $header->Recent ikke hvis du bruger pop3-protokollen, men virker fint med imap."
Avatar billede gonza.dk Nybegynder
05. februar 2008 - 10:56 #18
imap-funktionerne virker kun tildels med pop3...
Avatar billede kjeldsted Novice
07. februar 2008 - 17:06 #19
gonza.dk, det kan du have ret i. Men det var jo altså ikke kun et problem at jeg brugte pop3, da der ikke skete noget i starten ved at ændre pop3 til imap. Det primære problem lå sådan set i at jeg brugte en forkert port til at åbne mailboxen.
Avatar billede jakobdo Ekspert
07. februar 2008 - 20:22 #20
pop3 = 110
imap = 143
Så gonza.dk har faktisk ret! :o)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester