我有一个PHP脚本,我的邮件服务器通过STDIN管道发送电子邮件。有一种简单/非复杂的方式来获取原始电子邮件字符串并将其发送/转发/转发到特定的电子邮件地址吗?
我对使用PHP的mail()
或Pear::Mail
犹豫不决,因为据我所知,我不能只传递原始电子邮件。我必须解析标题,从而冒着剥离或更改原始电子邮件内容的风险。
在最小化“骚扰”原始电子邮件内容的情况下,建议的方法是什么?
注意:如果没有内置方法,是否有任何现有的库可以帮助我这样做?
答案 0 :(得分:8)
我遇到了同样的问题,但找到了一个可以解决问题的解决方案。用PHP打开一个套接字并“telnet”原始的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-host。谷歌有一个答案,我敢肯定。
答案 1 :(得分:0)
关于使用PHP发送纯文本电子邮件的问题this article。您可以使用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类型标头,而用于hmtl版本的setBodyHtml。
希望有所帮助。如果有效,请告诉我们。
答案 2 :(得分:0)
我遇到了同样的问题,我能想出的最好的解决方案(linux环境)是将原始邮件传输到maildrop,并给它一个刚刚指定了预期收件人的mailfilter文件。
有了这个,我发现Exchange服务器会将该消息标识为重复,因为具有相同message-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"