sendmail函数无法发送邮件,php邮件发送的两种方式
分类:高并发

这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:

一、使用PHP内置的mail()函数

在iis+php环境中我们发送邮件一般使用sendmail函数发送邮件,但我配置的环境利用sendmail函数发不了邮件了,后找了很久找到了解决办法,下面我一路给各位同学讲来。

一、使用PHP内置的mail()函数

看了一下手册,就直接开始写代码了,如下

首先你需要先到从

<?php 
$to = "test@163.com"; //收件人 
$subject = "Test"; //主题 
$message = "This is a test mail!"; //正文 
mail($to,$subject,$message);

<?php 

然后打开php.ini文件,找到下面这段代码

结果就直接报错,如下:

$to = "test@163.com"; //收件人 

 代码如下

Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() inD:/www/Zend/email/email.php on line 10

$subject = "Test"; //主题 

复制代码

分析原因:本地需要有SMTP服务器,又改了下代码:

$message = "This is a test mail!"; //正文  

[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25
; For Win32 only.
;sendmail_from = [email protected]
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
; sendmail_path = ""
; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

<?php 
$to = "test@163.com";//收件人 
$subject = "Test";//邮件主题 
$message = "This is a test mail!";//邮件正文 
ini_set('SMTP','smtp.163.com');//发件SMTP服务器 
ini_set('smtp_port',25);//发件SMTP服务器端口 
ini_set('sendmail_from',"admin@163.com");//发件人邮箱 
mail($to,$subject,$message);

mail($to,$subject,$message);

默认情况下是以本机做为邮件服务器,这里我们需要借用sendmail来发送邮件,用sendmail来配置如用qq、163的邮箱来发送(一般都是以这种方式)所以我们需要把所有的选项都注销,即把SMTP = localhost和smtp_port = 25前面加上";"然后把sendmai_path=""前面的";"删掉,改为sendmai_path="d:/php/sendmail/sendmail.exe -t",改完后的即是

结果还是错误:

结果就直接报错,如下:

 代码如下

Warning: mail() [function.mail]: SMTP server response: 553 authentication is required,smtp2,DNGowKD7v5BTDo9NnplVBA--.1171S2 1301220947 inD:/www/Zend/email/email.php on line 9

Warning: mail() [function.mail]: Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() inD:/www/Zend/email/email.php on line 10

复制代码

 

看来本地需要有SMTP服务器,那就使用别人的试试吧,又改了下代码:

[mail function]
; For Win32 only.
;SMTP = localhost
;smtp_port = 25
; For Win32 only.
;sendmail_from = [email protected]
; For Unix only. You may supply arguments as well (default: "sendmail -t -i").
sendmail_path = "d:/php/sendmail/sendmail.exe -t"
; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

分析原因:需要验证信息,怎么写验证信息呢?在哪里配置呢?带着这些疑问参考一些技术文章后得出结论,使用mail()函数发送邮件就必须要有一台无需SMTP验证就可以发信的邮件服务器。但现在的SMTP邮件服务器基本上都是需要验证的,所以要想使用它发邮件就只能自己在本地搭一个不需要验证的SMTP服务器。搭建方法:用windows自带的IIS就可以,或者从网上下载其他的SMTP服务器软件。

<?php 

注意以上只需要开启sendmail_path即可,然后保存

结论:使用mail()函数发送邮件,就必须要有一台不需要验证的SMTP服务器。这样的话配置工作会多一点,但是使用的时候就比较省事了,几行代码就可以。

$to = "test@163.com";//收件人 

接着修改sendmail目录下的sendmail.ini文件,主要填的内容有以下几项

二、使用封装SMTP协议的邮件类

$subject = "Test";//邮件主题 

 代码如下

这种方法就比较常见了,尤其对于广大自己没有服务器,从网上购买虚拟主机的同学,第一种方法不现实,所以还是自己使用SMTP协议来发送邮件吧。

$message = "This is a test mail!";//邮件正文 

复制代码

不过要完成这项工作的话,就需要你对SMTP协议有一定的了解,喜欢事必躬亲的同学可以自己动手写一个,喜欢拿来主义的同学就可以从网上下载了,有很多。

ini_set('SMTP','smtp.163.com');//发件SMTP服务器 

smtp_server=smtp服务器地址(如 smtp.ym.163.com)
auth_username=邮箱登录名(如 [email protected])
auth_password=邮箱密码(如 xxxxxx)
force_sender=发件人地址全写(如 [email protected])

不过我比较推荐使用PEAR扩展中的Mail类功能强大:可以支持纯文本、HTML格式的邮件;各字段都可设置编码,正确配置不会出现中文乱码情况;可以支持附件等等。

ini_set('smtp_port',25);//发件SMTP服务器端口 

另外还有一项

在服务器可以使用pear install Mail 命令快速安装,没有足够服务器权限的同学也可以直接下载类的PHP源码包含进来就可以了。

ini_set('sendmail_from',"admin@163.com");//发件人邮箱  

 代码如下

注:Mail类依赖  Net/SMTP.php  和 Mail/mime.php ,要一块下载,使用时一块包含进来。

mail($to,$subject,$message);

复制代码

下面我举例说明一下在Mail类发送邮件的方法吧,网上其他SMTP邮件类使用方法一块也类似,可以参考:

结果还是错误:

; auto = use SSL for port 465, otherwise try to use TLS

<?php 
 
// Pear Mail 扩展 
require_once('Mail.php'); 
require_once('Mail/mime.php'); 
require_once('Net/SMTP.php'); 
 
$smtpinfo = array(); 
$smtpinfo["host"] = "smtp.163.com";//SMTP服务器 
$smtpinfo["port"] = "25"; //SMTP服务器端口 
$smtpinfo["username"] = "username@163.com"; //发件人邮箱 
$smtpinfo["password"] = "password";//发件人邮箱密码 
$smtpinfo["timeout"] = 10;//网络超时时间,秒 
$smtpinfo["auth"] = true;//登录验证 
//$smtpinfo["debug"] = true;//调试模式 
 
// 收件人列表 
$mailAddr = array('receiver@163.com'); 
 
// 发件人显示信息 
$from = "Name <username@163.com>"; 
 
// 收件人显示信息 
$to = implode(',',$mailAddr); 
 
// 邮件标题 
$subject = "这是一封测试邮件"; 
 
// 邮件正文 
$content = "<h3>随便写点什么</h3>"; 
 
// 邮件正文类型,格式和编码 
$contentType = "text/html; charset=utf-8"; 
 
//换行符号 Linux: n Windows: rn 
$crlf = "n"; 
$mime = new Mail_mime($crlf); 
$mime->setHTMLBody($content); 
 
$param['text_charset'] = 'utf-8'; 
$param['html_charset'] = 'utf-8'; 
$param['head_charset'] = 'utf-8'; 
$body = $mime->get($param); 
 
$headers = array(); 
$headers["From"] = $from; 
$headers["To"] = $to; 
$headers["Subject"] = $subject; 
$headers["Content-Type"] = $contentType; 
$headers = $mime->headers($headers); 
 
$smtp =& Mail::factory("smtp", $smtpinfo); 
 
 
$mail = $smtp->send($mailAddr, $headers, $body); 
$smtp->disconnect(); 
 
if (PEAR::isError($mail)) { 
  //发送失败 
  echo 'Email sending failed: ' . $mail->getMessage()."n"; 
} 
else{ 
  //发送成功 
  echo "success!n"; 
}

Warning: mail() [function.mail]: SMTP server response: 553 authentication is required,smtp2,DNGowKD7v5BTDo9NnplVBA--.1171S2 1301220947 inD:/www/Zend/email/email.php on line 9

把前面的";"删除,即开启SSL安全登录选项即可

如果从网上找的SMTP类都是高度封装的,所以使用起来比上面会更简单,但使用方法都是比较相似的。

 看来是需要验证信息,怎么写验证信息呢?在哪里配置呢?上网找了半天也没找出个所以然,最后看了别人一些技术文章后得出结论(由于对SMTP邮件什么的不 是非常了解,所以也不知道这个结论是否是正确的):使用mail()函数发送邮件就必须要有一台无需SMTP验证就可以发信的邮件服务器。但现在的 SMTP邮件服务器基本上都是需要验证的,所以要想使用它发邮件就只能自己在本地搭一个不需要验证的SMTP服务器。这就比较麻烦了,我是不想整,有兴趣 的同学可以自己试试搭一个,用windows自带的IIS就可以,或者从网上下载其他的SMTP服务器软件,我就不多说。

以上四项正确填写修改完成后保存,然后重启IIS即可正常使用,现在很高兴地测试我的wordpress博客了

结论:这种方式发送邮件无需装任何软件,只需要包含进来一个PHP类,然后多写几行配置代码,就可以了。并且网上有很多示例的代码,很多时候只要复制过来然后修改个别的几个参数就可以用了,所以会很方便,推荐使用此方法。

结论:使用mail()函数发送邮件,就必须要有一台不需要验证的SMTP服务器。

现在开始调试wordpress博客,但发现服务器无法发送邮件,sendmail已经安装,但是继续提示邮件发送不成功。分析了很久,总算找到了原因

以上就是使用PHP发送邮件的两种方法,有自己的思考过程,希望对大家的学习有所帮助。

这样的话配置工作会多一点,但是使用的时候就比较省事了,几行代码就可以。

第一步:安装sendmail服务
下载sendmail.RAR存放至php目录下的sendmail目录,结构如下:
图片 1

 二、使用封装SMTP协议的邮件类

第二步、配置php.ini文件

这种方法就比较常见了,尤其对于广大自己没有服务器,从网上购买虚拟主机的同学,

 代码如下

第一种方法不现实,所以还是自己使用SMTP协议来发送邮件吧。

复制代码

不过要完成这项工作的话,就需要你对SMTP协议有一定的了解,喜欢事必躬亲的同学可以自己动手写一个,喜欢拿来主义的同学就可以从网上下载了,有很多。

sendmail_path =”D:/php/sendmail/sendmail.exe -t”

不过我比较推荐使用PEAR扩展中的Mail类,功能强大:可以支持纯文本、HTML格式的邮件;各字段都可设置编码,正确配置不会出现中文乱码情况;可以支持附件等等。

盘符和位置根据sendmail.exe文件位置确定

在服务器可以使用 pear install Mail 命令快速安装,没有足够服务器权限的同学也可以直接下载类的PHP源码包含进来就可以了。

第三步、配置sendemail.ini

注:Mail类依赖  Net/SMTP.php  和 Mail/mime.php ,要一块下载,使用时一块包含进来。

 代码如下

详细安装方法可以在官网查看,。

复制代码

<?php

smtp_server=smtp.sina.com.cn
smtp_port=25
这俩个是要求验证的时候的账号,密码
auth_username=ifbs
auth_password=XXXX

// Pear Mail 扩展 

第四步、给予cmd.exe权限
C:/WINDOWS/system32/cmd.exe 文件以 users的读权限。不给予权限会出现以下错误。
Warning: mail() [function.mail]: Could not execute mail delivery program

require_once('Mail.php'); 

第五步、建立mail.php文件测试结果

require_once('Mail/mime.php'); 

 代码如下

require_once('Net/SMTP.php'); 

复制代码

$smtpinfo = array(); 

<?php
$mail = “[email protected]”;
$subject = “Mail Test”;
$text = “This is a test mail for function mail()”;

$smtpinfo["host"] = "smtp.163.com";//SMTP服务器 

if(mail($mail,$subject,$text)){
echo “email send success!”;
}else{
echo “email send fail!”;
}
?>

$smtpinfo["port"] = "25"; //SMTP服务器端口 

访问mail.php即可测试结果

$smtpinfo["username"] = "username@163.com"; //发件人邮箱 

...

$smtpinfo["password"] = "password";//发件人邮箱密码 

$smtpinfo["timeout"] = 10;//网络超时时间,秒 

$smtpinfo["auth"] = true;//登录验证 

//$smtpinfo["debug"] = true;//调试模式 

// 收件人列表 

$mailAddr = array('receiver@163.com'); 

// 发件人显示信息 

$from = "Name <username@163.com>"; 

// 收件人显示信息 

$to = implode(',',$mailAddr); 

// 邮件标题 

$subject = "这是一封测试邮件"; 

// 邮件正文 

$content = "<h3>随便写点什么</h3>"; 

// 邮件正文类型,格式和编码 

$contentType = "text/html; charset=utf-8"; 

//换行符号 Linux: n  Windows: rn 

$crlf = "n"; 

$mime = new Mail_mime($crlf); 

$mime->setHTMLBody($content); 

$param['text_charset'] = 'utf-8'; 

$param['html_charset'] = 'utf-8'; 

$param['head_charset'] = 'utf-8'; 

$body = $mime->get($param); 

$headers = array(); 

$headers["From"] = $from; 

$headers["To"] = $to; 

$headers["Subject"] = $subject; 

$headers["Content-Type"] = $contentType; 

$headers = $mime->headers($headers); 

$smtp =& Mail::factory("smtp", $smtpinfo); 

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

$smtp->disconnect(); 

if (PEAR::isError($mail)) { 

//发送失败 

echo 'Email sending failed: ' . $mail->getMessage()."n";  

else{ 

//发送成功 

echo "success!n";  

}

如果从网上找的SMTP类都是高度封装的,所以使用起来比上面会更简单,但使用方法都是比较相似的。 

  结论:这种方式发送邮件无需装任何软件,只需要包含进来一个PHP类,然后多写几行配置代码,就可以了。并且网上有很多示例的代码,很多时候只要复制过来然后修改个别的几个参数就可以用了,所以会很方便,推荐使用此方法。

本文由10bet手机官网发布于高并发,转载请注明出处:sendmail函数无法发送邮件,php邮件发送的两种方式

上一篇:没有了 下一篇:php语言中使用json的技巧及json的实现代码详解10bet体育中文官网
猜你喜欢
热门排行
精彩图文