В настоящее время у меня есть старый сценарий, который анализирует сообщения электронной почты, как показано здесь:Настройка 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---------------------------------";
}
Спасибо, я попробовал это, но он, похоже, не работал. Я отредактировал мой код выше, чтобы показать, что я пробовал, я нашел это, но не уверен, что его правильно или нет: Единственными потоками, которые вы можете использовать, являются STDIN и файловые ресурсы. Любой поток, который требует определенного протокола, такого как IMAP или POP, НЕ поддерживается. Сначала вам нужно сначала загрузить электронное письмо в файл, а затем передать его в MimeMailParser. Означает ли это, что мне просто нужно сначала сохранить электронное письмо перед его чтением, и если да, то в каком формате я могу просто присоединиться к заголовкам и телу и использовать put_file_contents и сохранить его в виде текстового файла или есть конкретный формат? – user1547410
Основываясь на вашем коде выше, он должен быть $ email внутри setText не $ mail. Это работает, если вы измените это? – theark40
Извините, я попробовал пару вещей, нужно было попробовать как $ email, так и $ mail, чтобы узнать, не изменилось ли это, а не действительно логично, поскольку $ mail - это все электронные письма, но я все равно попробовал, просто забыл переключить его обратно на $ электронная почта, так что в принципе никоим образом не работает – user1547410