使用SMTP身份验证时通过PEAR发送HTML邮件会返回错误

时间:2012-08-28 19:46:08

标签: php smtp gmail pear

我正在尝试在PHP中使用SMTP身份验证向Gmail发送HTML消息。这是我正在使用的脚本:

require_once "Mail.php";
require_once 'Mail/mime.php';

$from = "Some Name <myemail@gmail.com>";
$to = "Other Name <otheremail@gmail.com>";
$subject = "This is a test";
$crlf = "\n";

$host = "ssl://smtp.gmail.com";
$port = "465";
$username = "myemail@gmail.com";
$password = "mypass";

$headers = array ('From' => $from,
                  'Return-Path' => $from,
                  'Subject' => $subject);

$smtp = Mail::factory('smtp',
  array ('host' => $host,
    'port' => $port,
    'auth' => true,
    'username' => $username,
    'password' => $password));

$mime = new Mail_mime($crlf);
$mime->setTXTBody("This is a test email message");
$mime->setHTMLBody($body);
$body = $mime->get();
$headers = $mime->headers($headers);

$mail = $smtp->send($to, $headers, $body);

if (PEAR::isError($mail)) {
  echo("<p>" . $mail->getMessage() . "</p>");
} else {
  echo("<p>Message successfully sent!</p>");
}

注意: $body是包含图片和其他信息的HTML表格。

当我执行脚本时,它失败并出现以下错误:

  

无法设置发件人:某些名称[SMTP:无效的响应代码   从服务器收到(代码:555,响应:5.5.2语法错误。   c6sm20541406obd.22)]

这是我试图看出出了什么问题: 1.使用相同的脚本使用'Mail'代替'smtp',即

$smtp = Mail::factory('Mail');

这很好用。 2.使用与 mime.php 相同的脚本,这也有效,但不允许发送HTML电子邮件。

是否有人知道如何将两者结合使用,以便我仍然使用SMTP身份验证发送HTML消息?

修改 这是$mime->headers()的转储:

[MIME-Version] => 1.0
[From] => Some Name
[Return-Path] => Some Name
[Subject] => This is a test
[Content-Type] => multipart/alternative;
boundary="=_8662996a1f586248545d9f01f48e916d"

4 个答案:

答案 0 :(得分:2)

请参阅以下网址我认为对您来说非常有帮助。

How to send an HTML email using SMTP in PHP

Gmail的SMTP服务器地址为 SMTP.GOOGLEMAIL.COM 而非 SMTP.GMAIL.COM

因此,您的设置应为:

// ...
$smtp=array();
$smtp['host']='ssl://smtp.googlemail.com';

查看另一个例子: -

发送HTML&amp;使用带有PHP和SMTP的SMTP服务器的纯文本电子邮件PEAR

http://tonyvirelli.com/slider/php-html-email-using-smtp/

答案 1 :(得分:1)

尝试用双引号括起名字,如下:

$from = '"Some Name" <myemail@gmail.com>';
$to = '"Other Name" <otheremail@gmail.com>';

尝试并告诉我们。

<强>更新
好吧,上面没有用,所以我只是告诉你在我的php页面中通过smtp gmail发送电子邮件对我有用。

基于此,您可以尝试将配置更改为:

$host = "tls://smtp.gmail.com";
$port = "587";

你可以看到here如何使用phpmailer通过gmail发送邮件。

答案 2 :(得分:0)

终于弄清楚了自己。

感谢Abid Hussain提供了此处示例的链接:http://tonyvirelli.com/slider/php-html-email-using-smtp/

解决方案:

  1. 从标头数组中删除'Return-Path' => $from
  2. To => $to添加到标头数组(没有此标识,收到的电子邮件的标题是未公开的收件人

答案 3 :(得分:0)

我有这个问题并通过调试设法得到各种不同的错误(下面)。最奇怪的是它在2017年2月2日左右完全停止了工作。我没有做任何更新。以前它会随机工作,所以我进行重试,它总是成功&lt; 5次尝试,直到第2次。奇怪。

Failed to connect to ssl://smtp.gmail.com:465 [SMTP: Invalid response code received from server (code: -1, response: )]
fsockopen(): Failed to enable crypto
fsockopen(): unable to connect to ssl://smtp.gmail.com:465 (Unknown error)
SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed

(依此类推)

另一位用过的人发布了这个故障排除步骤,这有助于我获得更多错误,因此我可以更多地了解Google,原因可能是:

$result = fsockopen('ssl://smtp.gmail.com', 465, $error_no,
$error_message, 5);     
if($result === false) {         
    echo "error no:
$error_no error message: $error_message";       echo print_r($result,true);     
}else{      
    echo 'success\n\n';
}

我的修复是添加CA捆绑文件,因为PHP无法验证Google的证书:

  • 下载CA捆绑包https://curl.haxx.se/docs/caextract.html&amp;解压缩到C:\ Program Files \ PHP \ ssl \ cacert.pem
  • 在php.ini中指定位置:openssl.cafile = C:\ Program Files \ PHP \ ssl \ cacert.pem