php在windows下發送郵件實現

1、使用PHP內置的mail()函數

看了一下手冊,就直接開始寫代碼了,以下: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的相關功能進行打開便可,如下是詳細的修改:
 [mail function]
 SMTP = localhost
 smtp_port = 25
 sendmail_from = youremailUsual@domin.com
 ;這裡有必要註釋下,這個郵件是From方面.
 sendmail_path = ""
 ;起初是空的,這裡在後面作說明.
 mail_add_x_header = on
 ;這裡是默認on的 無需更改
 到這一步,修改完畢,重啟apache,當然這個操做結果仍是Error.

  仔細思考,爲何修改配置文件後仍是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

      sendmail包實現Smtp郵件發送服務驗證。

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…';
}
?>

2、使用封裝SMTP協議的郵件類

這種方法就比較常見了,尤爲對於廣大本身沒有服務器,從網上購買虛擬主機的同窗,

第一種方法不現實,因此仍是本身使用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類,而後多寫幾行配置代碼,就能夠了。而且網上有不少示例的代碼,不少時候只要複製過來而後修改個別的幾個參數就能夠用了,因此會很方便,推薦使用此方法。


PHP發送郵件(PHPMailer)


      利用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");  
 
?> 

 總的來講,這個方法仍是很簡單的,讀者感興趣的能夠學習一下

相關文章
相關標籤/搜索