Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das verstümmelte IMAP-PHP-Problem

So lösen Sie das verstümmelte IMAP-PHP-Problem

藏色散人
藏色散人Original
2020-08-12 10:32:173050Durchsuche

Die Lösung für das verstümmelte Problem von imap php: Öffnen Sie zuerst die entsprechende PHP-Datei. Fügen Sie dann iconv hinzu, um das Zeichenkodierungsformat zu konvertieren und das verstümmelte Problem zu lösen, mit Anweisungen wie „iconv(‘gb2312‘,‘utf8‘,imap_base64 ($text) );".

So lösen Sie das verstümmelte IMAP-PHP-Problem

Empfehlung: „PHP-Video-Tutorial

php imap/pop3-Klasse zum Empfangen von E-Mails, Lösung chinesischer verstümmelter Zeichen

Mein Ziel ist es, den Empfang von E-Mails auf dem eingebetteten Entwicklungsboard zu realisieren, natürlich habe ich gegoogelt Dabei habe ich festgestellt, dass es noch viele Implementierungsmethoden gibt: PHP ist die einfachste, die C-Socket-Implementierung die effizienteste (so empfinde ich es) und natürlich ist auch die Python-Implementierung unverzichtbar (aber ich habe sie noch nicht getestet). und so weiter.

Heute werde ich zuerst die PHP-E-Mail-Empfangsklasse vorstellen, die ursprünglich vom Ausländer Mitul Koradia geschrieben wurde. Ich finde, dass die Implementierungsfunktion auch sehr vollständig ist:

Die Hauptmethoden dieser Klasse sind wie folgt:

class receiveMail
{
    ...
    function receiveMail($username,$password,$EmailAddress,$mailserver='localhost',$servertype='pop',$port='110',$ssl = false) //Constructure
    function getHeaders($mid) // Get Header info
    function getTotalMails() //Get Total Number off Unread Email In Mailbox
    function getUnreadMails() //Get Number of Unread Mail from Mailbox
    function searchUnreadMails() //Find Numbers of Unread Mail by imap_search Method
    function GetAttach($mid,$path) // Get Atteced File from Mail
    function getBody($mid) // Get Message Body
    function deleteMails($mid) // Delete That Mail
    function close_mailbox() //Close Mail Box

Allerdings gibt es einige Mängel, die ich nach dem Lesen leicht geändert habe, hauptsächlich weil der E-Mail-Header nicht MIME-dekodiert war und der chinesische Inhalt der E-Mail verstümmelt war.

Bezüglich des Dekodierungsprozesses des E-Mail-Headers sieht die Verarbeitungsmethode von Mitul Koradia zunächst wie folgt aus:

function getHeaders($mid) // Get Header info
{
if(!$this->marubox)
return false;
$mail_header=imap_header($this->marubox,$mid);
$sender=$mail_header->from[0];
$sender_replyto=$mail_header->reply_to[0];
if(strtolower($sender->mailbox)!='mailer-daemon' && strtolower($sender->mailbox)!='postmaster')
{
$mail_details=array(
'from'=>strtolower($sender->mailbox).'@'.$sender->host,
'fromName'=>$sender->personal,
'subject'=>$mail_header->subject,
'to'=>$mail_header->toaddress
);
}
return $mail_details;
}

Aber das Rückgabeergebnis sind MIME-codierte Zeichen, was offensichtlich nicht funktioniert, also habe ich die Methode imap_mime_header_decode hinzugefügt hat funktioniert.

function getHeaders($mid) // Get Header info
{
if(!$this->marubox)
return false;
$mail_header=imap_header($this->marubox,$mid);
$sender=$mail_header->from[0];
$sender_replyto=$mail_header->reply_to[0];
if(strtolower($sender->mailbox)!='mailer-daemon' && strtolower($sender->mailbox)!='postmaster')
{
$mail_details=array(
'from'=>strtolower($sender->mailbox).'@'.$sender->host,
'fromName'=>imap_mime_header_decode($sender->personal)[0]->text,
'subject'=>imap_mime_header_decode($mail_header->subject)[0]->text,
'to'=>imap_mime_header_decode($mail_header->toaddress)[0]->text
);
}
return $mail_details;
}

Was das Problem des verstümmelten chinesischen Inhalts in E-Mails betrifft, werden Ausländer es definitiv nicht in Betracht ziehen. Tatsächlich ist es relativ einfach, das Zeichenkodierungsformat zu konvertieren:

function get_part($stream, $msg_number, $mime_type, $structure = false, $part_number = false) //Get Part Of Message Internal Private Use
{ 
if(!$structure) { 
$structure = imap_fetchstructure($stream, $msg_number); 
} 
if($structure) { 
if($mime_type == $this->get_mime_type($structure))
{ 
if(!$part_number) 
{ 
$part_number = "1"; 
} 
$text = imap_fetchbody($stream, $msg_number, $part_number); 
if($structure->encoding == 3) 
{ 
return iconv('gb2312','utf8',imap_base64($text)); 
} 
else if($structure->encoding == 4) 
{ 
return iconv('gb2312','utf8',imap_qprint($text)); 
} 
else
{ 
return iconv('gb2312','utf8',$text); 
} 
} 
if($structure->type == 1) /* multipart */ 
{ 
while(list($index, $sub_structure) = each($structure->parts))
{ 
if($part_number)
{ 
$prefix = $part_number . '.'; 
} 
$data = $this->get_part($stream, $msg_number, $mime_type, $sub_structure, $prefix . ($index + 1)); 
if($data)
{ 
return $data; 
} 
} 
} 
} 
return false; 
}

Ich bin neu in PHP Ich habe das Gefühl, dass ich immer noch nicht viel verstehe. Ich hoffe, dass ich weiter hart arbeiten kann

Das obige ist der detaillierte Inhalt vonSo lösen Sie das verstümmelte IMAP-PHP-Problem. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn