phpmailer发送邮件 SMTP Error: Could not authenticate 错误
今天在使用phpmailer发送smtp邮件时提示 SMTP Error: Could not authenticate 错误,其中密码帐号都是正确的,邮箱也设置开启了SMTP功能。
上谷歌百度了一遍,有的说是服务器禁用了端口,有的说把class.phpmailer.php中的
代码如下 | 复制代码 |
function IsSMTP() { function IsSMTP() { |
测试以后还是不行,心中郁闷的一米。最后在一篇博客中找到了解决方法,先分享出来让更多遇到同样问题的人能得到帮助!
这个错误说明虚拟主机不支持PHPMailer默认调用的fsockopen函数,找到class.smtp.php文件,搜索fsockopen,就找到了这样一段代码:
代码如下 | 复制代码 |
// connect to the smtp server |
方法1:将fsockopen函数替换成pfsockopen函数
首先,在php.ini中去掉下面的两个分号
;extension=php_sockets.dll
;extension=php_openssl.dll
然后重启一下
因为pfsockopen的参数与fsockopen基本一致,所以只需要将@fsockopen替换成@pfsockopen就可以了。
方法2:使用stream_socket_client函数
一般fsockopen()被禁,pfsockopen也有可能被禁,所以这里介绍另一个函数stream_socket_client()。
stream_socket_client的参数与fsockopen有所不同,所以代码要修改为:
代码如下 | 复制代码 |
$this->smtp_conn = stream_socket_client("tcp://".$host.":".$port, $errno, $errstr, $tval); |
这样就可以了。
如果上面办法还是没有解决可能是邮箱自动过滤你机器自动登录邮箱发邮件了哦,我是使用下面办法解决的
刚开始使用的qq的帐号,提示上面错误。换成新注册的163帐号可以正常发送。
之后换了一个qq等级比较高的帐号,这下可以正常发送,没有报任何错误。
因为收件人用的是qq邮箱帐号,所以发件帐号用qq的邮箱比较好,这样发送过多不会轻易的被拦截或判为垃圾邮件。
所以结论就是配置中使用一个qq等级比较高的帐号(我的一个小号等级2个月亮可以正常使用,当然等级越高越好,)
ps:也要查看邮箱中“设置邮件地址黑名单”及“收信规则”,有时系统会自动将一些邮箱自动加入黑名单的
当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码不相同,会发现邮件的标题是乱码,而邮件正文却是正确的,如何才能使得邮件标题不是乱码呢?
$subject = stripslashes($the_post['Title']);
$headers = "MIME-Version: 1.0rn";
$headers .= "Content-type: text/plain; charset=utf-8rn";
$headers .= "Content-Transfer-Encoding: 8bitrn";
$message = stripslashes(strip_tags($the_post['Content']));
mail($to, $subject, $message, $headers);
先用函数base64_encode() — 使用 MIME base64 对数据进行编码
标题字符串前加编码类型例如: =?UTF-8?B?
标题字符串后加:?=
例如:
$subject = "=?UTF-8?B?".base64_encode($subject)."?=";
将上面一句添加到代码之中,这样,发送的中文邮件标题就不是乱码了。
代码如下 | 复制代码 |
<?php $headers = 'From: junhuibai@tom.com' . "rn" . if(mail($to, $subject, $message,$headers)) |
最终解决办法
代码如下 | 复制代码 |
标题乱码:
正文乱码: 设置header : charset=utf-8'
|
我的PHPMailer发送邮件代码
代码如下 | 复制代码 |
header("Content-type:text/html;charset=utf-8"); $mail = new PHPMailer(); |
在使用PHPMailer发送邮件报错Msg:stream_socket_enable_crypto(): this stream does not support SSL/crypto,
出现这种情况请输出phpinfo()看下openssl这个扩展没有安装。
查找php安装时源码包的位置以/usr/local/src/php/php-5.3为例子
代码如下 | 复制代码 |
cd /usr/local/src/php/php-5.3/ext/openssl /usr/local/php/bin/phpize |
可能会出现下面的错误
代码如下 | 复制代码 |
Cannot find config.m4. Make sure that you run ‘/usr/local/php/bin/phpize’ in the top level source directory of the module |
解决办法:
代码如下 | 复制代码 |
mv config0.m4 config.m4 Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ |
/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/ 改目录下回生成一个openssl.so文件,找到php的配
置文件,在扩展区域添加
代码如下 | 复制代码 |
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/openssl.so |
如果你配置了还不能发送邮箱我们可以尝试在linux中直接使用mail函数直接发送邮件哦。
PHPMailer发送邮件现在php开发者比较常用的一个邮件发送组件了,利用它我们几乎不需要考虑任何问题,只要简单的把代码放网上把邮箱用户名密码与stmp改一下就可以发邮件了。PHPMailer是别人封装好的一个发送邮件的库,用起来很方便。其支持mail、sendmail和smtp的方式可以到https://code.google.com/a/apache-extras.org/p/phpmailer/downloads/list去下载最新版本的。下面通过gmail smtp发送邮件为例来说明smtp使用方法。
代码如下 | 复制代码 |
$mail = new PHPMailer(); if(!$mail->Send()) { |
上面是核心代码,下面我们综合一下实例。
按如下示例编写代码即可实现php在线发送邮件.
一:前台表单
代码如下 | 复制代码 |
<html> |
二:后台PHP程序
代码如下 | 复制代码 |
$mail->From = "user@xxxx.com"; //邮件发送者email地址 //$mail->AddAttachment("/var/tmp/file.tar.gz"); // 添加附件 $mail->Subject = "PHPMailer测试邮件"; //邮件标题 if(!$mail->Send()) echo "邮件发送成功"; |
mail函数,发送邮件
语法: mail(to,subject,message,headers,parameters)
to 规定邮件的接收者
subject 规定邮件的主题。该参数不能包含任何换行字符
message 规定要发送的消息
headers 规定额外的报头,比如 From, Cc 以及 Bcc
parameters 规定 sendmail 程序的额外参数。
碰到的主要问题是乱码问题,刚开始是某些客户端接收邮件时好(比如QQ邮箱,估计带自动那个识别编码)的有些不foxmail、ipad显示乱码,解决方式正确的设置这个mail的headers就行了,下面是我使用的完美的无乱码的例子。
在PHP中配置php.ini文件过程分为两个步骤:
1.先找到你放置所有PHP,Apache,MySQL文件的地方,在PHP文件夹里你可以发现有一个文件:php.ini,打开后,找到mail function地方,将原来的配置代码改为如下(仅对windows系统):
[mail function]
; For Win32 only.
SMTP =smtp.sohu.com
mtp_port=25
; For Win32 only.
sendmail_from = 填上你的电子邮件全称。
此处为以sohu的邮件服务器设置,如果你用163的邮箱,则设置为:smtp.163.com
2.在C盘搜索php.ini,选择不是快捷方式的那一个php.ini,应该在C/WINDOWS里面的,打开它,如上面一样修改它,保存。
设置完后,记得重启Apache服务器,然后mail()函数就可以用了。
例
代码如下 | 复制代码 |
<?php $headers .= "Content-type:text/html; charset=utf-8"; mail($to,$subject,$message,$headers); |
上面函数不可以带附件了,下面我们升级一下
代码如下 | 复制代码 |
<?php class Mail { private $filename; private $boundary; private $eol; //每行末尾所加的换行符类型
public function setFromaddr($fromaddr) { public function getTopic() {
public function getContent() {
public function setToaddr($toaddr) {
public function getDomain() { public function setDomain($domain) {
$this->boundary= '--'.substr(md5(time().rand(1000,2000)),0,16); } private function getUniq_id(){ $this->uniqid= md5(microtime().time().rand(1,100)); } private function outputCommonHeader(){ private function mime_content_type ( $f )
return 1;
if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){ return 1; /* $this->attachmentToBase64($this->attach); if(mail($this->toaddr,$this->topic,$this->msg,$this->header)){ return 1; } return 1; public function send(){ if(empty($this->attach)&&empty($this->cc)){ }else if(empty($this->attach)){ }else if(empty($this->cc)){ }else if(!empty($this->toaddr)&&!empty($this->topic)&&!empty($this->cc)&&!empty($this->content)&&!empty($this->attach)){ |
示例代码,有些变量需要上下文环境:
代码如下 | 复制代码 |
$m = new Mail(); |
优点:使用方便就一个简单的函数
缺点:需要php.ini支持该函数,如果某些服务器不支持而又不能改环境那就不行了而且总是不稳定,发的有时能收到有时不能
相关文章
- 本文给大家介绍的是nodejs实现使用阿里大鱼短信API发送消息的方法和代码,有需要的小伙伴可以参考下。...2016-01-20
- mail()函数的作用:连接到邮件服务器,利用smtp协议,与该服务器交互并投邮件。注意:1、mail函数不支持esmtp协议,---即,只能直投,不能登陆2、由上条,我们只能直投至最终的收件服务器地址.而该地址,又是在PHP.ini中指定的,所...2015-10-30
- 这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数<?php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文...2015-10-30
- 这篇文章主要介绍了c# 如何实现发送邮件的功能,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
- 这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数<?php $to = "test@163.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文...2015-10-30
- 这篇文章主要介绍了python实现企业微信定时发送文本消息的实例代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-11-25
- 这篇文章主要介绍了c#使用netmail方式发送邮件的示例,大家参考使用吧...2020-06-25
- mail()函数的作用:连接到邮件服务器,利用smtp协议,与该服务器交互并投邮件。注意:1、mail函数不支持esmtp协议,---即,只能直投,不能登陆2、由上条,我们只能直投至最终的收件服务器地址.而该地址,又是在PHP.ini中指定的,所...2015-10-30
- PHPMailer在SAE上无法发送邮件怎么回事呢,我们以前在php5.2.7版本中使用了PHPMailer是可以发,但移到sae中发现无法发邮件了,那么此问题如何解决 在SAE上直接用5.2.7...2016-11-25
- 本文我们整理了三个android后台发送邮件的方法及示例,第一个是不借助Intent在android后台发送Email,第二个是用在收集应用的异常信息,第三个是分享一个android后台发送邮...2016-09-20
- 这篇文章主要介绍了Perl中使用MIME::Lite发送邮件实例,本文介绍了使用sendmail方式发送、发送HTML格式邮件、smtp方式发送邮件等内容,需要的朋友可以参考下...2020-06-29
网上找到的两个PHP发送邮件的例子,很不错,贴出来给初学者参考吧(不知道是否有兄弟曾贴过),呵呵(2
Advanced Example Here we will show the full capabilities of the PHP mail function. PHP Code: <?php echo "<html><body>"; $recipient = "Kris Arndt <karn@nu...2016-11-25- 学过asp的朋友可能知道jmail组件是使用在asp中一个常用的邮箱发送功能,在php中如果想调用jmail功能我们需要使用com组件来操作。 我们先来介绍格式 代码如...2016-11-25
- //原创:www.111cn.net 注明:转载说明来处www.111cn.net // 昨天听一网友说用php 里面的mail发邮件发不出去,我想一般都是发不了的,现在大多数据邮件提供商都不准那样了...2016-11-25
- 这篇文章主要介绍了C#编程实现发送邮件的方法,具备添加附件的功能,涉及C#文件传输及邮件发送的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文章来介绍人一下关于与我们不同的发送邮件的方法我们来利用php curl stmp来实现邮件的发送程序。 $ telnet 邮箱SMTP服务地址 25 Trying 邮箱服务IP地址......2016-11-25
- 这篇文章主要介绍了Python基于httpx模块实现发送请求,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下...2020-07-08
node.js 基于 STMP 协议和 EWS 协议发送邮件
这篇文章主要介绍了node.js 基于 STMP 协议和 EWS 协议发送邮件的示例,帮助大家更好的理解和使用node.js,感兴趣的朋友可以了解下...2021-02-15- <?php // 请求 PHPmailer类 文件 require_once("class.phpmailer.php"); //发送Email函数 function smtp_mail ( $sendto_email, $subject, $body, $extra_hd...2016-11-25
解决PHPMailer错误SMTP Error: Could not connect to SMTP host的办法
PHPMailer发邮件时提示SMTP Error: Could not connect to SMTP host错误是smtp服务器的问题我们一起来看看关于SMTP Error: Could not connect to SMTP host问题的解...2016-11-25