Maison  >  Article  >  développement back-end  >  Comment résoudre le problème tronqué d'imap php

Comment résoudre le problème tronqué d'imap php

藏色散人
藏色散人original
2020-08-12 10:32:173019parcourir

La solution au problème tronqué de imap php : ouvrez d'abord le fichier PHP correspondant ; puis ajoutez iconv pour convertir le format d'encodage des caractères afin de résoudre le problème tronqué. L'instruction est telle que "iconv('gb2312', 'utf8',imap_base64 ($texte));".

Comment résoudre le problème tronqué d'imap php

Recommandé : "Tutoriel vidéo PHP"

php imap/pop3 recevoir un cours de courrier, résoudre le chinois Caractères tronqués

Mon objectif est d'implémenter la réception d'e-mails sur la carte de développement embarquée. Bien sûr, j'ai cherché sur Google et découvert qu'il existe de nombreuses méthodes d'implémentation : PHP est le plus simple et le socket C est le plus efficace. (c'est ce que je ressens) ), bien sûr, l'implémentation de python est également indispensable (mais je ne l'ai pas encore testé) et ainsi de suite.

Aujourd'hui, je vais d'abord présenter la classe de réception de courrier PHP. Cette classe a été écrite à l'origine par l'étranger Mitul Koradia. Je pense que la fonction d'implémentation est également très complète :

Les principales méthodes de celle-ci. class sont les suivantes :

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

Cependant, il y a quelques défauts que j'ai apportés après les avoir lus. La raison principale est que l'en-tête de l'e-mail n'était pas décodé MIME et que le contenu chinois de l'e-mail était tronqué.

Tout d'abord, concernant le processus de décodage de l'en-tête de l'e-mail, la méthode de traitement de Mitul Koradia est la suivante :

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;
}

Mais le résultat renvoyé est des caractères codés MIME, ce qui évidemment ne fonctionne pas, j'ai donc ajouté la méthode imap_mime_header_decode et cela a fonctionné.

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;
}

Enfin, concernant le problème du contenu chinois tronqué dans les emails, les étrangers n'y penseront certainement pas. En fait, c'est relativement simple, ajoutez simplement iconv pour convertir le format d'encodage des caractères :

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; 
}
Débutant en PHP, j'ai l'impression qu'il y en a beaucoup que je ne comprends toujours pas, j'espère pouvoir continuer sur mon bon travail

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn