Создание каталогов и запись файлов с помощью PHP из канала sendmail в программу - PullRequest
0 голосов
/ 11 мая 2011

У меня есть скрипт, который читает электронные письма (с вложениями) из канала, и я пытаюсь сохранить вложения (ы) на диск для дальнейшей обработки. Я собрал воедино некоторый код с нескольких сайтов, и я не могу получить файлы для сохранения. Я использую 777 в качестве значения chmod, так что разрешения не кажутся проблемой, но я хотел знать, возможно ли я ограничен определенными командами PHP при использовании процессора командной строки, а не браузера. Кроме того, я даже жестко закодировал каталоги «include» в том случае, если файл не выполняется из каталога, в котором он находится. Любая помощь будет принята с благодарностью!

#!/usr/bin/php
<?php
//debug
#ini_set ("display_errors", "1");
#error_reporting(E_ALL);

include('/var/www/simple_html_dom.php');

//include email parser
require_once('/var/www/rfc822_addresses.php');
require_once('/var/www/mime_parser.php');

// read email in from stdin
$fd = fopen("php://stdin", "r");
$email = "";
while (!feof($fd)) {
    $email .= fread($fd, 1024);
}
fclose($fd);

//create the email parser class
$mime=new mime_parser_class;
$mime->ignore_syntax_errors = 1;
$parameters=array(
    'Data'=>$email,
);

$mime->Decode($parameters, $decoded);

//---------------------- GET EMAIL HEADER INFO -----------------------//

//get the name and email of the sender
$fromName = $decoded[0]['ExtractedAddresses']['from:'][0]['name'];
$fromEmail = $decoded[0]['ExtractedAddresses']['from:'][0]['address'];

//get the name and email of the recipient
$toEmail = $decoded[0]['ExtractedAddresses']['to:'][0]['address'];
$toName = $decoded[0]['ExtractedAddresses']['to:'][0]['name'];

//get the subject
$subject = $decoded[0]['Headers']['subject:'];

$removeChars = array('<','>');

//get the message id
$messageID = str_replace($removeChars,'',$decoded[0]['Headers']['message-id:']);

//get the reply id
//$replyToID = str_replace($removeChars,'',$decoded[0]['Headers']['in-reply-to:']);

//---------------------- FIND THE BODY -----------------------//

//get the message body
if(substr($decoded[0]['Headers']['content-type:'],0,strlen('text/plain')) == 'text/plain' && isset($decoded[0]['Body'])){

    $body = $decoded[0]['Body'];

} elseif(substr($decoded[0]['Parts'][0]['Headers']['content-type:'],0,strlen('text/plain')) == 'text/plain' && isset($decoded[0]['Parts'][0]['Body'])) {

    $body = $decoded[0]['Parts'][0]['Body'];

} elseif(substr($decoded[0]['Parts'][0]['Parts'][0]['Headers']['content-type:'],0,strlen('text/plain')) == 'text/plain' && isset($decoded[0]['Parts'][0]['Parts'][0]['Body'])) {

    $body = $decoded[0]['Parts'][0]['Parts'][0]['Body'];

}
    $my_dir = base64_encode($fromEmail);
    shell_exec('mkdir -p /var/www/tmp/' . $my_dir . ' -m 777');
    //mkdir($_SERVER['DOCUMENT_ROOT'] . "tmp/" . $my_dir, 0777, true);

    $target_path = "var/www/tmp/" . $my_dir;
    //chdir($target_path);

    //------------------------ ATTACHMENTS ------------------------------------//

//loop through email parts
foreach($decoded[0]['Parts'] as $part){

    //check for attachments
    if($part['Content-Disposition'] == 'attachment'){

        //format file name (change spaces to underscore then remove anything that isn't a letter, number or underscore)
        $filename = preg_replace('/[^0-9,a-z,\.,_]*/i','',str_replace(' ','_', $part['FileName']));

        // write the data to the file
        $fp = fopen($target_path . "/" . $filename, 'w');
        $written = fwrite($fp,$part['Body']);
        fclose($fp);

        //add file to attachments array
        $attachments[] = $part['FileName'];

    }

}

$html = file_get_html($attachments);

Обновление: спасибо за информативный ответ ... Я пытался выяснить, как запустить из командной строки. Сейчас я получаю некоторые ошибки, но они все еще не имеют особого смысла:

PHP Notice:  Undefined index: name in /var/www/catcher.php on line 38
PHP Notice:  Undefined index: Content-Disposition in /var/www/catcher.php on line 80
PHP Notice:  Undefined index: Content-Disposition in /var/www/catcher.php on line 80
PHP Notice:  Undefined variable: attachments in /var/www/catcher.php on line 97
PHP Warning:  file_get_contents(): Filename cannot be empty in /var/www/simple_html_dom.php on line 39

Я уже указал полный путь включения для других файлов, и пользователь smmta должен иметь права на чтение, поскольку каталог / var / www / равен 755.

1 Ответ

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

Использование разрешений 0777 для команды mkdir в вашем сценарии не имеет значения, если пользователь, под которым выполняется сценарий, не может записать в целевой каталог. Итак, если этот скрипт выполняется, например, как sendmail, убедитесь, что этот пользователь может писать в /var/www/tmp.

Несколько советов по отладке: получите полную электронную почту и сохраните ее в файл. Выясните, от какого пользователя запускается этот скрипт (например, sendmail). Затем выполните скрипт вручную из командной строки и следите за ошибками. Например:

sudo -u sendmail /path/to/script.php < /path/to/saved-email.eml

Убедитесь, что отчеты об ошибках включены и т. Д.

Редактировать: Глядя на опубликованные вами ошибки, кажется, что MIME-декодер не может правильно проанализировать ваше сообщение так, как вы ожидаете. Похоже, вы не проверяете ошибки, поэтому вместо этого вы получаете уведомления и предупреждения о неопределенных индексах.

Проверьте вход и выход декодера. Убедитесь, что сообщение декодировано так, как вы ожидаете.

...