给定一个电子邮件作为原始文本,我如何使用PHP发送它


Given an email as raw text, how can I send it using PHP?

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

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

建议如何做到这一点,同时尽量减少对原始电子邮件内容的"骚扰"?

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

我有同样的问题,但找到了一个解决方案,似乎工作。在PHP中打开一个套接字并"telnet"原始电子邮件数据。像这样:

  $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 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用于html版本。

希望有帮助。

我面临同样的问题,我能想到的最佳解决方案(linux环境)是将原始消息管道到maildrop中,并给它一个只指定预期收件人的邮件过滤器文件。

设置好后,我发现Exchange服务器会将该消息识别为重复消息,因为具有相同消息id的消息已经在其存储中,因此我也通过remail管道生成新的消息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"

我写了一个简单的工具,利用PHPMailer(所以你不需要担心协商/TLS/EHLO等)在https://github.com/xrobau/smtphack这是基于我的回答从原始体发送邮件的测试目的