10

我有一个邮件服务器,可以很好地配置 SPF、DKIM 和反向 DNS。我可以使用以下方式向 Outlook.com 发送电子邮件:

echo "This is only a test" | mail username@outlook.com

当我尝试使用同一服务器通过 PHP 发送电子邮件时,会出现问题:

$header .= "Return-Path: Some User <mailsender@mydomain.com>\r\n";
$header .= "From: Some User <mailsender@mydomain.com>\r\n";
$header .= "Content-Type: text/plain; charset=iso-8859-1\r\n";
$header .= "MIME-Version: 1.0\r\n";
$header .= "User-Agent: Some User Mail Sender\r\n";
$header .= "Content-Transfer-Encoding: 7bit\r\n";

mail("usernama@outlook.com","My title", "Message body", $header);

我尝试使用 appmaildev.com 验证我的消息,报告显示:

DKIM result: fail (wrong body hash: <*** body hash ***>)

即使出现此错误,Outlook.com 仍表示它通过了 DKIM 验证,但 PHP 邮件功能发送的所有邮件都会进入垃圾文件夹。以下是通过 Bash 和 PHP 直接发送的消息示例:http: //pastebin.com/ndXJszic

谁能帮我?

谢谢。

编辑从标头中 删除\r后,DKIM 正文哈希错误消失了。但是我仍然无法向 Outlook 发送电子邮件...

4

4 回答 4

1

这可能是权限问题。

您的 Web 服务器通常以不同于您mail在命令行中使用的用户身份运行,因此设置From:标头将在外发电子邮件中创建额外的警告标头。

您可以在服务器上修改一个名为/etc/mail/trusted-users. 确保用户apache(或您的 php 脚本运行的任何用户)出现在该文件中;如果没有,请添加用户名,然后重新加载sendmail

的示例内容/etc/mail/trusted-users

# trusted-users - users that can send mail as others without a warning
# apache, mailman, majordomo, uucp, are good candidates
apache
于 2012-12-26T09:59:20.313 回答
1

首先是不可能确定一封电子邮件不会被标记为垃圾邮件,唯一的方法是接收电子邮件的人将发件人地址添加到白名单中。

SPF 和 DKIM 仅保证邮件来自该域或邮箱,但不保证不是垃圾邮件。

outlook.com 中的反垃圾邮件系统与许多其他系统一样检查很多东西,例如发件人 IP 地址、每小时来自该 IP 的电子邮件数量、电子邮件内容(文本、链接)、信誉等。

在您的示例中,您没有显示正文内容,可能是不同的,因此一封电子邮件被标记为垃圾邮件,而另一封则不是。

于 2013-05-14T18:37:47.800 回答
0

在解决电子邮件传递问题时,我使用端口 25 的电子邮件检查。

它会告诉您什么通过/不通过以及 SpamAssasin 如何对您的消息进行排名。

网址是: http ://www.port25.com/support/authentication-center/email-verification/

要将结果直接接收到任何地址,需要将该地址添加到 check-auth 地址。例如,要将结果发送至:jsmith@yourdomain.com,示例消息应发送至 check-auth-jsmith=yourdomain.com@verifier.port25.com。

使用它,您可以了解您的 DKIM 是否正常工作/经过验证,以及您的 SpamAssasin 分数是多少。

于 2013-04-23T14:41:55.603 回答
0

尝试使用Pear mail,并围绕它制作一个包装类。我正在将它与 DKIM 一起使用,并且没有问题。我应该提到我也在使用 SpamAssassin(如前所述)和 ClamAV。

<?php

// Include the Pear Mail header
require_once '/usr/share/php/Mail.php';


class MailWrapper {
    public static function Send($to, $subject, $body) {
        // Email details
        $from = 'No Reply <noreply@yourdomain.com>';
        $server = 'mail.yourdomain.com';
        $port = 25;
        $username = 'sending.account@yourdomain.com';
        $password = 'yourp4ssw0rd';
        // Formalize mail server connection info
        $headers = array('From' => $from,
                 'To' => $to,
                 'Subject' => $subject,
                 'Date' => date('r'),
                 'Return-Path' => $from,
                 'Content-Type' => 'text/html; charset=UTF-8',
                 'Content-Transfer-Encoding' => '7bit',
                 'Mime-Version' => '1.0',
                 'X-Mailer' => 'Your Company (https://yourdomain.com)',
                 'X-Accept-Language' => 'en',
                 'Message-ID' => sha1($body).'@yourdomain.com'
        );
        $connection = array('host' => $server,
                    'auth' => true,
                    'username' => $username,
                    'password' => $password
        );
        // Create the mail server connection 
        $smtp = Mail::factory('smtp', $connection);
        // Send the message
        $mail = $smtp->send($to, $headers, $body);
        // Check for errors
        if (PEAR::isError($mail)) {
            echo '! [email] ['.time().'] Failed sending mail to "'.$to.'"'.PHP_EOL;
            $result = false;
        } else {
            echo '  [email] ['.time().'] Mail sent to "'.$to.'"'.PHP_EOL;
            $result = true;
        }
        return $result;
    }
}

?>
于 2013-03-22T23:23:08.150 回答