in , , , ,

Windows Plesk 虛擬主機 ASP 表單寄信教學:SMTP 驗證設定與 CDO.Message 範例

解決 ASP 程式寄信問題,完整程式碼範例與 SMTP 設定指南

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」將該網域的郵件服務改為 DisabledDeactivate

實戰範例:使用 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

 

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

Written by 婷Z

發佈留言

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

GIPHY App Key not set. Please check settings