in , ,

cPanel 虛擬主機 PHP 程式 SMTP 寄信完整教學(PHP支援 5.5–8.4)

教你避開 PHP Mail 限制,用 SMTP 穩定完成表單、WordPress 寄信設定

程式寄信在網站上的常見應用情境

程式寄信在網站上最常見用於留言功能、會員註冊驗證、忘記密碼、系統通知、訂購帳單…等。
只要網站具備使用者互動或系統自動通知的需求,幾乎都會需要透過程式自動寄送信件。
因此,寄信功能是否穩定,會直接影響網站的正常運作與使用者體驗。

在實務上,常見的程式寄信方式主要有 PHP Mail() 與 SMTP 兩種。
然而在虛擬主機環境中,這兩種方式的可用性與限制差異相當大,
若未事先了解主機商的寄信政策,往往會導致程式寄信失敗或信件無法正常送達。

PHP Mail() 與 SMTP 的差異說明

PHP Mail() 是 PHP 內建的寄信函式,過去被廣泛使用於各式網站表單與系統通知。
但由於 PHP Mail() 容易被濫用作垃圾郵件來源,
近年來多數虛擬主機已逐漸關閉或限制 PHP Mail() 的使用。

相較之下,SMTP 屬於需要帳號驗證的寄信方式,
能夠明確控管「誰可以寄信、從哪裡寄信」,
因此成為目前虛擬主機最主要、也是最被建議使用的程式寄信方式。

以下內容將以「使用 SMTP 進行程式寄信」作為主要說明方向,
一般使用 Outlook、Gmail 等郵件軟體手動寄信,
並不在本文討論的限制範圍內。

為什麼多數虛擬主機限制外部 SMTP 發信

許多虛擬主機不允許網站程式直接使用外部 SMTP 伺服器發信,
例如 Gmail SMTP、其他第三方 Mail Server。
主要原因在於,若網站程式被入侵或遭濫用,
容易導致大量垃圾郵件從同一主機 IP 發出,
進而使整台主機 IP 被列入黑名單。

因此,多數虛擬主機僅允許使用「該主機本身的 Mail Server」
進行 SMTP 驗證後發信,
藉此確保寄信來源可控、責任明確,
並降低主機整體被封鎖的風險。

MX 指向外部 Mail Server 時的正確觀念

許多站長在設定程式寄信時,常會因為「MX 已經指向外部 Mail Server」
而誤以為網站程式也必須跟著使用外部 Mail Server 發信,
但在虛擬主機環境中,這樣的理解其實並不正確。

實務上,只要網站程式是放在虛擬主機上執行,
不論網域的 MX 是否指向外部 Mail Server(例如 Google Workspace、Microsoft 365),
網站程式在寄信時,仍然必須使用該虛擬主機所提供的 SMTP 服務進行發信。

因此,即使 MX 在外部,也需要在虛擬主機的 cPanel 控制台中
新增一組 Email 帳號,作為網站程式寄信時的 SMTP 驗證帳號,
這組帳號的用途僅是用來「驗證與發信」,與實際收信位置無直接衝突。

為什麼網站程式一定要使用主機 SMTP 發信

在多數虛擬主機的限制下,網站程式無法直接使用外部 SMTP 發信,
因此唯一穩定且被主機商允許的方式,
就是透過該主機本身所提供的 Mail Server 進行 SMTP 驗證後寄信。

這樣的設計除了可以避免外部 SMTP 被濫用,
也能讓主機商清楚掌握每一封信件的發信來源,
在發生異常時能快速追蹤與處理,
對網站與整體主機環境來說都是相對安全的作法。

最新更新: 如果您真的不想用網站主機上的SMTP,然後還是很想用外部EMAIL主機來做虛擬主機程式寄信? 例如把網站空間的程式串GMAIL 來發信,您可以參考此篇 WordPress 外掛 WP Mail SMTP API 設定教學|避開虛擬主機限制使用 Gmail 發信

於虛擬主機上架設 CMS(WordPress / Joomla)寄信設定邏輯

若網站是使用 WordPress、Joomla 等 CMS 系統架設,
在進行程式寄信設定時,原則上只需要在後台的寄信或郵件設定中,
將寄信方式改為 SMTP,並填入在虛擬主機上所建立的 Email 帳號與密碼即可。

即使網域的 MX 是指向外部 Mail Server,
CMS 仍然可以透過虛擬主機本地端的 Mail Server 發信。
在部分主機環境中,SMTP 主機欄位可填寫 localhost,
代表使用本地主機進行寄信;
實際可填寫的內容仍需依主機商提供的設定說明為準。

MX 在外部 Mail Server 時,SPF 與 DKIM 的正確設定觀念

當網站程式是透過虛擬主機本身的 SMTP 發信,
而網域的 MX 記錄指向外部 Mail Server 時,
除了 SMTP 帳密設定正確外,
DNS Server上的 SPF 與 DKIM 設定也是影響信件是否能正常送達的關鍵。

在 SPF 設定上,必須將實際負責發信的虛擬主機對外發信 IP 加入 SPF 紀錄中
用來告訴收件端郵件系統,該 IP 是被允許代表此網域發信的來源。

v=spf1 ip4:123.123.123.123 include:_spf.google.com ~all

上述範例中,ip4 為虛擬主機實際發信 IP,
include 則代表外部 Mail Server(例如 Google Workspace)允許代為發信。
SPF 通常只需維持一條紀錄,將所有合法的發信來源集中加入即可。

除了 SPF 之外,也強烈建議同時啟用 DKIM。
DKIM 是用來替信件內容進行簽章,
讓收件端能夠驗證信件確實由該網域授權送出,且未被竄改。

當同一個網域同時有兩台 Mail Server 會發信時,
通常就會對應到”兩組 DKIM的指定“,這是正常且正確的情況。

例如一組來自外部 Mail Server(如 Google Workspace),
另一組則來自虛擬主機本身的 SMTP。

關於 cPanel 虛擬主機 Mail Server 的 DKIM 實際設定方式,
可直接參考以下完整圖文教學說明:cPanel 虛擬主機 Mail Server DKIM 設定教學

PHPMailer 版本說明與適用 PHP 環境

PHPMailer 是目前最常見、也最成熟的 SMTP 程式寄信函式庫,
許多網站表單、會員系統與 CMS 寄信功能,底層實作皆會使用到 PHPMailer。

目前 PHPMailer 主要分為兩大版本:

● 5.x.x 版本:主要適用於 PHP 5.0~PHP 7.0(已於 2020 年停止更新)

● 6.x.x 版本以上(現在7.0.1版):主要適用於 PHP 5.5~PHP 8.4(持續更新中)

由於 5.x.x 版本已停止維護,存在潛在的安全性風險,
因此在條件允許的情況下,建議以 6.x.x 版本以上為主,
並搭配較新的 PHP 版本使用。

實際使用前,可至官方版本發布頁確認各版本對應的 PHP 環境:PHPMailer 各版本下載連結

使用 PHPMailer 搭配主機 SMTP 進行程式寄信

以下說明為使用虛擬主機本身的 Mail Server 進行寄信,
不使用外部 SMTP(如 Gmail SMTP),
此方式也是多數虛擬主機最穩定、最被允許的作法。

在開始之前,請先至 cPanel 控制台中新增一組 Email 帳號,
並記下完整的 Email 帳號與密碼,
此帳號將作為 PHPMailer 進行 SMTP 驗證時使用。

下載 PHPMailer 後,解壓縮並進入 src 資料夾,
將以下三個檔案放置於主機空間中:

Exception.php
PHPMailer.php
SMTP.php

接著新增一個寄信用的 PHP 檔案(例如 send.php),
並將該檔案與上述三個 PHPMailer 檔案放在同一資料夾中,
即可開始撰寫 SMTP 寄信程式。

實際程式碼中,需特別留意 SMTP 主機、連接埠(Port)、
加密方式(TLS / SSL)以及帳號密碼是否與主機設定相符。
只要 SMTP 驗證成功,信件即可透過主機 Mail Server 正常寄出。

於虛擬主機上操作:PHPMailer 7.x.x版-7.0.1(2025.11.25發佈最新版)程式寄信範例教學

Step1-範例理解:
該範例針對使用發信程式所在的 Mail Server 發信
(即不使用外部 Mail Server 發信,如 Gmail…等),
由於 PHPMailer 5.x.x 已沒有再作更新,
故本次介紹針對 7.0.1 版的 PHPMailer 作說明。

Step2-
新增 Mail 帳號:
請先到 cPanel 控制台新增一個電子郵件帳號
(即使您的 MX 沒有指向 Web 主機空間,也一樣新增),
新增後請記住 Mail 帳號與密碼。



Step3:
PHPMailer 7.0.1 下載連結,請點我

解開壓縮檔後,進到 src 資料夾,
僅需以下三個檔案,並將它們放在主機空間上:

  • Exception.php
  • PHPMailer.php
  • SMTP.php

Step4:
新增發信的檔案(例如 send.php),
並與上述三個檔案放在同一資料夾中,如下圖。



Step5:
將以下程式碼放置於 send.php 檔案中:
(紅色的部分與小編的私人設定實際訊息,方便確認使用):


<?php

use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;

require "Exception.php";
require "PHPMailer.php";
require "SMTP.php";

$mail = new PHPMailer(); // Passing `true` enables exceptions

try {

$mail->SMTPDebug = 0; // Enable verbose debug output
$mail->isSMTP(); // Set mailer to use SMTP
$mail->Host = "tang1.number1.info"; //設定有任何指向主機空間的網址名稱
$mail->SMTPAuth = true; // Enable SMTP authentication
$mail->Username = "tang@tang1.number1.info"; // 在cPanel新增mail的帳號(需要完整的mail帳號,含@後都要填寫)
$mail->Password = "************"; //在cPanel新增mail帳號時設定的密碼,請小心是否有空格,空格也算一碼。
$mail->SMTPSecure = "TLS"; // 寄信時使用TLS/SSL加密,若不需要請改寫:false。
$mail->Port = 587; // TLS加密的port為587;SSL加密的port為465;若不用TLS/SSL,請改用25
$mail->setFrom("tang@tang1.number1.info", "Tang"); // 顯示寄件人Mail帳號,需要與上述設定Mail帳號相同,後面'Tang'是填寫顯示寄件人的名稱。
$mail->addAddress("sw*******@gm***.com", "mailto");//收件者的Email
$mail->isHTML(true); // Set email format to HTML
$mail->Subject = "PHPMailer寄信測試標題";//信件主旨
$mail->Body = "這是一封測試信件哦!";//信件內容
$mail->send();
echo "Message has been sent";

} catch (Exception $e) {
echo "Message could not be sent.";
echo "Mailer Error: " . $mail->ErrorInfo;
}
?>

虛擬主機程式寄信常見問題

Q:如果 MX 沒有指向網站主機,會影響程式寄信嗎?
A:不會。只要網站程式是放在虛擬主機上執行,
並使用該主機的 SMTP 帳號進行寄信,
即使 MX 指向外部 Mail Server,仍可正常發信。

Q:SPF 與 DKIM 都設定了,為什麼信件還是進垃圾信?
A:除了 SPF 與 DKIM 之外,信件內容、寄信頻率、
是否被回報為垃圾信,以及收件端的信譽評分,
都可能影響信件最終的投遞結果。
SPF 與 DKIM 是基本條件,但並非唯一因素。

Q:一定要使用 PHPMailer 嗎?
A:不一定,但 PHPMailer 是目前相對穩定且廣泛使用的選擇,
對 SMTP 設定、錯誤處理與相容性都有良好支援,
因此非常適合作為程式寄信的實作工具。

結論

本文說明了在 cPanel 虛擬主機環境中,
如何使用 SMTP 與 PHPMailer 進行程式寄信,
並釐清了 MX 指向外部 Mail Server 時,
SPF 與 DKIM 的正確設定觀念。

只要網站程式使用主機 SMTP 發信,
並正確設定 SPF 與 DKIM,
即使 MX 在外部,
信件仍可穩定送達並有效降低進入垃圾信匣的風險。

文章來源:https://wpoki.com

Written by 婷Z

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

GIPHY App Key not set. Please check settings

One Comment