我正在用PHP创建一个票证系统,它可以获取电子邮件并将它们放入数据库中。 奇怪的是,当收件箱中有多封电子邮件时,它们会被多次放入数据库。 邮件1正在DB中插入一次。 邮件2正在DB中插入2次。 邮件3正在DB中插入3次。 可能是这样......(仅在同一时间测试3封邮件)
我正在使用的代码是:
<?php
error_reporting( E_ALL );
ini_set('display_errors', 1);
$path = $_SERVER['SCRIPT_FILENAME'];
$path = str_replace('/includes/cronjob.php', '/', $path);
require_once($path . 'config/config.php');
require_once($path . 'config/config_extra.php');
require_once($path . 'config/db_connect.php');
require_once($path . 'classes/tickets.class.php');
require_once($path . 'classes/crm.class.php');
require_once($path . 'classes/mails.class.php');
require_once($path . 'includes/functions.php');
$tickets = new tickets();
$crm = new crm();
$mails = new mails();
$now = time(); // current time
if($lic_info['trs'] == 0){ die(); }
$ticketAccounts = $tickets->get_accounts();
if($ticketAccounts > 0){
foreach($ticketAccounts AS $key=>$ticketAccounts){
$mailboxPort = get_mailboxPort($ticketAccounts['type']);
$mailbox = '{'.$ticketAccounts['server'].':'.$mailboxPort.'/imap/ssl/novalidate-cert}';
$mailFolder = $ticketAccounts['folder'];
$mailDoneFolder = $ticketAccounts['moveFolder'];
$mailErrorFolder = $ticketAccounts['errorFolder'];
$mbox = imap_open($mailbox.$mailFolder, $ticketAccounts['username'], $ticketAccounts['password']); // log in to mail server
if(imap_num_msg($mbox) < 1){ die(); }
if (!$mbox)
echo ($lang['error_msg']['mailconnect'] . print_r(imap_errors(), true)); // remove the print_r for production use
else
{
$box = imap_check($mbox); // get the inbox
for ($imap_idx = 1; $imap_idx <= $box->Nmsgs; $imap_idx++) // loop through the messages
{
$headers = imap_headerinfo($mbox, $imap_idx); // http://www.php.net/manual/en/function.imap-headerinfo.php
$raw_headers = imap_fetchheader($mbox, $imap_idx); // http://www.php.net/manual/en/function.imap-fetchheader.php
$selected_headers = '';
$text_part = '';
$html_part = '';
$original_message = imap_body($mbox, $imap_idx); // save the copy of the entire thing, attachments and all
// build selected headers string
for ($ii = 0; $ii < count($headers->from); $ii++)
$selected_headers .= 'From: ' . $headers->from[$ii]->mailbox . '@' . $headers->from[$ii]->host . "\n";
for ($ii = 0; $ii < count($headers->to); $ii++)
$selected_headers .= 'To: ' . $headers->to[$ii]->mailbox . '@' . $headers->to[$ii]->host . "\n";
for ($ii = 0; $ii < count($headers->cc); $ii++)
$selected_headers .= 'Cc: ' . $headers->cc[$ii]->mailbox . '@' . $headers->cc[$ii]->host . "\n";
for ($ii = 0; $ii < count($headers->bcc); $ii++)
$selected_headers .= 'Bcc: ' . $headers->bcc[$ii]->mailbox . '@' . $headers->bcc[$ii]->host . "\n";
if (!empty($headers->date))
$selected_headers .= 'Date: ' . $headers->date . "\n";
if (!empty($headers->subject))
$selected_headers .= 'Subject: ' . $headers->subject . "\n";
// see below; getMsg uses global variables
getMsg($mbox, $imap_idx);
$text_part = $plainmsg; // text portion of the email
$html_part = $htmlmsg; // html portion of the email
// check for text portion first
$msg_text = trim(strip_tags($plainmsg, '<a>'));
if ($msg_text == '')
{
// text portion is empty, check html portion
$msg_text = trim($htmlmsg);
if ($msg_text == '')
{
// no text or html portion auto-detected, check manually
$msg_text = imap_body($mbox, $imap_idx); // get the entire raw message
// check for quoted-printable encoding with possible boundary markers and headers at the top
$chunks = explode("\n", trim($msg_text));
if (count($chunks) > 1) // if there are multiple lines
{
$quoted_printable = false;
if (strpos($chunks[0], '--') === 0) // if the first line is a boundary marker (starts with '--')
{
array_shift($chunks); // remove the first line
if (strpos($chunks[count($chunks) - 1], '--') === 0) // check the last line
{
array_pop($chunks); // remove that too
}
}
if (strpos(strtolower($chunks[0]), 'content-type') === 0)
array_shift($chunks); // remove the first line if it's a content-type header
if (strpos(strtolower($chunks[0]), 'content-transfer-encoding') === 0)
{
if (strpos(strtolower($chunks[0]), 'quoted-printable'))
$quoted_printable = true; // this email was sent using quoted-printable encoding
array_shift($chunks); // remove the content-transfer-encoding header
}
$msg_text = implode("\n", $chunks); // put the remaining lines back together
if ($quoted_printable) $msg_text = quoted_printable_decode($msg_text);
$msg_text = utf8_decode($msg_text);
}
}
}
$from = trim($headers->from[0]->mailbox . '@' . $headers->from[0]->host);
$msgId = isset($headers->message_id) ? trim($headers->message_id) : '';
$time = strtotime($headers->date);
if ($time == 0)
$time = $now;
/******************************************************
At this point:
$headers: the object returned from imap_headerinfo
$selected_headers: text of some headers to display to a user checking mail (subject, from, etc)
$text_part: the text portion, if found
$html_part: the html portion, if found
$msg_text: either the text part, html part, or manually-decoded part (this is the variable to use as email body)
$original_message: the entire unprocessed email body, including all parts and any attachments
$from: From address
$msgId: message ID from the headers
$time: email delivery time, as a Unix timestamp
$attachments: array of attachments (see below)
******************************************************/
$to = $headers->to[$ii]->mailbox . '@' . $headers->to[$ii]->host;
if(strpos($headers->subject,'[GR_Ticket:') !== false){ $ticketnr = extract_unit($headers->subject, '[GR_Ticket:', ']'); }
$msg_text = editChars($html_part);
if(strpos($msg_text,'<html') !== false){
$msg_text = editString($msg_text);
}
$headers->subject = editChars($headers->subject);
$headers->subject = str_replace('_', ' ', $headers->subject);
//echo strip_tags($html_part);die();
$queue = $tickets->search_queue($to);
if(isset($ticketnr)){
$checkTicket = $tickets->show_ticket($ticketnr);
if($checkTicket == 0){ $newTicket = 1; } else { $newTicket = 0; }
} else {
$newTicket = 1;
}
$findSender = $crm->find_company_sender($from);
if($findSender == 0){ $fromComp = 0; } else { $fromComp = $findSender['id']; }
$findSender = $crm->find_contact_sender($from);
if($findSender == 0){ $fromContact = 0; } else { $fromContact = $findSender['id']; }
if($newTicket == 0){
$ticketNumber = $tickets->create_reply($headers->from[0]->personal,$from,$fromComp,$fromContact,$ticketnr,$headers->subject,$msg_text,$time,$headers->toaddress,$to,1);
}
if($newTicket == 1){
$ticketNumber = $tickets->create_ticket($headers->from[0]->personal,$from,$fromComp,$fromContact,$headers->subject,$msg_text,$time,$headers->toaddress,$to,0,0,1,0,0,$queue['id']);
if($ticketNumber > 0){
//$mails->auto_reply($ticketNumber,$from,$headers->subject,$msg_text,$queue['id']);
}
}
// BELANGRIJK: Ticketnummer: echo '<br /><br />' . $ticketNumber . '<br /><br />';
$mailuid = trim($headers->Msgno, ' ');
if($ticketNumber == 0){
if(!imap_getmailboxes($mbox, $mailbox, $mailErrorFolder)){
imap_createmailbox($mbox,$mailbox.$mailErrorFolder);
}
$imapresult = imap_mail_move($mbox, '1:'.$mailuid, 'Errors');
if($imapresult==false){die(imap_last_error());}
imap_expunge($mbox);
$tickets->create_error($from,$to,$queue['id'],$lang['error_msg']['import_error']);die();
}
// process attachments
foreach ($attachments as $filename => $data)
{
if($newTicket == 0){
if(!is_dir($path . 'attachments/tickets/' . $ticketnr)){
mkdir($path . 'attachments/tickets/' . $ticketnr);
}
if(!is_dir($path . 'attachments/tickets/'.$ticketnr.'/'.$ticketNumber.'')){
mkdir($path . 'attachments/tickets/'.$ticketnr.'/'.$ticketNumber.'');
}
file_put_contents($path . 'attachments/tickets/'.$ticketnr.'/'.$ticketNumber.'/' . $filename, $data);
$tickets->add_attachment($ticketnr,$ticketNumber,$filename);
} else {
if(!is_dir($path . 'attachments/tickets/' . $ticketNumber)){
mkdir($path . 'attachments/tickets/' . $ticketNumber);
}
file_put_contents($path . 'attachments/tickets/'.$ticketNumber.'/' . $filename, $data);
$tickets->add_attachment($ticketNumber,0,$filename);
}
}
unset($ticketnr);
unset($newTicket);
unset($ticketNumber);
}
// Move emails and close the mailbox
if(!imap_getmailboxes($mbox, $mailbox, $mailDoneFolder)){
imap_createmailbox($mbox,$mailbox.$mailDoneFolder);
}
$imapresult = imap_mail_move($mbox, '1:'.$mailuid, $mailDoneFolder);
if($imapresult==false){die(imap_last_error());}
imap_expunge($mbox);
imap_close($mbox);
}
}
}
function getMsg($mbox,$mid) {
// input $mbox = IMAP stream, $mid = message id
// output all the following:
global $htmlmsg,$plainmsg,$charset,$attachments;
// the message may in $htmlmsg, $plainmsg, or both
$htmlmsg = $plainmsg = $charset = '';
$attachments = array();
// HEADER
$h = imap_header($mbox,$mid);
// add code here to get date, from, to, cc, subject...
// BODY
$s = imap_fetchstructure($mbox,$mid);
if (empty($s->parts)) // not multipart
getMsgPart($mbox,$mid,$s,0); // no part-number, so pass 0
else { // multipart: iterate through each part
foreach ($s->parts as $partno0=>$p)
getMsgPart($mbox,$mid,$p,$partno0+1);
}
}
function getMsgPart($mbox,$mid,$p,$partno) {
// $partno = '1', '2', '2.1', '2.1.3', etc if multipart, 0 if not multipart
global $htmlmsg,$plainmsg,$charset,$attachments;
// DECODE DATA
$data = ($partno)?
imap_fetchbody($mbox,$mid,$partno): // multipart
imap_body($mbox,$mid); // not multipart
// Any part may be encoded, even plain text messages, so check everything.
if ($p->encoding==4)
$data = quoted_printable_decode($data);
elseif ($p->encoding==3)
$data = base64_decode($data);
// no need to decode 7-bit, 8-bit, or binary
// PARAMETERS
// get all parameters, like charset, filenames of attachments, etc.
$params = array();
if ($p->ifparameters)
foreach ($p->parameters as $x)
$params[ strtolower( $x->attribute ) ] = $x->value;
if ($p->ifdparameters)
foreach ($p->dparameters as $x)
$params[ strtolower( $x->attribute ) ] = $x->value;
// ATTACHMENT
// Any part with a filename is an attachment,
// so an attached text file (type 0) is not mistaken as the message.
if (!empty($params['filename']) || !empty($params['name'])) {
// filename may be given as 'Filename' or 'Name' or both
$filename = (!empty($params['filename']))? $params['filename'] : $params['name'];
// filename may be encoded, so see imap_mime_header_decode()
$attachments[$filename] = $data; // this is a problem if two files have same name
}
// TEXT
elseif ($p->type==0 && $data) {
// Messages may be split in different parts because of inline attachments,
// so append parts together with blank row.
if ($p->ifsubtype && strtolower($p->subtype)=='plain')
$plainmsg .= trim($data) ."\n\n";
else
$htmlmsg .= $data ."<br><br>";
$charset = $params['charset']; // assume all parts are same charset
}
// EMBEDDED MESSAGE
// Many bounce notifications embed the original message as type 2,
// but AOL uses type 1 (multipart), which is not handled here.
// There are no PHP functions to parse embedded messages,
// so this just appends the raw source to the main message.
elseif ($p->type==2 && $data) {
$plainmsg .= trim($data) ."\n\n";
}
// SUBPART RECURSION
if (!empty($p->parts)) {
foreach ($p->parts as $partno0=>$p2)
getMsgPart($mbox,$mid,$p2,$partno.'.'.($partno0+1)); // 1.2, 1.2.1, etc.
}
}
&GT;
但是当我在fetchmail循环外部移动数据库插件时,所有电子邮件都会移动到正确的“完成”文件夹,但只有一封电子邮件会插入到数据库中。 发生这种情况时我正在使用的代码:
<?php
error_reporting( E_ALL );
ini_set('display_errors', 1);
$path = $_SERVER['SCRIPT_FILENAME'];
$path = str_replace('/includes/cronjob.php', '/', $path);
require_once($path . 'config/config.php');
require_once($path . 'config/config_extra.php');
require_once($path . 'config/db_connect.php');
require_once($path . 'classes/tickets.class.php');
require_once($path . 'classes/crm.class.php');
require_once($path . 'classes/mails.class.php');
require_once($path . 'includes/functions.php');
$tickets = new tickets();
$crm = new crm();
$mails = new mails();
$now = time(); // current time
if($lic_info['trs'] == 0){ die(); }
$ticketAccounts = $tickets->get_accounts();
if($ticketAccounts > 0){
foreach($ticketAccounts AS $key=>$ticketAccounts){
$mailboxPort = get_mailboxPort($ticketAccounts['type']);
$mailbox = '{'.$ticketAccounts['server'].':'.$mailboxPort.'/imap/ssl/novalidate-cert}';
$mailFolder = $ticketAccounts['folder'];
$mailDoneFolder = $ticketAccounts['moveFolder'];
$mailErrorFolder = $ticketAccounts['errorFolder'];
$mbox = imap_open($mailbox.$mailFolder, $ticketAccounts['username'], $ticketAccounts['password']); // log in to mail server
if(imap_num_msg($mbox) < 1){ die(); }
if (!$mbox)
echo ($lang['error_msg']['mailconnect'] . print_r(imap_errors(), true)); // remove the print_r for production use
else
{
$box = imap_check($mbox); // get the inbox
for ($imap_idx = 1; $imap_idx <= $box->Nmsgs; $imap_idx++) // loop through the messages
{
$headers = imap_headerinfo($mbox, $imap_idx); // http://www.php.net/manual/en/function.imap-headerinfo.php
$raw_headers = imap_fetchheader($mbox, $imap_idx); // http://www.php.net/manual/en/function.imap-fetchheader.php
$selected_headers = '';
$text_part = '';
$html_part = '';
$original_message = imap_body($mbox, $imap_idx); // save the copy of the entire thing, attachments and all
// build selected headers string
for ($ii = 0; $ii < count($headers->from); $ii++)
$selected_headers .= 'From: ' . $headers->from[$ii]->mailbox . '@' . $headers->from[$ii]->host . "\n";
for ($ii = 0; $ii < count($headers->to); $ii++)
$selected_headers .= 'To: ' . $headers->to[$ii]->mailbox . '@' . $headers->to[$ii]->host . "\n";
for ($ii = 0; $ii < count($headers->cc); $ii++)
$selected_headers .= 'Cc: ' . $headers->cc[$ii]->mailbox . '@' . $headers->cc[$ii]->host . "\n";
for ($ii = 0; $ii < count($headers->bcc); $ii++)
$selected_headers .= 'Bcc: ' . $headers->bcc[$ii]->mailbox . '@' . $headers->bcc[$ii]->host . "\n";
if (!empty($headers->date))
$selected_headers .= 'Date: ' . $headers->date . "\n";
if (!empty($headers->subject))
$selected_headers .= 'Subject: ' . $headers->subject . "\n";
// see below; getMsg uses global variables
getMsg($mbox, $imap_idx);
$text_part = $plainmsg; // text portion of the email
$html_part = $htmlmsg; // html portion of the email
// check for text portion first
$msg_text = trim(strip_tags($plainmsg, '<a>'));
if ($msg_text == '')
{
// text portion is empty, check html portion
$msg_text = trim($htmlmsg);
if ($msg_text == '')
{
// no text or html portion auto-detected, check manually
$msg_text = imap_body($mbox, $imap_idx); // get the entire raw message
// check for quoted-printable encoding with possible boundary markers and headers at the top
$chunks = explode("\n", trim($msg_text));
if (count($chunks) > 1) // if there are multiple lines
{
$quoted_printable = false;
if (strpos($chunks[0], '--') === 0) // if the first line is a boundary marker (starts with '--')
{
array_shift($chunks); // remove the first line
if (strpos($chunks[count($chunks) - 1], '--') === 0) // check the last line
{
array_pop($chunks); // remove that too
}
}
if (strpos(strtolower($chunks[0]), 'content-type') === 0)
array_shift($chunks); // remove the first line if it's a content-type header
if (strpos(strtolower($chunks[0]), 'content-transfer-encoding') === 0)
{
if (strpos(strtolower($chunks[0]), 'quoted-printable'))
$quoted_printable = true; // this email was sent using quoted-printable encoding
array_shift($chunks); // remove the content-transfer-encoding header
}
$msg_text = implode("\n", $chunks); // put the remaining lines back together
if ($quoted_printable) $msg_text = quoted_printable_decode($msg_text);
$msg_text = utf8_decode($msg_text);
}
}
}
$from = trim($headers->from[0]->mailbox . '@' . $headers->from[0]->host);
$msgId = isset($headers->message_id) ? trim($headers->message_id) : '';
$time = strtotime($headers->date);
if ($time == 0)
$time = $now;
/******************************************************
At this point:
$headers: the object returned from imap_headerinfo
$selected_headers: text of some headers to display to a user checking mail (subject, from, etc)
$text_part: the text portion, if found
$html_part: the html portion, if found
$msg_text: either the text part, html part, or manually-decoded part (this is the variable to use as email body)
$original_message: the entire unprocessed email body, including all parts and any attachments
$from: From address
$msgId: message ID from the headers
$time: email delivery time, as a Unix timestamp
$attachments: array of attachments (see below)
******************************************************/
$to = $headers->to[$ii]->mailbox . '@' . $headers->to[$ii]->host;
if(strpos($headers->subject,'[GR_Ticket:') !== false){ $ticketnr = extract_unit($headers->subject, '[GR_Ticket:', ']'); }
$msg_text = editChars($html_part);
if(strpos($msg_text,'<html') !== false){
$msg_text = editString($msg_text);
}
$headers->subject = editChars($headers->subject);
$headers->subject = str_replace('_', ' ', $headers->subject);
//echo strip_tags($html_part);die();
$queue = $tickets->search_queue($to);
if(isset($ticketnr)){
$checkTicket = $tickets->show_ticket($ticketnr);
if($checkTicket == 0){ $newTicket = 1; } else { $newTicket = 0; }
} else {
$newTicket = 1;
}
$findSender = $crm->find_company_sender($from);
if($findSender == 0){ $fromComp = 0; } else { $fromComp = $findSender['id']; }
$findSender = $crm->find_contact_sender($from);
if($findSender == 0){ $fromContact = 0; } else { $fromContact = $findSender['id']; }
}
if($newTicket == 0){
$ticketNumber = $tickets->create_reply($headers->from[0]->personal,$from,$fromComp,$fromContact,$ticketnr,$headers->subject,$msg_text,$time,$headers->toaddress,$to,1);
}
if($newTicket == 1){
$ticketNumber = $tickets->create_ticket($headers->from[0]->personal,$from,$fromComp,$fromContact,$headers->subject,$msg_text,$time,$headers->toaddress,$to,0,0,1,0,0,$queue['id']);
if($ticketNumber > 0){
//$mails->auto_reply($ticketNumber,$from,$headers->subject,$msg_text,$queue['id']);
}
}
$mailuid = trim($headers->Msgno, ' ');
if($ticketNumber == 0){
if(!imap_getmailboxes($mbox, $mailbox, $mailErrorFolder)){
imap_createmailbox($mbox,$mailbox.$mailErrorFolder);
}
$imapresult = imap_mail_move($mbox, '1:'.$mailuid, 'Errors');
if($imapresult==false){die(imap_last_error());}
imap_expunge($mbox);
$tickets->create_error($from,$to,$queue['id'],$lang['error_msg']['import_error']);die();
}
// process attachments
foreach ($attachments as $filename => $data)
{
if($newTicket == 0){
if(!is_dir($path . 'attachments/tickets/' . $ticketnr)){
mkdir($path . 'attachments/tickets/' . $ticketnr);
}
if(!is_dir($path . 'attachments/tickets/'.$ticketnr.'/'.$ticketNumber.'')){
mkdir($path . 'attachments/tickets/'.$ticketnr.'/'.$ticketNumber.'');
}
file_put_contents($path . 'attachments/tickets/'.$ticketnr.'/'.$ticketNumber.'/' . $filename, $data);
$tickets->add_attachment($ticketnr,$ticketNumber,$filename);
} else {
if(!is_dir($path . 'attachments/tickets/' . $ticketNumber)){
mkdir($path . 'attachments/tickets/' . $ticketNumber);
}
file_put_contents($path . 'attachments/tickets/'.$ticketNumber.'/' . $filename, $data);
$tickets->add_attachment($ticketNumber,0,$filename);
}
}
unset($ticketnr);
unset($newTicket);
unset($ticketNumber);
// Move emails and close the mailbox
if(!imap_getmailboxes($mbox, $mailbox, $mailDoneFolder)){
imap_createmailbox($mbox,$mailbox.$mailDoneFolder);
}
$imapresult = imap_mail_move($mbox, '1:'.$mailuid, $mailDoneFolder);
if($imapresult==false){die(imap_last_error());}
imap_expunge($mbox);
imap_close($mbox);
}
}
}
function getMsg($mbox,$mid) {
// input $mbox = IMAP stream, $mid = message id
// output all the following:
global $htmlmsg,$plainmsg,$charset,$attachments;
// the message may in $htmlmsg, $plainmsg, or both
$htmlmsg = $plainmsg = $charset = '';
$attachments = array();
// HEADER
$h = imap_header($mbox,$mid);
// add code here to get date, from, to, cc, subject...
// BODY
$s = imap_fetchstructure($mbox,$mid);
if (empty($s->parts)) // not multipart
getMsgPart($mbox,$mid,$s,0); // no part-number, so pass 0
else { // multipart: iterate through each part
foreach ($s->parts as $partno0=>$p)
getMsgPart($mbox,$mid,$p,$partno0+1);
}
}
function getMsgPart($mbox,$mid,$p,$partno) {
// $partno = '1', '2', '2.1', '2.1.3', etc if multipart, 0 if not multipart
global $htmlmsg,$plainmsg,$charset,$attachments;
// DECODE DATA
$data = ($partno)?
imap_fetchbody($mbox,$mid,$partno): // multipart
imap_body($mbox,$mid); // not multipart
// Any part may be encoded, even plain text messages, so check everything.
if ($p->encoding==4)
$data = quoted_printable_decode($data);
elseif ($p->encoding==3)
$data = base64_decode($data);
// no need to decode 7-bit, 8-bit, or binary
// PARAMETERS
// get all parameters, like charset, filenames of attachments, etc.
$params = array();
if ($p->ifparameters)
foreach ($p->parameters as $x)
$params[ strtolower( $x->attribute ) ] = $x->value;
if ($p->ifdparameters)
foreach ($p->dparameters as $x)
$params[ strtolower( $x->attribute ) ] = $x->value;
// ATTACHMENT
// Any part with a filename is an attachment,
// so an attached text file (type 0) is not mistaken as the message.
if (!empty($params['filename']) || !empty($params['name'])) {
// filename may be given as 'Filename' or 'Name' or both
$filename = (!empty($params['filename']))? $params['filename'] : $params['name'];
// filename may be encoded, so see imap_mime_header_decode()
$attachments[$filename] = $data; // this is a problem if two files have same name
}
// TEXT
elseif ($p->type==0 && $data) {
// Messages may be split in different parts because of inline attachments,
// so append parts together with blank row.
if ($p->ifsubtype && strtolower($p->subtype)=='plain')
$plainmsg .= trim($data) ."\n\n";
else
$htmlmsg .= $data ."<br><br>";
$charset = $params['charset']; // assume all parts are same charset
}
// EMBEDDED MESSAGE
// Many bounce notifications embed the original message as type 2,
// but AOL uses type 1 (multipart), which is not handled here.
// There are no PHP functions to parse embedded messages,
// so this just appends the raw source to the main message.
elseif ($p->type==2 && $data) {
$plainmsg .= trim($data) ."\n\n";
}
// SUBPART RECURSION
if (!empty($p->parts)) {
foreach ($p->parts as $partno0=>$p2)
getMsgPart($mbox,$mid,$p2,$partno.'.'.($partno0+1)); // 1.2, 1.2.1, etc.
}
}
?>
任何可以指出我在这里出了什么问题的人?
答案 0 :(得分:0)
不是最好的解决方案,但我删除了fetchmail循环,以便逐个处理消息。