imap_body перерывы - PullRequest
       9

imap_body перерывы

0 голосов
/ 14 мая 2011

У меня есть скрипт, который будет пересылать почту с одного исходного IMAP-сервера на целевой IMAP-сервер.Я написал этот скрипт локально в моем xampp с затмением как IDE.Локально работает нормально.Но без ВНУТРЕННЕЙ ДАТЫ.Поскольку моя версия XAMPP-PHP была старой.

Поэтому я переместил скрипт на свой сервер, на котором работает PHP 5.3.6-pl0-gentoo .

Шаг 1:
В начале сценарий будет кэшировать все письма одного ящика в файлы в файловой системе (FileCache).

Шаг 2:
После того как IMAP-Connection-Ressource изменен на целевой IMAP-почтовый ящик, сценарий выполнит «imap_append» для всех кэшированных писем, чтобы записать эти письма в целевой IMAP-почтовый ящик.

Повторюсь, этот сценарий работает нормальнона локальной машине (без INTERNALDATE)!INTERNALDATE используется только для imap_append.Таким образом, первый шаг (кэширование) не имеет ничего общего с INTERNALDATE!

Моя проблема:
При кэшировании почты он прерывается после 4 ** писем.Это всегда одна и та же почта, где она ломается.и он каждый раз ломается на "imap_body". В этом письме нет ничего особенного: обычный html с вложением (1x 32 МБ, 7z-файл)

На локальном компьютере это письмо было передано этим сценарием.

Некоторая информация о выполнении:

  1. Тайм-аут выполнения PHP установлен на 3 часа (сценарий выполняется за 3 минуты до его остановки).
  2. Ограничение памяти PHP составляет1 ГБ (на машине 2 ГБ) сценарий использует 63 МБ, прежде чем он сломается.
  3. Время ожидания сокета PHP установлено на 3 часа.
  4. Загрузка заголовка этой специальной почты работаетхорошо на обеих системах.Только для загрузки тело будет ломаться.
  5. В моем анализе это ломается непосредственно после "call_user_func_array" с "imap_body"

ЗдесьМой сценарий:

Получатель RawHeader одной почты

/**
 * Getter of $_rawHeader
 * @access public
 * @return Content of $_rawHeader
 */
public function getRawHeader($update=false) {
        if(!$this->_rawHeader || $update) {
                $cachename = urlencode('imap_'.$this->getIMAP()->getInstanceName().$this->getIndex().'_rawheader');
                if(!($this->_rawHeader = $this->Cache()->get($cachename)) || $update) {
                        $this->_rawHeader = $this->getIMAP()->fetchheader($this->getIndex());
                        $this->Cache()->set($cachename, $this->_rawHeader, 2592000);
                        SYSLOG::debug($this->_rawHeader);
                }
        }
        return $this->_rawHeader;
}

Получатель RawBody одной почты

/**
 * Getter of $_rawBody
 * @access public
 * @return Content of $_rawBody
 */
public function getRawBody($update=false) {
        if(!$this->_rawBody || $update) {
                $cachename = urlencode('imap_'.$this->getIMAP()->getInstanceName().$this->getIndex().'_rawbody');
                if(!($this->_rawBody = $this->Cache()->get($cachename)) || $update) {
                        SYSLOG::debug($this->getIMAP()->body($this->getIndex()));
                        $this->_rawBody = $this->getIMAP()->body($this->getIndex());
                        SYSLOG::debug($this->_rawBody);
                        $this->Cache()->set($cachename, $this->_rawBody, 2592000);
                }
        }
        return $this->_rawBody;
}

Call-функция на IMAP-классе:

/**
 * Catch not accessable Method-Calls
 *
 * @param String Methodname
 * @param String Arguments
 *
 * This Method is for calling IMAP-Functions without "imap_" präfix
 * Possilbe Methods are: Look at http://de3.php.net/manual/en/ref.imap.php
 *
 * @link http://de3.php.net/manual/en/ref.imap.php
 *
 * @return null || Function-Return
 */
public function __call($function, $arguments) {
        //SYSLOG::debug('Call Function "imap_'.$function.'" on IMAP-Connection: '.$this->getAddress().':'.$this->getUsername());
        if(function_exists('imap_'.$function)) {
                //Filtered Function that doesn't need Handle
                $filter = array(
                        '8bit',
                        'alerts',
                        'base64',
                        'binary',
                        'errors',
                        'last_error',
                        'mail_compose',
                        'mime_header_decode',
                        'qprint',
                        'rfc822_parse_adrlist',
                        'rfc822_parse_headers',
                        'rfc822_write_address',
                        'timeout',
                        'utf7_decode',
                        'utf7_encode',
                        'utf8'
                );
                //SYSLOG::info($this->_handle);
                if($function == 'reopen' && !$this->_handle) {
                        if(!$this->open()) {
                                return false;
                        }
                }

                //Make sure that the Connection is open if its needed
                if(in_array($function, $filter) || $function == 'reopen' || $this->open()) {
                        if(!in_array($function, $filter)) {
                                // Prepend the imap resource to the arguments array
                                array_unshift($arguments, $this->_handle);
                        }
                        // Call the PHP function
                        $func = 'imap_'.$function;
                        //SYSLOG::debug($arguments);
                        SYSLOG::debug('Call Function "'.$func.'" on IMAP-Connection: '.$this->getAddress().':'.$this->getUsername());
                        $result = call_user_func_array($func, $arguments);
                        //SYSLOG::debug($result);
                        return $result;
                } else {
                        SYSLOG::warning('IMAP-Connection not available! Call-Function: "imap_'.$function.'" aborted!');
                }
        } else {
                SYSLOG::error('Call-Function: "imap_'.$function.'" does not exist!');
        }
        return null;
}

Есть идеи, почему он ломается?

Большое спасибо за помощь.

1 Ответ

0 голосов
/ 16 мая 2011

Я нашел решение для моей проблемы. Итак, я обнаружил, что вложение почты является большим. Я не знаю, как это работает локально на моем xampp, но оно определенно слишком велико для моей продуктивной системы.

Это обходной путь. Возможно не правильное решение. Я не знаю. Но это работает.

У меня есть замена:

$this->_rawBody = $this->getIMAP()->body($this->getIndex());

с этим:

//Workaround for imap_body because Attachment is to big
$this->_rawBody = '';
$tmpFileName = 'data_'.$cachename.'.tmp';
$this->getIMAP()->savebody($tmpFileName, $this->getIndex());
$tmpFile = fopen($tmpFileName, 'r');
while(!feof($tmpFile)) {
     $this->_rawBody .= fgets($tmpFile, 4096);
}
fclose($tmpFile);
unlink($tmpFileName);

Спасибо всем, что подумали о моей проблеме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...