2015-04-30 2 views
1

В настоящее время у меня есть старый сценарий, который анализирует сообщения электронной почты, как показано здесь:Настройка MimeMailParser Расширение IMAP

// Accessing the mailbox 
$mailbox = imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX", $mailbox, $mailboxPassword); 
// Retrieving only unread messages 
$mail = imap_search($mailbox, 'UNSEEN'); 

// If no new messages found aborting the script 
if(empty($mail)) die('No unread emails found!'); 

$total_found = 0; 
$skipped = 0; 
// Now we loop through messages 
foreach ($mail as $key => $val) { 
    // process everything 
} 

Это прекрасно работает, кроме некоторых вопросов кодирования с русскими (кириллическими) символов и несколько других вопросов. Хотя я мог бы выследить все эти проблемы по отдельности, похоже, что есть уже отличные классы разбора писем. Я нашел this, который я бы хотел использовать, поскольку это звучит так, что часто предлагается.

Приведенный пример кода представлен синтаксическим анализатором ниже.

<?php 

require_once('MimeMailParser.class.php'); 

$path = 'path/to/mail.txt'; 
$Parser = new MimeMailParser(); 
$Parser->setPath($path); 

$to = $Parser->getHeader('to'); 
$from = $Parser->getHeader('from'); 
$subject = $Parser->getHeader('subject'); 
$text = $Parser->getMessageBody('text'); 
$html = $Parser->getMessageBody('html'); 
$attachments = $Parser->getAttachments(); 

?> 

Однако, кажется, нужна ссылка на $ путь, который сбивает с толку меня, как электронная почта не хранятся в папке, там вытащил из IMAP. Добавлю ли я $path = $mail; в блок foreach? Если нет, в каком формате я могу отправить электронное письмо парсеру? Должен ли я использовать тот же самый сценарий, который у меня есть, и сохранить его в папке?

Все электронные письма извлекаются из Gmail. Я использовал IMAP, но вместо этого мог бы использовать POP, если IMAP не будет работать.


На основе предложенного ответа я попробовал этот код, но его просто пробегают по й непрочитанным сообщениям электронной почты и отображаются пустые данные для всех, заголовков и тела?

// Accessing the mailbox 
$mailbox = imap_open("{imap.gmail.com:993/imap/ssl/novalidate-cert}INBOX", $mailbox, $mailboxPassword); 
// Retrieving only unread messages 
$mail = imap_search($mailbox, 'UNSEEN'); 

// If no new messages found aborting the script 
if(empty($mail)) die('No unread emails found!'); 

$total_found = 0; 
$skipped = 0; 
// Now we loop through messages 
foreach ($mail as $email) { 
    $Parser = new MimeMailParser(); 
    $Parser->setText($mail); 

    echo "-----------------------------Start Of Email---------------------------------"; 
    echo "<br /><br /><br /><br />"; 
    $to = $Parser->getHeader('to'); 
    echo "To: " . $to . "<br />"; 
    $from = $Parser->getHeader('from'); 
    echo "From: " . $from . "<br />"; 
    $subject = $Parser->getHeader('subject'); 
    echo "Subject: " . $subject . "<br /><br /><br />"; 
    //$text = $Parser->getMessageBody('text'); 
    $html = $Parser->getMessageBody('html'); 
    echo "Body: " . "<br /><br />" . $html . "<br />"; 
    //$attachments = $Parser->getAttachments(); 
    echo "<br /><br /><br /><br />"; 
    echo "-----------------------------End Of Email---------------------------------"; 
} 

ответ

1

У этого класса есть другая функция, позволяющая напрямую установить содержание сообщения. Просто вызовите $ Parser-> setText ($ mail), где $ mail - это содержимое сообщения в вашем цикле foreach IMAP.

+0

Спасибо, я попробовал это, но он, похоже, не работал. Я отредактировал мой код выше, чтобы показать, что я пробовал, я нашел это, но не уверен, что его правильно или нет: Единственными потоками, которые вы можете использовать, являются STDIN и файловые ресурсы. Любой поток, который требует определенного протокола, такого как IMAP или POP, НЕ поддерживается. Сначала вам нужно сначала загрузить электронное письмо в файл, а затем передать его в MimeMailParser. Означает ли это, что мне просто нужно сначала сохранить электронное письмо перед его чтением, и если да, то в каком формате я могу просто присоединиться к заголовкам и телу и использовать put_file_contents и сохранить его в виде текстового файла или есть конкретный формат? – user1547410

+0

Основываясь на вашем коде выше, он должен быть $ email внутри setText не $ mail. Это работает, если вы измените это? – theark40

+0

Извините, я попробовал пару вещей, нужно было попробовать как $ email, так и $ mail, чтобы узнать, не изменилось ли это, а не действительно логично, поскольку $ mail - это все электронные письма, но я все равно попробовал, просто забыл переключить его обратно на $ электронная почта, так что в принципе никоим образом не работает – user1547410

Смежные вопросы