5

我有一个 PHP 脚本,我的邮件服务器通过 STDIN 将电子邮件发送到该脚本。是否有一种简单/不复杂的方式来获取原始电子邮件字符串并将其发送/转发/中继到特定的电子邮件地址?

我对使用 PHP 犹豫不决,mail()或者Pear::Mail因为据我所知,我不能只传递原始电子邮件。我必须解析标题,从而冒着剥离或更改原始电子邮件内容的风险。

以最少的“骚扰”原始电子邮件内容来推荐的方法是什么?

注意:如果没有内置方法,是否有任何现有的库可以帮助我做到这一点?

4

3 回答 3

9

我遇到了同样的问题,但找到了一个可行的解决方案。在 PHP 中打开一个套接字并“远程登录”原始电子邮件数据。像这样的东西:

  $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。谷歌有一个答案,我敢肯定。

于 2011-08-21T13:13:26.673 回答
0

这篇关于使用 PHP 发送纯文本电子邮件的文章。您可以使用 Zend Framework 中的 Zend/Mail.php 包。

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 版本。

希望有帮助。让我们知道这是否有效。

于 2011-07-09T03:13:13.510 回答
0

我遇到了同样的问题,我能想到的最好的解决方案(linux环境)是将原始消息通过管道传输到maildrop,并给它一个刚刚指定预期收件人的mailfilter文件。

有了这个,我发现 Exchange 服务器会将邮件识别为重复邮件,因为具有相同邮件 ID 的邮件已经在其存储中,所以我也通过管道重新发送以生成新的邮件 ID,最终得到:

/usr/bin/reformail -R Message-ID: Original-Message-ID: -A'Message-ID:' | /usr/bin/maildrop maildrop-file

...使用 proc_open() 将原始电子邮件输入到 PHP 中

"maildrop-file" 只包含

to "!recipient@domain.com"
于 2015-12-30T05:14:55.880 回答