我试图在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语法错误。c6sm20541406 obd.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"
查看下面的URL,我认为它对您非常有帮助。
如何在PHP 中使用SMTP发送HTML电子邮件
Gmail的SMTP服务器地址是SMTP。谷歌邮件。COM而非SMTP。GMAIL。COM。
因此,您的设置应该是:
// ...
$smtp=array();
$smtp['host']='ssl://smtp.googlemail.com';
请参阅另一个示例:-
发送HTML&使用带有PHP的SMTP服务器的纯文本电子邮件;PEAR
http://tonyvirelli.com/slider/php-html-email-using-smtp/
我自己终于想明白了。
感谢Abid Hussain在此处提供示例链接:http://tonyvirelli.com/slider/php-html-email-using-smtp/
解决方案:
- 从标头阵列中删除
'Return-Path' => $from
- 将
To => $to
添加到标头数组中(如果没有此项,收到的电子邮件的to标头为未披露的收件人)
试着用双引号括起名字,就像这样:
$from = '"Some Name" <myemail@gmail.com>';
$to = '"Other Name" <otheremail@gmail.com>';
试着告诉我们吧。
更新:
好吧,上面没有起作用,所以我只想告诉你,在我的php页面上,通过smtp gmail发送电子邮件对我有什么作用。
- 我使用http://phpmailer.sourceforge.net/
- smtp服务器设置为smtp.gmail.com
- 它在端口587中使用TLS协议
因此,基于此,您可以尝试将配置更改为:
$host = "tls://smtp.gmail.com";
$port = "587";
您可以在这里看到如何使用phpmailer通过gmail发送邮件。
我遇到了这个问题,通过调试成功地得到了各种不同的错误(如下)。最奇怪的是,它在2017年2月11日左右完全停止了工作。我没有做任何更新。以前它是随机工作的,所以我重试,它总是成功<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:的证书
- 下载CA捆绑包https://curl.haxx.se/docs/caextract.html&解压缩到C:''Program Files''PHP''ssl''cacert.pem
- 在php.ini中指定位置:openssl.cafile=C:''Program Files''php''ssl''accert.pem