2011-08-12 31 views
13

Tôi đang sử dụng INDY để gửi Email bằng ứng dụng khách SMTP trên cổng 25 mà không có vấn đề gì.Sử dụng Gmails Outgoing SMTP từ DELPHI (Indy) bằng TLS

Bây giờ tôi cần gửi một email bằng tài khoản Gmail và tôi cần sử dụng TLS.

Bất kỳ ai cũng có thể cung cấp một mẫu đơn giản về cách thực hiện điều đó.

Cảm ơn

+1

kết quả hàng đầu trên google cho "indy + smtp + gmail" tiết lộ: [Gửi mail cho gmail sử dụng Indy] (http: //www.marcocantu.c om/tips/oct06_gmail.html) –

+1

Tôi đã sử dụng hướng dẫn của Marco Cantu trong quá khứ: http://www.marcocantu.com/tips/oct06_gmail.html – berndvf

Trả lời

6

Mã này làm việc cho GMail:

begin 
    IDSMTP1 := TIDSMTP.Create; 
    IdSSLIOHandlerSocketOpenSSL1 := TIdSSLIOHandlerSocketOpenSSL.Create; 
    try 

    with IDSMTP1 do 
    begin 
     Host := srvr.Host; 
     Port := srvr.Port; 
     if (srvr.needAuthentication = 'Y') then 
     AuthType := satDefault 
     else 
     AuthType := satNone; 
     IOHandler := IdSSLIOHandlerSocketOpenSSL1; 

     if (srvr.secureMode = 'Y') then 
     UseTLS := utUseRequireTLS 
     else 
     UseTLS := utNoTLSSupport; 

     Username := srvr.Username; 
     Password := srvr.Password; 
    end; 

    idMBHTML := TIdMessageBuilderHTML.Create; 
    Idmessage1 := TIDMessage.Create; 

    try 
     with idMBHTML do 
     begin 
     enc := TEncoding.Unicode; 
     HTML.LoadFromStream(FEmlMsg.MsgBody, enc); 
     for c := 0 to FEmlMsg.Attachmnts.Count - 1 do 
      Attachments.Add(FEmlMsg.Attachmnts[c]); 
     FillMessage(IDMessage1); 
     end; 

     with Idmessage1 do 
     begin 
     Subject := FEmlMsg.MsgSubject; 
     From.Address := FEmlMsg.FromAddress; 
     From.Name := FEmlMsg.FromName; 
     Recipients.EMailAddresses := FEmlMsg.RecipientAddress; 
     if FEmlMsg.ReceiptRecipientAddress <> '' then 
      ReceiptRecipient.Address := FEmlMsg.ReceiptRecipientAddress; 
     if FEmlMsg.ReceiptRecipientName <> '' then 
      ReceiptRecipient.Name := FEmlMsg.ReceiptRecipientName; 
     end; 

     with IDSMTP1 do 
     begin 
     if not Connected then 
      Connect; 
     Send(IdMessage1); 
     end; 

    finally 
     Idmessage1.Free; 
     idMBHTML.Free; 
    end; 
    finally 
    IDSMTP1.Free; 
    IdSSLIOHandlerSocketOpenSSL1.Free; 
    end; 
end; 
+0

đã tự kiểm tra? Tôi gặp lỗi khi kết nối: EIdOSSLCouldNotLoadSSLLibrary với thông báo 'Không thể tải thư viện SSL.' – DRokie

+0

Đảm bảo bạn đang sử dụng đúng phiên bản của OpenSSL DLL cho phiên bản Indy của bạn. Sử dụng hàm 'WhichFailedToLoad()' của Indy để xác định phần nào của OpenSSL không tải được. –

+0

Như Remy đã đề cập ở trên, bạn phải bao gồm các tệp DLL OpenSSL cùng với ứng dụng của bạn. Chúng phải nằm trong cùng một thư mục với ứng dụng thực thi hoặc phải nằm trong đường dẫn hệ thống (ví dụ: thư mục System32). Bạn có thể tải xuống các tệp mới nhất từ ​​trang web Indy. –

1

Bạn cần dll SSL để làm cho công việc IdSSLIOHandler.

Có thông tin tại Indy SSL Website mà chuyển hướng bạn đến Fulgan Download Site

Bạn có thể tải về một gói thích hợp cho nền tảng của bạn và sau đó bao gồm 2 dlls với ứng dụng của bạn. Bản thân tôi đang sử dụng 2 dll với các thành phần indy để gửi thư qua email trong hơn 2 năm. Vấn đề duy nhất là việc gửi khá chậm.

0

Bạn không nói phiên bản Indy nào bạn đang sử dụng. Để sử dụng TSL (thay đổi bảo mật cuối cùng trong Hotmail/GMaill), bạn cần sử dụng Indy 10.

Xem description here.

Trên thực tế Y sử dụng configuraction này để gửi mail bằng Gmail và nó hoạt động một cách chính xác:

  • MailServer = smtp.gmail.com
  • = PortServer 465
  • [email protected] (cùng thư)
  • SSLMethod = sslvTLSv1
Các vấn đề liên quan