Windows Plesk 主機的 ASP 寄信需求
在使用 Windows 虛擬主機進行網站開發時,傳統的 ASP (Active Server Pages) 或是 ASP.NET 經常需要製作「聯絡我們」表單或「訂單通知」信件。然而,寄信成功與否,很大程度取決於 SMTP (Simple Mail Transfer Protocol) 的設定是否正確。在 Plesk 控制台環境下,我們必須先釐清您的「網站空間」與「郵件服務」是否位於同一台伺服器,這將決定您的程式碼該如何撰寫。
狀況一:網站與郵件使用同一台主機 (使用本機 SMTP)
Web主機和MAIL主機一樣
當您的網域 DNS 中的 MX 紀錄(Mail Exchanger Record)是指向您的 Windows Plesk 主機 時,代表這台主機同時負責處理您的網頁與信件。為了防止伺服器被濫用發送垃圾信,現代主機通常要求「SMTP 驗證」。
操作步驟:
- 登入 Plesk 面板,進入「Mail」功能頁籤。
- 建立一個專門用來發信的 Email 帳號(例如:noreply@yourdomain.com)。
- 在您的 ASP 程式碼中,SMTP 伺服器填寫 mail.yourdomain.com,並填入剛建立的帳號密碼進行驗證。
狀況二:網站與郵件使用不同主機 (使用外部 SMTP)
Web主機和MAIL主機不一樣,也就是DNS的MX相對來說是在外部,您需要使用您外部的EMAIL帳密當SMTP驗證
這種情況常見於:網站放在 Windows 主機,但信箱使用 Google Workspace (Gmail) 或 Microsoft 365。此時,您的 ASP 程式必須透過「外部」的郵件伺服器來寄信。
您需要使用您外部的EMAIL帳密當SMTP驗證
1. 詢問您外地MAIL主機的SMTP位址
2. 詢問您外地MAIL主機的SMTP帳號和密碼
3. 很重要,因為有可能你會需要通知你的主機廠商
為什麼要關閉 Plesk 的 Mail 服務?
這是許多開發者容易忽略的盲點!如果沒有在 Plesk 中關閉該網域的 Mail 服務,當您的網頁程式嘗試寄信給自己網域的信箱(例如:service@yourdomain.com)時,Plesk 主機會誤以為這是「內部信件」,直接投遞到本機,而不會發送到外部真正的 Mail Server (如 Gmail),導致您永遠收不到信。因此,務必請您MAIL SERVER商,於 Plesk 的「Mail Settings」將該網域的郵件服務改為 Disabled 或 Deactivate。
實戰範例:使用 CDO.Message 進行 SMTP 驗證發信
使用CDO.MessageSMTP 驗證發信 (2020年6月驗證上可行)
代碼:
<%@LANGUAGE="VBSCRIPT" CODEPAGE="65001"%>
<%
Set objMail = CreateObject("CDO.Message")
objMail.Subject = "信件主旨"
objMail.From = "發信人@信箱"
objMail.To = "收信人@信箱"
objMail.TextBody = "Test TEST"
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendusing")=2
'SMTP 伺服器
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpserver")="slin.com.tw"
'SMTP 伺服器 Port
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpserverport")=25
'是否使用 SSL 連線 (False or True)
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
'伺服器逾時時間
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
'SMTP 伺服器是否要用驗證 (必要條件)
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
'SMTP 發信EMAIL
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendusername") = "OOXX@OOXX.com"
'SMTP 發信EMAIL密碼
objMail.Configuration.Fields.Item _ ("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "密碼在這"
objMail.Configuration.Fields.Update
objMail.Send
set objMail=nothing
%>
請留意:<%@LANGUAGE=”VBSCRIPT” CODEPAGE=”65001″%>一定要加喔
【程式碼解析】
這段程式碼使用的是微軟經典的 CDO.Message 元件。
- CODEPAGE=”65001″: 這行非常重要,設定頁面編碼為 UTF-8,避免信件標題或內容出現亂碼。
- sendusing = 2: 代表使用 SMTP 協議透過網路發送(而非存入本機目錄)。
- smtpserver: 請將範例中的 “slin.com.tw” 替換為您實際的 SMTP 伺服器位址(如 mail.yourdomain.com)。
- smtpserverport: 一般非加密為 25,若使用 SSL 通常為 465 或 587,需搭配 `smtpusessl = True`。
- smtpauthenticate = 1: 啟用基本驗證,這在現代郵件主機中是必須的,以防止 Open Relay。
進階補充:.NET System.Net.Mail 使用資源
.NET 可以用使用 System.Net.Mail
微軟頁面參考
https://msdn.microsoft.com/en-us/library/system.net.mail.smtpclient(v=vs.110).aspx
https://support.microsoft.com/zh-tw/help/555287
如果您是使用 ASP.NET (如 C# 或 VB.NET) 開發,建議拋棄舊的 CDO 元件,改用較新的 System.Net.Mail 命名空間。它提供了更強大的功能,例如支援異步發送、更好的附件處理以及更完善的 SSL/TLS 支援。微軟官方文件提供了詳細的屬性說明與範例,建議開發者參考。
常見問題 (FAQ)
Q1:為什麼我的程式顯示寄信成功,但收件者卻沒收到?
這可能有幾個原因:(1) 信件被對方的垃圾郵件過濾器擋下。(2) 如果您使用外部 Mail 主機,請確認是否已在 Plesk 關閉了 Mail 服務(Deactivate),否則信件會卡在本機。(3) 檢查您的 SPF 紀錄是否已授權該主機發信。
Q2:SMTP Port 應該設定 25、465 還是 587?
通常 Port 25 用於無加密連線。如果您開啟了 SSL (smtpusessl = True),通常使用 Port 465。若是使用 TLS (STARTTLS),則常用 Port 587。建議詢問您的郵件主機商獲取正確設定。
Q3:為什麼必須設定 smtpauthenticate = 1?
這是為了安全性。如果不進行身份驗證,任何人都可以利用您的伺服器發送垃圾郵件。大多數虛擬主機都強制要求 SMTP 驗證才能寄信,否則會回傳錯誤。
更多關於Plesk控制台教學文章,請參考以下文章
Windows 虛擬主機 Plesk Obsidian 18 備份與還原完整圖文教學
Windows 虛擬主機 Plesk 工作排程教學
Plesk 檔案與資料夾權限設定教學
Plesk Obsidian 18 垃圾郵件殺手設定完整教學
在 Windows 2019 的 Plesk 控制台查看 error_log
GIPHY App Key not set. Please check settings