Если письмо отправлено в виде необработанного текста, как я могу отправить его с помощью PHP? - PullRequest
4 голосов
/ 09 июля 2011

У меня есть PHP-скрипт, на который мой почтовый сервер направляет электронные письма через STDIN.Есть ли простой / неконвертированный способ взять необработанную строку электронной почты и отправить / переслать / передать ее на определенный адрес электронной почты?

Я не решаюсь использовать PHP mail() или Pear::Mail, потому что, насколько это далекокак я могу сказать, я не могу просто передать сырое письмо.Я должен был бы проанализировать заголовки, тем самым рискуя удалить или изменить содержимое исходного письма.

Каков был бы рекомендуемый способ сделать это с минимальным «приставанием» к исходному содержимому письма?

Примечание: если нет встроенного подхода, существуют ли какие-либо библиотеки, которые могут помочь мне сделать это?

Ответы [ 3 ]

8 голосов
/ 21 августа 2011

У меня была такая же проблема, но я нашел решение, которое работает. Откройте сокет в PHP и "telnetting" необработанные emaildata. Примерно так:

  $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-хост, если вы этого не знаете. У Google есть ответ на этот вопрос, я уверен.

0 голосов
/ 30 декабря 2015

Я столкнулся с той же проблемой, лучшее решение, которое я мог придумать (среда linux), - это передать необработанное сообщение в maildrop и дать ему файл mailfilter, который только что указал предполагаемого получателя.Имея это в виду, я обнаружил, что сервер Exchange идентифицирует сообщение как дубликат, так как одно с тем же идентификатором сообщения уже находится в его хранилище, поэтому я также провел переформатирование для создания нового идентификатора сообщения, заканчивающегося:1003 *

/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"
0 голосов
/ 09 июля 2011

Есть эта статья об отправке простого текстового электронного письма с использованием 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.

Надеюсь, это поможет. Дайте нам знать, если это работает.

...