最近閑來無事想寫個php傳送檔案的網頁程式,進過幾次失敗最後成功,遇到了很多坑,網上講的比價簡略,涉及的要點好多都沒有講到,在這裡分享一下自己的經驗,希望對各位讀者有所協助。
php發送郵件有兩種方式:1.通過php內建函數mail();2.php發送socket寄送電子郵件。我使用的是第一種方式,通過mail函數,網上可以下載包含此函數的email.class.php檔案。我使用的SMTP伺服器是163郵箱的,直接點,上代碼,如果你有代碼卻一直失敗又找不到原因,請認真閱讀後面的分析。
index.html`
<form action="sendmail.php" method="post"> <p>收件者<input type="text" name="toemail" /></p> <p>標題<input type="text" name="title" /></p> <p>內容<textarea name="content" cols="50" rows="5"></textarea></p> <p><input type="submit" value="發送" /></p></form>
sendmail.php
<?php require_once "email.class.php"; //******************** 配置資訊 ******************************** $smtpserver = "smtp.163.com";//SMTP伺服器 $smtpserverport =25;//SMTP伺服器連接埠 $smtpusermail = "你的163郵箱";//你註冊的郵箱帳號 $smtpemailto = $_POST['toemail'];//發送給誰 $smtpuser = "你的163郵箱";//同上面的註冊的郵箱帳號 $smtppass = "授權碼(不同於賬戶密碼)";//SMTP伺服器的使用者密碼 $mailtitle = $_POST['title'];//郵件主題 $mailcontent = "<h1>".$_POST['content']."</h1>";//郵件內容 $mailtype = "HTML";//郵件格式(HTML/TXT),TXT為文本郵件 //************************ 配置資訊 **************************** $smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//這裡面的一個true是表示使用身分識別驗證,否則不使用身分識別驗證. $smtp->debug = true;//是否顯示發送的調試資訊 $state = $smtp->sendmail($smtpemailto, $smtpusermail, $mailtitle, $mailcontent, $mailtype); echo "<div style='width:300px; margin:36px auto;'>"; if($state==""){ echo "對不起,郵件發送失敗。請檢查郵箱填寫是否有誤。"; echo "<a href='index.html'>點此返回</a>"; exit(); } echo "恭喜。郵件發送成功。。"; echo "<a href='index.html'>點此返回</a>"; echo "</div>";?>
sendmail.php的配置我們可以發現,需要一個已存在的郵箱。顯然,通過這種方式發送郵件的工作流程大概是:php程式類比登陸給出的使用者郵箱向收件者發送郵件。我測試的時候發送失敗,給出的錯誤Remote host returned “550 User has no permission”。我們來分析一下產生錯誤的原因:我們登陸郵箱時都是要使用特定的登陸入口,比如qq登陸郵箱有qq郵箱的網頁、APP,一般情況下在第三方登陸郵箱都是不允許的。使用php程式發送郵件,這裡的php程式就是一個第三方,那麼怎麼解決這個問題呢。
郵箱都有一個SMPT設定,SMTP(Simple Mail Transfer Protocol)即簡易郵件傳輸通訊協定,它是一組用於由源地址到目的地址傳送郵件的規則,由它來控制信件的中轉方式。SMTP協議屬於TCP/IP協議簇,它協助每台電腦在發送或中轉信件時找到下一個目的地。通過SMTP協議所指定的伺服器,就可以把E-mail寄到收信人的伺服器上了,整個過程只要幾分鐘。SMTP伺服器則是遵循SMTP協議的發送郵件伺服器,用來發送或中轉寄出的電子郵件。
 當我們需要在第三方登陸郵箱的時候就要開啟SMTP服務,否則都會拒絕登陸。開啟時提示你設定郵箱的授權碼,這就是我們在配置mail函數參數要用到的密碼。另外可以開啟qq的SMTP服務,這樣就不用下載qq郵箱的APP可以直接使用手機內建的郵件APP來登陸qq郵箱。此時失敗就是因為伺服器拒絕登陸而引起的錯誤,使用mail函數發送郵件,就要確保你提供的郵箱開啟了SMTP服務。如果提示郵件發送成功而沒有收到郵件,可能是被放到垃圾箱了。另一種方式的郵件發送也會繼續研究,歡迎關注共同學習。