2017-12-21 6 views
1

Ich habe ein Problem mit Imap-Funktion. Grundsätzlich muss ich ungesehene Mails lesen. Es wird eine URL in allen Mails geben, ich sollte diese URL holen und speichern.Probleme mit IMAP-Funktionen PHP

$inbox = imap_open($hostname,$username,$password); 
if($inbox)//if **1 
{ 
/* grab emails */ 
$emails = imap_search($inbox,'UNSEEN'); 

/* if emails are returned, cycle through each... */ 
if($emails) //if **2 
{ 
    /* put the newest emails on top */ 
    rsort($emails); 

    /* for every email... */ 
    $varients=array("1","1.1","1.2","2"); 

    foreach($emails as $email_number) //for loop **1 
    { 
     $ids [] = $email_number; 

     foreach($varients as $cur_varient) //for loop **2 
     { 
      echo "\n\nstarting with imap function number ". $cur_varient."\n\n"; 

      $overview  = imap_fetch_overview($inbox,$email_number,0);//all varients of like subject, date etc. 
      $from   = addslashes(trim($overview[0]->from)); 
      $inboxed_time = addslashes(trim(strtotime($overview[0]->date))); 
      $message  = (imap_body($inbox,$email_number,$cur_varient)); 

      print addslashes(trim($overview[0]->subject));break; 
      preg_match_all('#\bhttp?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $message, $match); 

      $link_matched = $match[0];     
      $input  = 'unsubscribe.php'; 
      $linkexists = false; 

      foreach($link_matched as $curlink) 
      {     
       if(stripos($curlink, $input) !== false) 
       { 
       $linkexists = true; 
       $unsublink = $curlink; 

       $unsublink = str_replace('href="', '', $unsublink); 
       $unsublink = str_replace('"', '', $unsublink); 

       break; 
       } 
      } 



      if(isset($unsublink)) 
      { 
       $unsublink = addslashes(trim(($unsublink))); 
       $thread = 1; 
       $time  = date("Y-m-d H:i:s"); 
       $iQry  = " INSERT INTO `SPAMS`.url_queue VALUES("; 
        $iQry  .= " 'default','".$unsublink."','".$thread."','"; 
       $iQry  .= "".$from."','".$inboxed_time."',UNIX_TIMESTAMP('".$time."'))"; 

       //mysql_query($iQry); 
       print $iQry; 
      } 
     }//closing for loop **2 

    }//closing for loop **1 

} //closing if **2 

// Setting flag from un-seen email to seen on emails ID. 
if(isset($ids)) 
{ 
    imap_setflag_full($inbox,implode(",", $ids), "\\Seen \\Flagged"); //IMPORTANT 
} 

// colse the connection 
imap_expunge($inbox); 
imap_close($inbox); 
}//closing if **1 

Ich habe alle verschiedenen varients imap verwendet, um sicherzustellen, dass es verschiedene Arten von E-Mails lesen. Jetzt Problem ist, irgendwann die URL übereinstimmt ist gebrochen. Es wird nur die halbe URL abgerufen (ich habe die gesamte Nachricht gedruckt, sah, dass die halbe URL in die nächste Zeile kommt). Das andere Problem ist, dass der geholte Körper nicht der ist, den die aktuelle Mail enthält. Es hat einige andere E-Mail-Inhalte abgerufen.

Ich bin verwirrt, was zu tun, um meinen gesamten Code setzen, bitte helfen Sie.

Antwort

0

Sie haben eine regex Modifikatoren verwenden zu mehrzeilige Texte anzupassen, oder Sie können vom Körper der E-Mails Zeilenumbrüche und solche Streifen.

preg_match("/{pattern}/mi",'Testing'); 
//m for multiline matches and i for case-insensitive matches 

Ihre zweite Frage ist ein bisschen anders, als man denkt, E-Mails mehrere Körper, eine für einfache Texte, eine für html, einige für Anhänge (und deren Reihenfolge in Apple-Produkten unterscheidet). https://www.electrictoolbox.com/php-imap-message-parts/

Sie stehen wahrscheinlich vor dem Problem, den falschen zu greifen. Meine Empfehlung wäre, alle E-Mail Körper zu holen, wie folgt aus:

$overview = imap_fetch_overview($this->connection, $email_number, 0); 
$structure = imap_fetchstructure($this->connection, $email_number); 
$message = ""; 
//$parts = [1, 1.1, 1.2, 2]; 
if (!$structure->parts)//simple email 
    $message .= "Simple: ". imap_fetchbody($this->connection, $email_number, 0). "<br/>"; 
else { 
    foreach ($structure->parts as $partNumber=>$part){ 
      if ($partNumber != 0) 
       $message .= "Part ".$partNumber.": ". imap_fetchbody($this->connection, $email_number, $partNumber)."<br/>"; 
     } 
}