首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 使用 Indy 元件發送帶附件郵件:SMTP 客戶端完整實作

     編輯:Delphi

核心元件

  • 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;

常見問題排查

現代化建議

  • 使用 TIdSMTP 非同步方法 (BeginSend/EndSend) 避免 UI 凍結。
  • 支援 OAuth 2.0 (Gmail/Outlook) 需自行實作 Token 取得並用 XOAUTH2 SASL 機制,或改用圖形化郵件 API (Gmail API, Microsoft Graph)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
錯誤現象可能原因解決方法
Authentication failed帳密錯誤/未開啟低安全性應用程式存取Gmail 需建立「應用程式密碼」而非登入密碼
Connection timeoutPort 錯誤/防火牆封鎖確認 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