So I get emails using imap from gmail and outlook.
Gmail encodes like this =?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpbA==?=
and outlook encodes like this =?iso-8859-7?B?UmU6IOXr6+ft6er8IHN1YmplY3Q=?=
Unfortunately I did not find yet any solution that will help me make this into readable text. Instead I am messing with:
mb_convert_encoding($body, "UTF-8", "UTF-8");
and
mb_convert_encoding($body, "UTF-8", "iso-8859-7");
but I am struggling to find a solution to solve this matter.
This is how I open the IMAP of my account (which has a lot of gmail and outlook messages)
$hostname = '{imappro.zoho.com:993/imap/ssl}INBOX'; $username = 'email@email.com'; $password = 'password'; /* try to connect */ $inbox = imap_open($hostname,$username ,$password) or die('Cannot connect to Zoho: ' . imap_last_error()); /* grab emails */ $emails = imap_search($inbox,'UNSEEN');
Any help?
4 Answers
Answers 1
Unfortunately I did not find yet any solution that will help me make this into readable text.
Solution Your strings are base64 encoded.
=?UTF-8?B?UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpbA==?=
echo base64_decode('UmU6IM69zq3OvyDOtc68zrHOuc67IG5ldyBlbWFpbA==');
prints "Re: νέο εμαιλ new email"
=?iso-8859-7?B?UmU6IOXr6+ft6er8IHN1YmplY3Q=?=
echo base64_decode('UmU6IOXr6+ft6er8IHN1YmplY3Q=');
prints out "Re: subject"
The answer is to use base64_decode in conjunction with your current solutions.
The way to identify base64 encoded text is that it's depicted as letters a-z, A-Z, numbers 0-9 along with two other characters (usually + and /) and it's usually right padded with =.
Answers 2
look here
/* connect to gmail */ $hostname = '{imap.gmail.com:993/imap/ssl}INBOX'; $username = 'davidwalshblog@gmail.com'; $password = 'davidwalsh'; /* try to connect */ $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to Gmail: ' . imap_last_error()); /* grab emails */ $emails = imap_search($inbox,'ALL'); /* if emails are returned, cycle through each... */ if($emails) { /* begin output var */ $output = ''; /* put the newest emails on top */ rsort($emails); /* for every email... */ foreach($emails as $email_number) { /* get information specific to this email */ $overview = imap_fetch_overview($inbox,$email_number,0); $message = imap_fetchbody($inbox,$email_number,2); /* output the email header information */ $output.= '<div class="toggler '.($overview[0]->seen ? 'read' : 'unread').'">'; $output.= '<span class="subject">'.$overview[0]->subject.'</span> '; $output.= '<span class="from">'.$overview[0]->from.'</span>'; $output.= '<span class="date">on '.$overview[0]->date.'</span>'; $output.= '</div>'; /* output the email body */ $output.= '<div class="body">'.$message.'</div>'; } echo $output; } /* close the connection */ imap_close($inbox);
for reading and decoding look here
<?php $hostname = '{********:993/imap/ssl}INBOX'; $username = '*********'; $password = '******'; $inbox = imap_open($hostname,$username,$password) or die('Cannot connect to server: ' . imap_last_error()); $emails = imap_search($inbox,'ALL'); if($emails) { $output = ''; rsort($emails); foreach($emails as $email_number) { $overview = imap_fetch_overview($inbox,$email_number,0); $structure = imap_fetchstructure($inbox, $email_number); if(isset($structure->parts) && is_array($structure->parts) && isset($structure->parts[1])) { $part = $structure->parts[1]; $message = imap_fetchbody($inbox,$email_number,2); if($part->encoding == 3) { $message = imap_base64($message); } else if($part->encoding == 1) { $message = imap_8bit($message); } else { $message = imap_qprint($message); } } $output.= '<div class="toggle'.($overview[0]->seen ? 'read' : 'unread').'">'; $output.= '<span class="from">From: '.utf8_decode(imap_utf8($overview[0]->from)).'</span>'; $output.= '<span class="date">on '.utf8_decode(imap_utf8($overview[0]->date)).'</span>'; $output.= '<br /><span class="subject">Subject('.$part->encoding.'): '.utf8_decode(imap_utf8($overview[0]->subject)).'</span> '; $output.= '</div>'; $output.= '<div class="body">'.$message.'</div><hr />'; } echo $output; } imap_close($inbox); ?>
Look here for great tutorial on email structure, and function to extract it.
Answers 3
If you want to decode header elements, there is a PHP function for that: imap_mime_header_decode().
Also, you will need some MIME parser class to decode multipart messages.
Answers 4
To get the headers, you would pass your stream ($inbox
) to imap_headers()
. There are lots of values you can get in the response, full list: imap_headerinfo
For the actual messages, plain text can be read using imap_body()
, passing the stream and the number of the message you want (in $emails
after your search). Getting an html/multipart email is a bit trickier. First you need imap_fetchstructure()
, which identifies the parts of the message, then imap_fetchbody()
to get the piece you are interested in.
Once you have a result from imap_fetchbody()
, if you still need to adjust the encoding, it could be done at this point.
0 comments:
Post a Comment