看了一下手册,就直接开始写代码了,以下:php
<?php $to = "test@126.com"; //收件人 $subject = "Test"; //主题 $message = "This is a test mail!"; //正文 mail($to,$subject,$message); ?>
结果就直接报错,以下:html
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/email/email.php on line 10apache
通過internet搜索了相關的回答,包括相關的技術博客,你们都是很簡單的闡述了解決方案.大可能是只是提到修改:php.ini 中的[mail function] 函數,將smtp的相關功能進行打開便可,如下是詳細的修改:仔细思考,为何修改配置文件后仍是error,忽然意识到,个人本地没有stmp服务器,那怎么可能能发送邮件呢?所以,在本身的本地必须搭建一个stmp服务器,可是想到win7自带的IIS中有Smtp的功能,可是此功能是专对应于asp的,所以估计php也期望不上它。那就使用别人的试试吧,又改了下代码:windows
<?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); ?>
结果仍是错误:服务器
Warning: mail() [function.mail]: SMTP server response: 553 authentication is required,smtp2,DNGowKD7v5BTDo9NnplVBA--.1171S2 1301220947 inD:/www/email/email.php on line9网络
之後改了其余的郵箱,如QQ,Gamil等,錯誤都如上面提示,看了一個熟悉的單詞authorized ,就明白啥意思了.
到這一步貌似離成功不遠了,想起之前使用客戶端配置郵箱用戶的時候,最後一步都會詢問你须要開啟"服務器身份驗證"
dom
须要验证信息,怎么写验证信息呢?在哪里配置呢?上网找了半天也没找出个因此然,最后看了别人一些技术文章后得出结论(因为对SMTP邮件什么的不是很是了解):使用mail()函数发送邮件就必需要有一台无需SMTP验证就能够发信的邮件服务器。但如今的SMTP邮件服务器基本上都是须要验证的,因此要想使用它发邮件就只能本身在本地搭一个须要验证的SMTP服务器。
ide
php mail()函数在windows不能用,须要安装sendmail
1.从http://glob.com.au/sendmail/下载sendmail.zip
2.解压到D:\php下,例如D:\php\sendmail函数
修改一個叫作sendmail.ini的文件,修改的地方以下:post
;take the fomus email provider in China 126 for example
[sendmail]
smtp_server= smtp.126.com
smtp_port=25
default_domin =126.com
auth_username= strings in your email address before char '@'
auth_password= your password which allow you to login in your email-box
hostname= 126.com
之後,你就要修改 php.ini,還是老地方:
SMTP = smtp.126.com
;這裡修改為localhost 也是一樣,其余選項保持不變.
smtp_port = 25
sendmail_from = my126EmailAddress@126.com
sendmail_path = "your sendmail path/sendemail.exe -t "
;當然這個路徑的前半部分必須包括你的PHP安裝的根目錄,將"\"換成"/",我想是必須要作的.
mail_add_x_header = on
4.根据你本身的配置环境修改sendmail.ini。
第一次最好启用debug.log_file,error_logfile,以查看sendmail是否生效。
5.重启apache
到這裡配置完成,重啟你的apache,刷新頁面,錯誤的消失,因為程序中設置的$to是本身的126和QQ郵箱,當然循環發的.
<?php $now = date('Y-m-d h:i:s'); $from_name = '测试寄件人'; $from_email = 'info@test.com'; $headers = "From: $from_name <$from_email>"; $to = 'to@test.com'; //收件人邮件地址 $body = "嗨, \n 这是一封测试邮件来自 $from_name <$from_email>."; $subject = "[$now] 测试邮件发送"; if (mail($to, $subject, $body, $headers)) { echo 'success!'; } else { echo 'fail…'; } ?>
这种方法就比较常见了,尤为对于广大本身没有服务器,从网上购买虚拟主机的同窗,
第一种方法不现实,因此仍是本身使用SMTP协议来发送邮件吧。
不过要完成这项工做的话,就须要你对SMTP协议有必定的了解,喜欢事必躬亲的同窗能够本身动手写一个,喜欢拿来主义的同窗就能够从网上下载了,有不少。
不过我比较推荐使用PEAR扩展中的Mail类,功能强大:能够支持纯文本、HTML格式的邮件;各字段均可设置编码,正确配置不会出现中文乱码状况;能够支持附件等等。
在服务器可使用 pear install Mail 命令快速安装,没有足够服务器权限的同窗也能够直接下载类的PHP源码包含进来就能够了。
注:Mail类依赖 Net/SMTP.php 和 Mail/mime.php ,要一块下载,使用时一块包含进来。
详细安装方法能够在官网查看,http://pear.php.net/package/Mail。
下面我举例说明一下在Mail类发送邮件的方法吧,网上其余SMTP邮件类使用方法一块也相似,能够参考:
<?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: \r\n $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类,而后多写几行配置代码,就能够了。而且网上有不少示例的代码,不少时候只要复制过来而后修改个别的几个参数就能够用了,因此会很方便,推荐使用此方法。
利用PHPMailer来发送邮件方法。
咱们在作project的时候经常须要邮件的功能。其实PHP语言本身已经有一个发送邮件的方法(mail()方法),且不说这个方法实现的功能不多,想要利用mail()方法来发送邮件就必需要本身配置好smtp服务器,这里就不讲mail()的使用方法了(函数调用确实很简单)。因此,咱们推荐使用第二种方法:PHPMailer。
首先,先到http://phpmailer.sourceforge.net/这个地址去下载最新的PHPMailer的包(PHPMailer方法必须使用这个包)。
下载完成后解压到相应的目录。能够看到解压后的文件夹里面的class.phpmailer.php(调用PHPMailer须要包含这个文件)
示例代码:
<?php require("phpmailer/class.phpmailer.php"); function smtp_mail( $sendto_email, $subject, $body, $extra_hdrs, $user_name){ $mail = new PHPMailer(); $mail->IsSMTP(); // send via SMTP $mail->Host = "smtp.163.com"; // SMTP servers $mail->SMTPAuth = true; // turn on SMTP authentication $mail->Username = "xuchao842363331"; // SMTP username 注意:普通邮件认证不须要加 @域名 这里是个人163邮箱 $mail->Password = "password"; // SMTP password 在这里输入邮箱的密码 $mail->From = "xuchao842363331@163.com"; // 发件人邮箱 $mail->FromName = "管理员"; // 发件人 $mail->CharSet = "UTF-8"; // 这里指定字符集! 指定UTF-8后邮件的标题和发件人等等不会乱码,若是是GB2312标题会乱码 $mail->Encoding = "base64"; $mail->AddAddress($sendto_email,"username"); // 收件人邮箱和姓名 $mail->AddReplyTo("yourmail@yourdomain.com","yourdomain.com"); //$mail->WordWrap = 50; // set word wrap 换行字数 //$mail->AddAttachment("/var/tmp/file.tar.gz"); // attachment 附件 //$mail->AddAttachment("/tmp/image.jpg", "new.jpg"); //$mail->IsHTML(true); // send as HTML // 邮件主题 $mail->Subject = $subject; // 邮件内容 $mail->Body = "hello!PHPMailer"; //$mail->AltBody ="text/html"; if(!$mail->Send()) { echo "error <p>"; echo "error: " . $mail->ErrorInfo; exit; } else { echo"success!"; } } // 参数说明(发送到, 邮件主题, 邮件内容, 附加信息, 用户名) ?>
这里要说明一下:当字符集指定为GB2312的时候标题会乱码,这里指定为UTF-8不会出现乱码。
其实,PHPMailer还有不少功能,好比能够添加附件等等,这里就再也不演示了。
这样在你须要用邮件功能的时候调用这个函数就能够了:
1
2
3
4
5
6
|
<?php
require ( "mail.php" );
smtp_mail( "842363331@qq.com" , "催还" , "" , "" , "username" );
?>
|
总的来讲,这个方法仍是很简单的,读者感兴趣的能够学习一下