代码已经过测试,所有的message_id,uid,主题gmail标题信息都可以插入到我的sqlite3数据库中。
<?php
$db='/home/email.db';
// function get_gmail can get all the message_id,uid,subject gmail header info.
function get_gmail(){
$email_data=array();
$hostname = '{imap.gmail.com:993/imap/ssl}';
$username = 'xxxx@gmail.com';
$password = 'yyyy';
$inbox = imap_open($hostname,$username,$password);
$nums=imap_num_msg($inbox);
for ($i=1;$i<=$nums;$i++){
$overview = imap_fetch_overview($inbox, $i, 0);
$x1 = $overview[0]->message_id;
$x2 = $overview[0]->uid;
$x3 = $overview[0]->subject;
$email_data[]=array($x1,$x2,$x3);
}
imap_close($inbox);
return $email_data;
}
//function insert_data can insert all the data into my sqlite3 database.
function insert_data($array){
Global $db;
$dbh=new PDO("sqlite:{$db}");
$dbh->beginTransaction();
$sql = "INSERT INTO gmail(message_id,uid,subject) VALUES (?,?,?)";
$query = $dbh->prepare($sql);
foreach($array as $item){
$query->execute($item);
}
$dbh->commit();
$dbh->beginTransaction();
$dbh=null;
}
$data=get_gmail();
insert_data($data);
?>
问题仍然存在,例如电子邮件的主题是'=?GB2312?B?zbO8xtGnu/m0ocq10bXP7sS/?='
,它作为表单插入到sqlite3中
'=?GB2312?B?zbO8xtGnu/m0ocq10bXP7sS/?='
,我使用以下代码以utf-8的形式将其更改为中文字符。
<?php
$db='/home/email.db';
function get_gmail(){
mb_internal_encoding('UTF-8');
$email_data=array();
$hostname = '{imap.gmail.com:993/imap/ssl}';
$username = 'xxxx@gmail.com';
$password = 'yyyy';
$inbox = imap_open($hostname,$username,$password);
$nums=imap_num_msg($inbox);
for ($i=1;$i<=$nums;$i++){
$overview = imap_fetch_overview($inbox, $i, 0);
$x1 = $overview[0]->message_id;
$x2 = $overview[0]->uid;
$x3 = $overview[0]->subject;
$x3 = mb_decode_mimeheader($x3);
$email_data[]=array($x1,$x2,$x3);
}
imap_close($inbox);
return $email_data;
}
function insert_data($array){
Global $db;
$dbh=new PDO("sqlite:{$db}");
$dbh->beginTransaction();
$sql = "INSERT INTO gmail(message_id,uid,subject) VALUES (?,?,?)";
$query = $dbh->prepare($sql);
foreach($array as $item){
$query->execute($item);
}
$dbh->commit();
$dbh->beginTransaction();
$dbh=null;
}
$re=get_gmail();
insert_data($re);
?>
有两个问题需要解决。
1.mb_decode_mimeheader
并非所有MIME RFC 2047格式的主题都需要更改,以=?GB2312
开头的字符串将被更改
如何添加if-else结构来完成这项工作?
2.无法运行insert_data函数
PHP致命错误:在第49行的非对象上调用成员函数execute()
$query->execute($item);
中的一些错误,为什么在不使用mb_decode_mimeheader函数更改字符串时可以运行该语句?
答案 0 :(得分:0)
虽然我不会完全回答“为什么”(对不起在这里太晚了),但您可以尝试使用imap_mime_header_decode将其存储在数据库中。请确保稍后使用iconv处理它,因为它通常不存储在utf8中。 (至少在我的情况下)
$x3 = $overview[0]->subject;
$subject = imap_mime_header_decode(x3);
$subject = iconv('ISO-8859-2','utf-8',$subject[0]->text);