У меня есть PHP-скрипт, который мой почтовый сервер пишет по электронной почте через STDIN. Есть ли простой / не запутанный способ взять необработанную строку электронной почты и отправить / переслать / передать ее на конкретный адрес электронной почты?
Я стесняюсь использовать mail()
PHP mail()
или Pear::Mail
потому что, насколько я могу судить, я не могу просто передать сырое письмо. Я должен разбирать заголовки, тем самым рискуя удалить или изменить содержимое оригинального электронного письма.
Каким будет рекомендуемый способ сделать это с минимальным «досаждением» исходного содержимого электронной почты?
Примечание. Если нет встроенного подхода, существуют ли существующие библиотеки, которые могли бы мне помочь?
У меня была та же проблема, но я нашел решение, которое швы для работы. Откройте сокет в PHP и «telnetting» необработанные электронные письма. Что-то вроде этого:
$lSmtpTalk = array( array('220', 'HELO my.hostname.com'.chr(10)), array('250', 'MAIL FROM: me@hostname.com'.chr(10)), array('250', 'RCPT TO: you@anotherhost.com'.chr(10)), array('250', 'DATA'.chr(10)), array('354', $lTheRawEmailStringWithHeadersAndBody.chr(10).'.'.chr(10)), array('250', 'QUIT'.chr(10)), array('221', '')); $lConnection = fsockopen('mail.anotherhost.dk', 25, $errno, $errstr, 1); if (!$lConnection) abort('Cant relay, no connnection'); for ($i=0;$i<count($lSmtpTalk);$i++) { $lRes = fgets($lConnection, 256); if (substr($lRes, 0, 3) !== $lSmtpTalk[$i][0]) abort('Got '.$lRes.' - expected: '.$lSmtpTalk[$i][0]); if ($lSmtpTalk[$i][1] !== '') fputs($lConnection, $lSmtpTalk[$i][1]); } fclose($lConnection);
Возможно, вам понадобится найти mx-host, если вы этого не знаете. У Google есть ответ на это, я уверен.
В этой статье вы можете отправить текстовое электронное письмо с использованием PHP. Вы можете использовать Zend / Mail.php пакет из Zend Framework.
require_once 'Zend/Mail.php'; require_once 'Zend/Validate/EmailAddress.php'; $mail=new Zend_Mail(); $validator=new Zend_Validate_EmailAddress(); ///////... $mail->setBodyText(strip_tags($_POST['message'])); $mail->setBodyHtml($_POST['message']);
setBodyText служит в качестве альтернативного заголовка mime-типа для текстовой электронной почты, а setBodyHtml для версии hmtl.
Надеюсь, это поможет. Сообщите нам, если это сработает.
Я столкнулся с одной и той же проблемой, лучшим решением, которое я мог бы придумать (среда linux), было то, чтобы передать необработанное сообщение в maildrop и предоставить ему файл mailfilter, который только что указал предполагаемого получателя.
После этого я обнаружил, что Exchange-сервер идентифицирует это сообщение как дубликат, так как один с тем же идентификатором-идентификатором уже был в своем хранилище, поэтому я также перенаправил рефайле, чтобы создать новый идентификатор сообщения, в результате чего:
/usr/bin/reformail -R Message-ID: Original-Message-ID: -A'Message-ID:' | /usr/bin/maildrop maildrop-file
… загрузил сырое письмо в PHP с помощью proc_open ()
«maildrop-file» содержит ничего, кроме
to "!recipient@domain.com"