PHPMailer无法发送邮件 - 以下发件人地址失败

时间:2017-05-25 09:24:21

标签: php phpmailer sendmail ubuntu-16.04

发送邮件时收到此错误。

Message could not be sent.Mailer Error: The following From address failed: sample@mydomain.com : MAIL FROM command failed,Temporary system failure. Please try again later. ,451,4.3.0SMTP server error: MAIL FROM command failed Detail: Temporary system failure. Please try again later. SMTP code: 451 Additional SMTP info: 4.3.0SMTP server error: MAIL FROM command failed Detail: Temporary system failure. Please try again later. SMTP code: 451 Additional SMTP info: 4.3.0

这是我的代码:

require 'phpmailer/PHPMailerAutoload.php';

$html = "<b>Hello world!</b>";
$email = "recipient@example.com";
$mail = new PHPMailer;
$mail->isSMTP();
$mail->setFrom('sample@mydomain.com');
$mail->addAddress($email);
$mail->isHTML(true);

$mail->Subject = 'Sample Subject';
$mail->Body = $html;

if(!$mail->send()) {
    echo 'Message could not be sent.';
    echo 'Mailer Error: ' . $mail->ErrorInfo;
} else {
    echo 'Email sent';
}

我还尝试删除$mail->isSMTP();,我收到回复消息Email sent问题就是当我检查我的收件箱和垃圾邮件文件夹时,因为我将我的个人电子邮件设置为电子邮件的收件人,电子邮件不在那里。这是服务器问题吗?

我还检查了/var/log/mail.err,我可以看到一个说明collect: Cannot write ./dfv4PAGY73013302 (bfcommit, uid=0, gid=119): No such file or directory的错误日志 - 这是什么?

我已经敲打了2天但我不知道问题是什么。我在我的服务器上安装了一个新的LAMP堆栈,也配置了postfix(只是说这个,可能会帮助你了解一下)。

这里似乎有什么问题?

非常感谢您的帮助!谢谢!

3 个答案:

答案 0 :(得分:2)

你的代码很好。它的工作原理和证据是您从SMTP服务器收到错误消息。问题是它处理的数据。

正确配置的SMTP服务器不接受中继电子邮件。 /** * @ORM\ManyToMany(targetEntity="RejectReason") * @ORM\JoinTable(name="relationship_application_reject_reasons", * joinColumns={@ORM\JoinColumn(name="application_id", referencedColumnName="id", onDelete="CASCADE")}, * inverseJoinColumns={@ORM\JoinColumn(name="reject_reason_id", referencedColumnName="id")} * ) */ private $rejectReasons; 地址或NULLFrom:To:中的至少一个地址必须由其托管,才能接受要处理的电子邮件。

使用Cc:由您用于发送的SMTP服务器托管的真实电子邮件地址。例如,如果您使用Bcc:,则必须将您的Gmail地址用作From:(在这种情况下还要使用SMTP身份验证)。

您的代码未指定SMTP服务器;在这种情况下,PHPMailer使用smtp.gmail.com,最有可能将电子邮件中继到ISP的ISP服务器(如果此代码在公司的Intranet中运行,则转发给您公司的SMTP服务器)。使用您提供的ISP(或您的工作电子邮件地址,如果代码适用于您的工作)提供的电子邮件地址为From:,它应该有效。

答案 1 :(得分:0)

更新您的PHPMailer。在通过TLS SMTP连接时,旧版本的PHPMailer似乎不支持自签名证书。

我花了两天时间试图解决这个问题,最后我更新了PHPMailer,问题就消失了!

我的电子邮件服务器正在Debian 9上运行iRedMail软件包。

下载最新的PHPmailer zip并解压缩到当前文件夹中的PHPMailer文件夹并执行:

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\SMTP;
use PHPMailer\PHPMailer\Exception;
require 'PHPMailer/src/PHPMailer.php';
require 'PHPMailer/src/SMTP.php';
require 'PHPMailer/src/Exception.php';
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPOptions = ['ssl'=> ['allow_self_signed' => true]];
$mail->SMTPSecure = 'tls';
//etc etc......

答案 2 :(得分:0)

尝试使用php中的ssl socket(使用tls / ssl的示例):

driver.find_elements_by_xpath("//div[@class='o_primary' and contains(text(), '%s')]/parent::div[*]/parent::div[*]/parent::div[*]/descendant::button[@data-name='open_ui']" % (shop))[0].click()

如果您需要从dns获取收件人电子邮件域的主机名:

// Show errors
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Your hostname
$helloHostname = "localhost";

// Emails
$toEmail = "to@email.com";
$fromEmail = "from@email.com";

// Set mx hostname from dns for recipient !!!
$hostnameMX = "mxhost.boo.xx";    

$ctx = stream_context_create();
stream_context_set_option($ctx, 'ssl', 'verify_peer', false);
stream_context_set_option($ctx, 'ssl', 'verify_peer_name', false);
try{
    // echo $socket = stream_socket_client('ssl://smtp.gmail.com:587', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    echo $socket = stream_socket_client('tcp://'.$hostnameMX.':25', $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
    if (!$socket) {
        print "Failed to connect $err $errstr\n";
        return;
    }else{
        // Http
        // fwrite($socket, "GET / HTTP/1.0\r\nHost: www.example.com\r\nAccept: */*\r\n\r\n");
        // Smtp
        echo fread($socket,8192);
        echo fwrite($socket, "EHLO ".$helloHostname."\r\n");
        echo fread($socket,8192);

        // Start tls connection
        echo fwrite($socket, "STARTTLS\r\n");
        echo fread($socket,8192);

        echo stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT);

        // Send ehlo
        echo fwrite($socket, "EHLO ".$helloHostname."\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "MAIL FROM: <".$fromEmail.">\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "rcpt to: <".$toEmail.">\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "DATA\n");
        echo fread($socket,8192);

        echo fwrite($socket, "Date: ".time()."\r\nTo: <".$toEmail.">\r\nFrom:<".$fromEmail.">\r\nSubject:Hello from php socket tls\r\n.\r\n");
        echo fread($socket,8192);

        echo fwrite($socket, "quit \n");
        echo fread($socket,8192);

        /* Turn off encryption for the rest */
        // stream_socket_enable_crypto($fp, false);

        fclose($socket);
    }
}catch(Exception $e){
    echo $e;
}