PHP傳送郵件

gamebus發表於2021-09-09

在專案開發過程中,經常會用到透過程式傳送電子郵件,例如:註冊使用者透過郵件啟用,透過郵件找回密碼,傳送報表等。這裡介紹幾種透過PHP傳送電子郵件的方式(1)透過mail()函式傳送郵件(2)使用fsockopen方式連線smtp伺服器傳送(3)使用phpmailer郵件類傳送。個人推薦使用phpmailer郵件類傳送,phpmailer比較方便使用且功能強大,接下來對這幾種方式分別做一下介紹。

        (1)透過mail()函式傳送郵件
    PHP中的mail() 函式允許從指令碼中直接傳送電子郵件,格式:
    mail($to,$subject,$message,$headers,$parameters);
    to 必需。規定郵件的接收者。
    subject 必需。規定郵件的主題。該引數不能包含任何換行字元。
    message 必需。規定要傳送的訊息。
    headers 可選。規定額外的報頭,比如 From(發件人), Cc(抄送) 以及 Bcc(密送)。
    parameters 可選。規定 sendmail 程式的額外引數。

         需要特別mail()函式用法相當簡單,但並不我們使用mail()函式就可以直接傳送郵件了,需要我們做一些配置,在Windows與Linux系統上的配置方式有些不同。我們傳送郵件需郵件伺服器,如果是Linux伺服器需要在php.ini中的sendmail_path設定為伺服器的路徑,如果Linux在安裝時安裝了sendmail,可以這樣設定:
    sendmail_path = /usr/sbin/sendmail
如果安裝的是Qmail等其他Mail伺服器則填寫對應的路徑即可。
如果是Windwos作業系統則需要配置SMTP和smtp_port著兩個引數,例如:
    SMTP = localhost
    smtp_port = 25
如果將SMTP設定為localhost則本機必須安裝郵件伺服器才能正常發信,當然也可以設定其他郵件伺服器的域名或IP地址,還有一個可選引數是sendmail_from可以設定預設的發件人郵箱。看一下php.ini的配置項:

使用mail函式時php.ini的配置

(2)使用fsockopen方式連線smtp伺服器傳送

首先需要有一個smtp郵件伺服器,可以自己搭建也可以使用網易,新浪等免費的郵件伺服器,傳送的過程大致如下:

    1.建立TCP連線
    2.客戶端傳送HELO命令以標識發件人自己的身份,然後客戶端傳送MAIL命令,伺服器端正希望以OK作為響應,表明準備接收
    3.客戶端傳送RCPT命令,以標識該電子郵件的計劃接收人,可以有多個RCPT行,伺服器端則表示是否願意為收件人接受郵件
    4.協商結束,傳送郵件,用命令DATA傳送
    目前絕大多數的服務商都提供SMTP服務,如果我們要使用的MTA需要使用者認證(絕大多數的郵件服務商都需要認證)那就需要我們使用有效的使用者名稱密碼登陸。以網易的163郵箱為例,首先註冊一個郵箱賬號比如:mytest@163.com,這裡我們使用一個寫好的email.class.php來實現與SMTP伺服器實現通訊併傳送郵件的功能,使用前需要在配置檔案config.php中配置一下各項引數,詳細說明可以參考附件中的示例程式碼。

(3)使用phpMailer郵件類傳送電子郵件(特別推薦)
     先來幾句廢話:
    phpMailer是一個非常強大的php傳送郵件類,可以設定傳送郵件地址、回覆地址、郵件主題、html網頁,上傳附件,並且使用起來非常方便。
     phpMailer的特點:
    1、在郵件中包含多個 TO、CC、BCC 和 REPLY-TO。
    2、平臺應用廣泛,支援的 SMTP 伺服器包括 Sendmail、qmail、Postfix、Gmail、Imail、Exchange 等等。
    3、支援嵌入影像,附件,HTML 郵件。
    4、可靠的強大的除錯功能。
    5、支援 SMTP 認證。
    6、自定義郵件頭。
    7、支援 8bit、base64、binary 和 quoted-printable 編碼。
    使用phpMailer傳送郵件需要class.phpmailer.php和class.smtp.php兩個檔案,比較簡單的程式碼片段:

   
    require_once('./class.phpmailer.php');
    include_once("class.smtp.php");
    $mail = new PHPMailer(true); //例項化PHPMailer類,true表示出現錯誤時丟擲異常
    $mail->IsSMTP(); // 使用SMTP
    try {
      $mail->CharSet ="UTF-8";//設定郵件編碼
      $mail->Host       = "smtp.163.com"; // SMTP server
      $mail->SMTPDebug  = 1;// 啟用SMTP除錯 1 = errors  2 =  messages
      $mail->SMTPAuth   = true;// 伺服器需要驗證
      $mail->Port       = 25;//預設埠   
      $mail->Username   = "testuser"; //SMTP伺服器的使用者帳號
      $mail->Password   = "testpwd";//SMTP伺服器的使用者密碼
      $mail->AddReplyTo('****@com133.com', '回覆'); //收件人回覆時回覆到此郵箱
     $mail->AddAddress('****@test.com', '李明'); //收件人如果多人傳送迴圈執行AddAddress()方法即可 還有一個方法時清除收件人郵箱ClearAddresses()
    $mail->SetFrom('li1209@163.com', '發件人');//發件人的郵箱
    $mail->Subject = '這裡是郵件的標題';
    $mail->Body = '郵件內容';
    $mail->IsHTML(true);
      $mail->Send();
      echo "Message Sent OK";
    } catch (phpmailerException $e) {
      echo $e->errorMessage();//從PHPMailer捕獲異常
    } catch (Exception $e) {
      echo $e->getMessage();
    }
    ?>

    如果使用phpMailer傳送html網頁只需新增程式碼:
  $body = file_get_contents('tpl.html'); //獲取html網頁內容
  $mail->MsgHTML(eregi_replace("[]",'',$body));
注:使用MsgHTML()方法時傳送的郵件內容不僅僅是html程式碼,而且可以將html程式碼中的圖片等內容作為附件嵌入到頁面中一起傳送,這在傳送圖文並茂的資訊時比較常用。並且使用該方法時無需對Body屬性賦值也無需使用IsHTML()方法(即使使用也沒有效果)。
    透過SSL安全連線傳送郵件
    目前很多郵箱使用SLL加密方式連線發信,例如谷歌的GMAIL目前只支援加密連線,網易、騰訊等服務商目前也支援SLL加密方式連線。SSL協議埠號通常是465(具體視服務商而定),如果透過SSL方式傳送郵件只需增加一個屬性即可:
     $mail->SMTPSecure = "ssl";    
    同時埠號更改為SSL的埠號,例如:
     $mail->Port       = 465;
    這樣就可以透過SSL協議傳送郵件了。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4687/viewspace-2809577/,如需轉載,請註明出處,否則將追究法律責任。

相關文章