跳轉到內容

PHP 程式設計/郵件

來自華夏公益教科書,開放書籍,開放世界

mail 函式用於透過 php.ini 配置檔案中指定的 SMTP 伺服器傳送電子郵件。

bool mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]])

返回的布林值將顯示電子郵件是否已成功傳送。

此示例將傳送主題為“主題”、內容為“訊息”的郵件到電子郵件地址“example@domain.tld”。 此外,收件人將看到郵件是從“Example2 <example2@domain.tld>”傳送的,並且收件人應該回復到“Example3 <example3@domain.tld>”

 mail(
  "example@domain.tld", // E-Mail address
  "subject", // Subject
  "message", // Message
  "From: Example2 <example2@domain.tld>\r\nReply-to: Example3 <example3@domain.tld>"  // Additional Headers
 );

不需要將電子郵件地址寫成“姓名 <電子郵件>”格式,只需寫“電子郵件”即可。

這將傳送與第一個示例相同的郵件,但在郵件中包含 From: 和 Reply-To: 頭部。 如果你希望收件人能夠回覆你,則需要包含這些頭部。 此外,一些電子郵件提供商會認為某些頭部缺失的郵件是垃圾郵件,因此除非包含正確的頭部,否則郵件將最終出現在垃圾郵件資料夾中。

重要說明

[編輯 | 編輯原始碼]
  • PHP 預設情況下本身沒有任何郵件傳送功能。 它需要將郵件傳遞給本地郵件傳輸代理,例如 sendmail。 這意味著你不能只是執行 PHP 並期望它傳送郵件; 你必須安裝郵件傳輸代理。
  • 確保在收件人或主題中沒有換行符,否則郵件可能無法正確傳送。
  • 但是,額外的頭部欄位 - 應該始終包含 From: 頭部 - 也可能包含其他頭部。 在 Windows 上的 PHP 中,每個頭部之後應該跟著 \r\n,但在 Unix 版本中,你應該只在頭部行之間包含 \n。 不要在最終的額外頭部行之後新增 \n 或 \r\n。
  • to 引數不應該是“姓名 <someone@example.com>”形式的地址。 mail 命令在與 MTA 交談時可能無法正確解析它(尤其是在 Windows 下)。

錯誤檢測

[編輯 | 編輯原始碼]

尤其是在傳送多封郵件時,例如在新聞通訊指令碼中,錯誤檢測非常重要。

使用此指令碼傳送郵件,同時警告錯誤

 $result = @mail($to, $subject, $message, $headers);

 if ($result) {
     echo "Email sent successfully.";
 } else {
     echo "Email was not sent, as an error occurred.";
 }

使用陣列傳送到多個地址

[編輯 | 編輯原始碼]

在下例中,指令碼已經得到一個電子郵件列表,我們只需使用與 PHP 中使用 mysql 結果迴圈相同的步驟。 下面的指令碼將嘗試向陣列中的每個電子郵件地址傳送電子郵件,直到它執行完畢。

 while ($row = mysql_fetch_assoc($result)) {
       mail($row['email'], $subject, $message, null, "-f$fromaddr");
 }

然後,如果我們將錯誤檢查整合到多封郵件指令碼中,我們將得到以下結果

 $errors = 0
 $sent = 0
 
 while ($row = mysql_fetch_assoc($result)) {
       $result = "";
       $result = @mail($row['email'], $subject, $message, null, "-f$fromaddr");
       if (!$result) {
           $errors = $errors + 1;
       }
       $sent = $sent + 1;
 }
 
 echo "You have sent $sent messages";
 echo "However there were $errors errors";

更多資訊

[編輯 | 編輯原始碼]


華夏公益教科書