2011-07-20 6 views
7

Tôi hiện có một ứng dụng được viết để tạo chứng từ và email pdf cho người nhận phối cảnh của họ. Tuy nhiên chức năng tôi sử dụng phụ thuộc vào khách hàng (MS Outlook) và tôi thực sự muốn làm cho ứng dụng email này trở nên bất khả tri khi chúng tôi có nhiều khách hàng và không phải tất cả họ đều sử dụng Outlook.Gửi email có tệp đính kèm Khách hàng Agnostic

Tôi đã xem xét một vài tùy chọn nhưng không thể tìm thấy bất kỳ thứ gì trong tìm kiếm có vẻ như giải quyết được vấn đề của tôi.

Có ai biết cách tốt để gửi email bằng kết nối smtp của khách hàng bất kể khách hàng và gửi tệp đính kèm với khách hàng mà không gọi trực tiếp cho khách hàng để làm điều đó không?

Trả lời

5

Hoặc bạn có thể sử dụng thư viện Synapse để gửi thư bằng SMTP, lý tưởng trong số newest snapshot.

Đây là mã mà nên gửi qua đường bưu điện với gắn c:\voucher.pdf tập tin từ [email protected] để [email protected] đến smtp.server.com với đăng nhập và mật khẩu loginpassword. Về phần còn lại của các hàm từ lớp TMimeMess tôi sẽ giới thiệu bạn trực tiếp đến the reference.

Tôi hy vọng điều này sẽ hiệu quả vì tôi đã đơn giản hóa và bản địa hoá mã phức tạp hơn nhiều mà tôi đang sử dụng và tôi không thể xác minh hoặc biên dịch. Nếu không, chúng ta hãy downvote nó :)

uses 
    SMTPSend, MIMEPart, MIMEMess; 

procedure TForm.SendEmailClick(Sender: TObject); 
var 
    MIMEText: TStrings; 
    MIMEPart: TMimePart; 
    MIMEMessage: TMimeMess; 
begin 
    MIMEText := TStringList.Create; 
    MIMEText.Add('Hello,'); 
    MIMEText.Add('here is the text of your e-mail message,'); 
    MIMEText.Add('if you want the HTML format, use AddPartHTML'); 
    MIMEText.Add('or e.g. AddPartHTMLFromFile if you have your'); 
    MIMEText.Add('HTML message content in a file.'); 

    MIMEMessage := TMimeMess.Create; 

    with MIMEMessage do 
    try 
    Header.Date := Now; 
    Header.From := '[email protected]'; 
    Header.ToList.Clear; 
    Header.ToList.Add('[email protected]'); 
    Header.CcList.Clear; 
    Header.Subject := 'E-mail subject'; 
    Header.XMailer := 'My mail client name'; 

    MIMEPart := AddPartMultipart('mixed', nil); 

    AddPartText(MIMEText, MIMEPart); 
    AddPartBinaryFromFile('c:\voucher.pdf', MIMEPart); 

    EncodeMessage; 

    if SendToRaw(Header.From,    // e-mail sender 
       Header.ToList.CommaText, // comma delimited recipient list 
       'smtp.server.com',   // SMTP server 
       Lines,      // MIME message data 
       'login',     // server authentication 
       'password')    // server authentication 
    then 
     ShowMessage('E-mail has been successfuly sent :)') 
    else 
     ShowMessage('E-mail sending failed :('); 
    finally 
    Free; 
    MIMEText.Free; 
    end; 
end; 


Cập nhật:

Theo bình luận thoải mái từ Downvoter step into the light (người đàn ông, hãy thay đổi nick xin vui lòng, nó không mát nữa :), sẽ thực sự xấu nếu bạn sẽ gửi danh sách tất cả người nhận tới mọi người. Với synapse you cannot thêm BCC vào tiêu đề thư; không có tài sản Header.BCCList trong MIMEMessage. Thay vào đó bạn có thể trực tiếp sửa đổi dữ liệu trước khi gửi chúng.

// First, you will remove the line where you are adding a recipient to the list 
Header.ToList.Add('[email protected]'); 

// the rest between you can keep as it is and after the message encoding 
EncodeMessage; 

// and before sending the mail you'll insert the line with BCCs 
Lines.Insert(1, 'Bcc: [email protected], [email protected]'); 

if SendToRaw ... 
+0

Tôi sẽ cung cấp cho tuyến đường này một shot. cc sẽ không là vấn đề. Ứng dụng chỉ gửi phiếu thưởng cho một người nhận. Chương trình tạo ra 10-15 chứng từ khác nhau và gửi email cho khách hàng của chúng tôi. Một người nhận trong toàn bộ quá trình. Việc thực hiện hiện tại bằng cách sử dụng Outlook hoạt động như một sự quyến rũ nhưng như đã nói không phải tất cả đều sử dụng triển vọng. – JamesW

1

Bạn có thể sử dụng Indy làm ứng dụng khách SMTP, độc lập với ứng dụng email mặc định của hệ thống. Dưới đây là một số cơ bản demo gửi e-mail mà không có tệp đính kèm và có các bài viết chi tiết herehere về gửi HTML hoặc e-mail thuần văn bản và có hoặc không có tệp đính kèm.

+0

Nhưng điều đó sẽ không tích hợp với ứng dụng email của người dùng (cụ thể là, anh ấy sẽ không thể theo dõi email được gửi.) Không phải là quyết định thiết kế đơn giản! –

+2

@Leonardo Tất nhiên nó sẽ không tích hợp. Nếu đó là một yêu cầu bạn có thể thử MAPI - có 'JclMapi' trong [JCL] (http://sourceforge.net/projects/jcl/) nhưng sau đó một lần nữa, không phải tất cả các ứng dụng email đều hỗ trợ nó đúng cách. –

+4

@Leonardo: James đã yêu cầu SMTP, một giao thức chứ không phải là một chương trình. Indy có thành phần 'TIdSMTP' truy cập trực tiếp giao thức SMTP, không cần ứng dụng email khác vì TIdSMTP * là * máy khách.Nếu anh ta muốn theo dõi email đã gửi, anh ta sẽ phải làm như vậy theo cách thủ công (chẳng hạn như bằng cách kết nối với máy chủ email của mình qua giao thức IMAP4 - xem thành phần 'TIdIMAP4' - và tải email lên thư mục mong muốn). –

0

Nếu bạn muốn tích hợp với các ứng dụng email tồn tại (ví dụ: xem các tin nhắn được gửi trong sent, sent items vv thư mục của ứng dụng email), bạn có thể sử dụng Simple MAPI. Các tiêu đề được dịch trong đơn vị Mapi ở Delphi (ít nhất là trong D2007).

Nhưng hãy cẩn thận kiểm tra xem máy khách thực sự có hỗ trợ MAPI đơn giản hay không.

+0

Thông tin không quan trọng trên trang MAPI liên kết đơn giản: 'Việc sử dụng MAPI đơn giản không được khuyến khích. Nó có thể bị thay đổi hoặc không có sẵn trong các phiên bản tiếp theo của Windows.' – mjn

+0

@mijn: Đúng vậy. Tôi không để ý. Hm ... Tôi thấy một số nhiệm vụ mới đến ... – Toto