5

我正在尝试在 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

4 回答 4

2

请参阅下面的 URL,我认为这对您很有帮助。

如何在 PHP 中使用 SMTP 发送 HTML 电子邮件

Gmail 的 SMTP 服务器地址是SMTP.GOOGLEMAIL.COM而不是SMTP.GMAIL.COM

因此您的设置应该是:

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

看另一个例子:-

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

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

于 2012-09-17T18:59:04.563 回答
1

尝试将名称用双引号括起来,如下所示:

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

试试看并告诉我们。

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

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

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

您可以在此处查看如何使用 phpmailer 通过 gmail 发送邮件。

于 2012-09-17T23:21:32.850 回答
1

自己终于想通了。

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

解决方案:

  1. 'Return-Path' => $from从 headers 数组中删除。
  2. 添加To => $to到 headers 数组(没有这个,接收到的电子邮件的to标头是未公开的收件人
于 2012-09-18T15:48:17.500 回答
0

我遇到了这个问题,通过调试设法得到各种不同的错误(如下)。最奇怪的是,它在 2017 年 11 月 2 日左右完全停止工作。我没有做任何更新。以前它会随机工作,所以我重试了一次,它总是成功 < 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

(等等)

另一个用户发布了这个故障排除步骤,帮助我得到更多错误,所以我可以谷歌更多可能是什么原因:

$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 的证书:

于 2017-11-04T21:41:16.763 回答