核心元件
TIdSMTP:SMTP 客戶端,負責連線、認證、發送。
TIdMessage:郵件訊息物件,包含寄件者、收件者、主旨、內文、附件集合。
TIdAttachment / TIdAttachmentFile:附件封裝。
TIdSSLIOHandlerSocketOpenSSL:SSL/TLS 加密 (Gmail、Outlook 等現代郵件服務必須)。
完整發送函數
uses IdSMTP, IdMessage, IdText, IdAttachmentFile, IdSSL, IdSSLOpenSSL, SysUtils;
procedure SendMailWithAttachment(
const SMTPHost: string; SMTPPort: Integer; UseSSL: Boolean;
const Username, Password: string;
const FromAddr, ToAddrs, CCAddrs, Subject, Body: string;
const AttachFiles: array of string);
var
SMTP: TIdSMTP;
Msg: TIdMessage;
SSLIO: TIdSSLIOHandlerSocketOpenSSL;
FileName: string;
begin
SMTP := TIdSMTP.Create(nil);
Msg := TIdMessage.Create(nil);
try
// SSL 設定
if UseSSL then
begin
SSLIO := TIdSSLIOHandlerSocketOpenSSL.Create(SMTP);
SSLIO.SSLOptions.Method := sslvTLSv1_2;
SSLIO.SSLOptions.Mode := sslmClient;
SMTP.IOHandler := SSLIO;
SMTP.UseTLS := utUseExplicitTLS; // STARTTLS
end;
SMTP.Host := SMTPHost;
SMTP.Port := SMTPPort;
SMTP.Username := Username;
SMTP.Password := Password;
// 郵件內容
Msg.From.Address := FromAddr;
Msg.Recipients.EMailAddresses := ToAddrs;
if CCAddrs <> '' then Msg.CCList.EMailAddresses := CCAddrs;
Msg.Subject := Subject;
Msg.Body.Text := Body;
Msg.Encoding := meMIME;
// 附件
for FileName in AttachFiles do
if FileExists(FileName) then
TIdAttachmentFile.Create(Msg.MessageParts, FileName);
// 發送
SMTP.Connect;
try
SMTP.Send(Msg);
finally
SMTP.Disconnect;
end;
finally
Msg.Free;
SMTP.Free;
end;
end;
表單呼叫範例
procedure TForm1.btnSendClick(Sender: TObject);
begin
SendMailWithAttachment(
'smtp.gmail.com', 587, True,
'your@gmail.com', 'app_password',
'your@gmail.com', 'to@example.com', '',
'測試主旨', '這是測試內文',
[EditAttachment.Text]); // 陣列可多檔
end;
常見問題排查
| 錯誤現象 | 可能原因 | 解決方法 |
| Authentication failed | 帳密錯誤/未開啟低安全性應用程式存取 | Gmail 需建立「應用程式密碼」而非登入密碼 |
| Connection timeout | Port 錯誤/防火牆封鎖 | 確認 465 (SSL) 或 587 (STARTTLS) 通暢 |
| SSL library not found | 缺少 OpenSSL DLL | 專案目錄放入 libcrypto-1_1.dll, libssl-1_1.dll (Indy 10.6+) |
| 附件亂碼/損毀 | 編碼設定錯誤 | 確保 Msg.Encoding := meMIME,附件用 TIdAttachmentFile |
現代化建議
- 使用
TIdSMTP 非同步方法 (BeginSend/EndSend) 避免 UI 凍結。
- 支援 OAuth 2.0 (Gmail/Outlook) 需自行實作 Token 取得並用
XOAUTH2 SASL 機制,或改用圖形化郵件 API (Gmail API, Microsoft Graph)。
- 上一篇文章: Delphi 使用 TWebBrowser 嵌入網頁做為程式介面:HTML/CSS/Flash 打造炫酷 UI
- 下一篇文章: Delphi TServerSocket/TClientSocket 開發 TCP 通訊程式:多客戶端伺服器架構
Copyright ©
程式碼之家 All Rights Reserved