2009-12-26 51 views
14

Trong chương trình của tôi, tôi đang soạn email để gửi bằng phần mềm ứng dụng khách email mặc định được cài đặt trên máy của người dùng.Làm cách nào để Chương trình Delphi gửi một Email kèm theo Tài liệu đính kèm qua Ứng dụng E-mail DEFAULT?

Tôi đã soạn địa chỉ mailto, chủ đề, nội dung đa cấp và tôi có một số tệp đính kèm để được bao gồm.

Tôi gần như đã làm việc này bằng mailto và ShellExecute như sau:

Message := 'mailto:[email protected]' 
    + '?subject=This is the subjectBehold Error Report' 
    + '&body=This is line 1' + '%0D%0A' 
    + 'This is line 2' + '%0D%0A' 
    + 'This is line 3' 
    + '&Attach=c:\file1.txt'; 
    RetVal := ShellExecute(Handle, 'open', PChar(Message), nil, nil, SW_SHOWNORMAL); 
    if RetVal <= 32 then 
    MessageDlg('Cannot find program to send e-mail.', mtWarning, [mbOK], 0); 

Sử dụng Delphi 2009 trên một máy Windows Vista, điều này sẽ mở một Microsoft Mail "Tạo Mail" cửa sổ, với Tổ, Chủ đề và Nội dung được điền chính xác. Tuy nhiên tập tin không được đính kèm.

Khi tôi nghiên cứu điều này, tôi nhận thấy một số bình luận nói rằng kỹ thuật này không hoạt động với tất cả ứng dụng thư khách. Tuy nhiên, hầu hết các bình luận là khá cũ, như tôi nhận ra đây là một kỹ thuật rất cũ.

Sau đó, tôi thấy rằng Zarko Gajic said rằng "phương pháp này là ok, nhưng bạn không thể gửi tệp đính kèm theo cách này".

Tôi cũng thấy rằng Windows API thư đơn giản (MAPI), nhưng Zarko nói rằng chỉ hoạt động nếu người dùng cuối có phần mềm email tuân thủ MAPI. Cũng có các tài liệu kỹ thuật về cách sử dụng MAPI với Delphi (ví dụ: Sending e-mail using mapi), nhưng tất cả đều có tuyên bố từ chối rằng MAPI không phải lúc nào cũng được cài đặt với Windows. Bên cạnh đó, tôi thực sự muốn thông báo xuất hiện đầu tiên trong chương trình email mặc định của người dùng, vì vậy họ sẽ có nó như một phần của hồ sơ email của họ và họ có thể chỉnh sửa và quyết định xem họ có muốn gửi hay không. Tôi không chắc chắn làm thế nào MAPI hoạt động và nếu nó sẽ làm điều đó.

Vì vậy, yêu cầu của tôi là:

  1. Để đưa email lên trong chương trình mail của người dùng.

  2. Để cho phép một hoặc nhiều tệp đính kèm.

  3. Để làm việc với (hy vọng) tất cả ứng dụng email trên bất kỳ máy Windows nào từ XP lên (ví dụ: XP, Vista hoặc 7).

Có con vật như vậy không? Hoặc có thể ai đó biết cách để có được các phần đính kèm để làm việc với kỹ thuật mailto/ShellExecute?

Hầu hết mọi người làm gì?


Edit:

Đã có một vài câu trả lời với các giải pháp MAPI và thậm chí là một giải pháp Indy.

Vấn đề tôi gặp phải là chúng không nhất thiết phải sử dụng ứng dụng thư mặc định. Trên máy Vista của tôi, ví dụ, tôi đã thiết lập Windows Mail làm ứng dụng khách mặc định của mình. Khi tôi gửi MAPI, nó không mang đến Windows Mail, nhưng nó sẽ trả về và thiết lập email trong Outlook. Tôi không muốn điều đó.

Hai trong số người dùng của tôi về chương trình của tôi phàn nàn:

thói quen debug của bạn thất bại trong việc gửi các tập tin, vì nó cố gắng để bắt đầu cửa sổ thư cho một số lý do được biết đến đó là tự thay vì sử dụng các ứng dụng thư mặc định (trong trường hợp thunderbird của tôi)

Tôi đã cố gắng điền vào trường hợp ngoại lệ báo cáo nhưng đã bỏ khi nó yêu cầu máy chủ này, máy chủ đó! Sau đó tôi nhận được thực sự khó chịu vì nó đã khởi chạy Outlook - Tôi chưa bao giờ sử dụng hoặc muốn sử dụng nó.

Tôi không cần mã cho MAPI hoặc Indy. Họ có sẵn. Nhưng nếu bạn đề nghị MAPI hoặc Indy, những gì tôi thực sự cần là một cách để tìm khách hàng mặc định và đảm bảo rằng nó là một trong đó là thông qua email được gửi đi.

Ngoài ra, tôi cần biết liệu MAPI hiện có phổ cập hay không. 5 năm trước, nó không được đảm bảo để hoạt động trên tất cả các máy vì nó không được cài đặt như một phần của hệ điều hành. Điều đó vẫn đúng, hay hiện tại MAPI đi kèm với Windows XP, Vista và 7 theo mặc định?

Các câu hỏi tương tự cũng được áp dụng cho Indy hoặc bất kỳ giải pháp được đề xuất nào khác. Nó có thể làm việc với máy khách mặc định và nó có hoạt động trên hầu hết các máy Windows XP và các phiên bản sau không?

Lý do tại sao giải pháp "mailto" quá đẹp, là tất cả các máy phải hỗ trợ nó cho mục đích xử lý lệnh gửi thư HTML được tìm thấy trên các trang web. Bây giờ, nếu chỉ tôi có thể sử dụng nó để thêm tệp đính kèm ...


Có thể tìm thấy giải pháp: mjustin chỉ ra một giải pháp thay thế sử dụng lệnh gửi của hệ điều hành. Điều đó rất có thể là con đường để đi.

Mailto không giới hạn ở 256 ký tự như HTML mailto, nhưng tôi đã bị tàn phá để tìm hiểu nó đã bị giới hạn ở 2048 ký tự. May mắn thay vài giờ sau, mjustin trả lời.

Nếu việc thực hiện điều đó ổn, câu trả lời của anh ấy sẽ làm điều đó cho tôi. Nếu không, tôi sẽ thêm ý kiến ​​của tôi ở đây.


Không. Khi hóa ra, giải pháp gửi sẽ không luôn mở chương trình email mặc định. Trên máy tính của tôi, nó mở Outlook khi thư mặc định của tôi là Windows Mail. Quá tệ. Tôi đã phải quay trở lại phương thức mailto, mặc dù giới hạn 2048 ký tự.

tôi, tuy nhiên, tìm thấy trong bài viết: SendTo mail recipient rằng:

Tại thời điểm này, bạn có thể thay thế :: ShellExecute với một cái giếng nghĩ :: WinExec cuộc gọi, sử dụng thực tế mailto lệnh dòng được khai báo trong đăng ký và nhắm mục tiêu e-mail ứng dụng khách hiện tại (ví dụ: "% ProgramFiles% \ Outlook Express \ msimn.exe"/mailurl:% 1). Nhưng thì giới hạn là 32 KB. Với tư cách là kết thúc , không có cách nào để gửi email lớn hơn 32KB bằng cách sử dụng giao thức gửi thư .

nhưng sau đó tôi phải xác định ai là ứng dụng thư trong mỗi trường hợp. Tôi hy vọng điều đó sẽ dẫn đến những biến chứng hơn nữa.

Một điều khác mà tôi phát hiện ra là mailto cho phép đặt "thành", "cc", "bcc", "chủ đề" và "nội dung" nhưng không có tệp đính kèm. Trong khi gửi ONLY chỉ cho phép các tập tin đính kèm và sau đó thiết lập một email mặc định với một tin nhắn mặc định và không có cách nào để bạn có thể thiết lập các lĩnh vực khác nhau và cơ thể.

+0

Bạn * cần * cần mã MAPI vì đó là cách gửi e-mail tùy ý bằng ứng dụng khách mặc định.Nếu ứng dụng khách mặc định không hỗ trợ MAPI, thì bạn đã hết Indy không thể gửi thư bằng bất kỳ ứng dụng khách nào khác, Indy * là * ứng dụng thư điện tử trong trường hợp đó.Nếu MAPI không tìm thấy chương trình phù hợp, thì đó là * vấn đề bạn nên điều tra thêm. –

+0

Rob: Nếu MAPI được xây dựng trong hệ điều hành, sau đó tôi cảm thấy tốt hơn về nó.Với XP, mọi người phải cài đặt Outlook (tức là Microsoft Office) trước khi họ nhận được nó.Bạn đang phải đây là một vấn đề. Tôi đã có tất cả mọi thứ làm việc tốt với mailto/ShellExecute ngoại trừ việc nó không hỗ trợ file đính kèm ... nhưng tất cả những suy nghĩ này đang dẫn tôi đến một ý tưởng :-) Tôi sẽ đăng một câu hỏi khác. – lkessler

+0

Khi nó quay ra, tôi không phải tạo ra một câu hỏi khác, vì đã có một câu hỏi: http://stackoverflow.com/questions/198488/drag-drop-inside-an-application-and-to-another- Ứng dụng Chương trình của tôi có thể hoạt động tốt bằng cách trình bày các tệp đính kèm và cho phép người dùng kéo và thả chúng vào ứng dụng email của họ - không hoàn toàn trơn tru như thêm chúng trực tiếp, nhưng nó sẽ hoạt động. – lkessler

Trả lời

4

Dường như mailto trong một ShellExecute là không có khả năng gửi file đính kèm.

MAPI và Indy có đặc điểm không may là không nhất thiết phải chọn ứng dụng email của người dùng.

Vì vậy, khả năng khác là tiếp tục sử dụng ShellExecute, nhưng tìm cách khác để tải tệp đính kèm vào ứng dụng email.

Điều tôi quyết định làm là trên Hộp thoại tạo email, bây giờ tôi có một FileListBox liệt kê các tệp mà người dùng có thể muốn đính kèm vào email. Khi email bật lên, họ có thể chỉ cần kéo và thả chúng vào email.

Trong trường hợp của tôi, đây thực sự là một giải pháp tốt, vì điều này cho phép người dùng chọn các tệp họ muốn đưa vào. Phương pháp khác (tự động đính kèm) sẽ yêu cầu họ xóa những người mà họ không muốn đưa vào. (nghĩa là tùy chọn "Thêm thanh công cụ của Google" đã được kiểm tra cho bạn KHÔNG tốt)

Hiện tại, giải pháp này sẽ hoạt động.

Cảm ơn tất cả những người đã đóng góp câu trả lời và giúp tôi xem qua cách này (tất cả +1).

4

Tôi sử dụng hai phương pháp để gửi thư MAPI, tùy thuộc vào việc có cần phải ký kết hay không. Đối với trường hợp đơn giản không có tập tin đính kèm tôi sử dụng như sau:

function SendShellEmail(ARecipientEmail, ASubject, ABody : string) : boolean; 
// Send an email to this recipient with a subject and a body 
var 
    iResult : integer; 
    S  : string; 
begin 

If Trim(ARecipientEmail) = '' then 
    ARecipientEmail := 'mail'; 
S := 'mailto:' + ARecipientEmail; 

S := S + '?subject=' + ASubject; 

If Trim(ABody) <> '' then 
    S := S + '&body=' + ABody; 

iResult := ShellExecute(Application.Handle,'open', PChar(S), nil, nil, SW_SHOWNORMAL); 
Result := iResult > 0; 
end; 

này sử dụng một vỏ đơn giản thực hiện phương pháp, vì vậy bạn không nên có bất kỳ vấn đề thực sự không phải là những cảnh báo gần đây để có được tài khoản để xác nhận rằng họ là ok với chương trình của bạn gửi một email.

Đối với các đơn hàng, tôi sử dụng mã sau đây ban đầu được lấy từ Tạp chí Delphi của Brian Long. Cũng có thể gửi email KHÔNG sử dụng ứng dụng khách MAPI nhưng sử dụng máy chủ SMTP được chỉ định nhưng tôi nghĩ bạn rõ ràng không muốn điều này. Tôi có thể cung cấp mã cho điều này nếu bạn làm.

uses 
    SysUtils, 
    Windows, 
    Dialogs, 
    Forms, 
    MAPI; 

procedure ArtMAPISendMail(
      const Subject, MessageText, MailFromName, MailFromAddress, 
        MailToName, MailToAddress: String; 
      const AttachmentFileNames: array of String); 
//Originally by Brian Long: The Delphi Magazine issue 60 - Delphi And Email 
var 
    MAPIError: DWord; 
    MapiMessage: TMapiMessage; 
    Originator, Recipient: TMapiRecipDesc; 
    Files, FilesTmp: PMapiFileDesc; 
    FilesCount: Integer; 
begin 
    FillChar(MapiMessage, Sizeof(TMapiMessage), 0); 

    MapiMessage.lpszSubject := PAnsiChar(AnsiString(Subject)); 
    MapiMessage.lpszNoteText := PAnsiChar(AnsiString(MessageText)); 

    FillChar(Originator, Sizeof(TMapiRecipDesc), 0); 

    Originator.lpszName := PAnsiChar(AnsiString(MailFromName)); 
    Originator.lpszAddress := PAnsiChar(AnsiString(MailFromAddress)); 
// MapiMessage.lpOriginator := @Originator; 
    MapiMessage.lpOriginator := nil; 


    MapiMessage.nRecipCount := 1; 
    FillChar(Recipient, Sizeof(TMapiRecipDesc), 0); 
    Recipient.ulRecipClass := MAPI_TO; 
    Recipient.lpszName := PAnsiChar(AnsiString(MailToName)); 
    Recipient.lpszAddress := PAnsiChar(AnsiString(MailToAddress)); 
    MapiMessage.lpRecips := @Recipient; 

    MapiMessage.nFileCount := High(AttachmentFileNames) - Low(AttachmentFileNames) + 1; 
    Files := AllocMem(SizeOf(TMapiFileDesc) * MapiMessage.nFileCount); 
    MapiMessage.lpFiles := Files; 
    FilesTmp := Files; 
    for FilesCount := Low(AttachmentFileNames) to High(AttachmentFileNames) do 
    begin 
    FilesTmp.nPosition := $FFFFFFFF; 
    FilesTmp.lpszPathName := PAnsiChar(AnsiString(AttachmentFileNames[FilesCount])); 
    Inc(FilesTmp) 
    end; 

    try 
    MAPIError := MapiSendMail(
     0, 
     Application.MainForm.Handle, 
     MapiMessage, 
     MAPI_LOGON_UI {or MAPI_NEW_SESSION}, 
     0); 
    finally 
    FreeMem(Files) 
    end; 

    case MAPIError of 
    MAPI_E_AMBIGUOUS_RECIPIENT: 
     Showmessage('A recipient matched more than one of the recipient descriptor structures and MAPI_DIALOG was not set. No message was sent.'); 
    MAPI_E_ATTACHMENT_NOT_FOUND: 
     Showmessage('The specified attachment was not found; no message was sent.'); 
    MAPI_E_ATTACHMENT_OPEN_FAILURE: 
     Showmessage('The specified attachment could not be opened; no message was sent.'); 
    MAPI_E_BAD_RECIPTYPE: 
     Showmessage('The type of a recipient was not MAPI_TO, MAPI_CC, or MAPI_BCC. No message was sent.'); 
    MAPI_E_FAILURE: 
     Showmessage('One or more unspecified errors occurred; no message was sent.'); 
    MAPI_E_INSUFFICIENT_MEMORY: 
     Showmessage('There was insufficient memory to proceed. No message was sent.'); 
    MAPI_E_LOGIN_FAILURE: 
     Showmessage('There was no default logon, and the user failed to log on successfully when the logon dialog box was displayed. No message was sent.'); 
    MAPI_E_TEXT_TOO_LARGE: 
     Showmessage('The text in the message was too large to sent; the message was not sent.'); 
    MAPI_E_TOO_MANY_FILES: 
     Showmessage('There were too many file attachments; no message was sent.'); 
    MAPI_E_TOO_MANY_RECIPIENTS: 
     Showmessage('There were too many recipients; no message was sent.'); 
    MAPI_E_UNKNOWN_RECIPIENT: 
     Showmessage('A recipient did not appear in the address list; no message was sent.'); 
    MAPI_E_USER_ABORT: 
     Showmessage('The user canceled the process; no message was sent.'); 
    SUCCESS_SUCCESS: 
     Showmessage('MAPISendMail successfully sent the message.'); 
    else 
    Showmessage('MAPISendMail failed with an unknown error code.'); 
    end; 
end; 
4

Đừng phức tạp, chỉ cần sử dụng mã số JCL MAPI. Nó nằm trong đơn vị JclMapi.pas. Tôi nghĩ rằng họ cũng có ví dụ cho nó. Mã này rất mạnh mẽ và bạn có thể làm bất cứ điều gì mà MAPI cho phép bạn.

Với ShellExecute bạn không thể gửi tệp đính kèm và bạn cũng bị giới hạn 255 ký tự cho nội dung thư.

Miễn là MAPI đi, với các cửa sổ cũ, nó luôn được cài đặt (2000, XP). Nó đi kèm với Outlook Express và Outlook Express hầu như luôn được cài đặt. Với các cửa sổ mới hơn (Vista, 7) không có Outlook Express và do đó không có MAPI. Nhưng MAPI được tự động cài đặt nếu bạn cài đặt MS Outlook hoặc Mozzila Thunderbird. Vì vậy, bạn khá an toàn. Đây là MAPI cơ bản và không mở rộng MAPI. Nhưng nó bao gồm tất cả những gì bạn cần.

Bạn cũng có thể kiểm tra mã của mình (JCL) nếu MAPI được cài đặt và hành động theo từ. Tôi đã làm một điều tương tự cách đây không lâu và nó hoạt động ok. Tôi đã không tìm thấy một ứng dụng thư khách sổ phổ biến mà không hỗ trợ MAPI đơn giản. Đây là một wrapper đơn giản xung quanh đang JCL và việc sử dụng mẫu dưới đây: sử dụng

unit MAPI.SendMail; 

interface 

uses 
    SysUtils, Classes, JclMapi; 

type 
    TPrerequisites = class 
    public 
    function IsMapiAvailable: Boolean; 
    function IsClientAvailable: Boolean; 
    end; 

    TMAPISendMail = class 
    private 
    FAJclEmail: TJclEmail; 
    FShowDialog: Boolean; 
    FResolveNames: Boolean; 
    FPrerequisites: TPrerequisites; 
    // proxy property getters 
    function GetMailBody: string; 
    function GetHTMLBody: Boolean; 
    function GetMailSubject: string; 
    // proxy property setters 
    procedure SetMailBody(const Value: string); 
    procedure SetHTMLBody(const Value: Boolean); 
    procedure SetMailSubject(const Value: string); 
    protected 
    function DoSendMail: Boolean; virtual; 
    public 
    constructor Create; 
    destructor Destroy; override; 
    // properties of the wrapper class 
    property MailBody: string read GetMailBody write SetMailBody; 
    property HTMLBody: Boolean read GetHTMLBody write SetHTMLBody; 
    property ShowDialog: Boolean read FShowDialog write FShowDialog; 
    property MailSubject: string read GetMailSubject write SetMailSubject; 
    property ResolveNames: Boolean read FResolveNames write FResolveNames; 
    property Prerequisites: TPrerequisites read FPrerequisites; 
    // procedure and functions of the wrapper class 
    procedure AddRecipient(const Address: string; const Name: string = ''); 
    procedure AddAttachment(const FileName: string); 
    function SendMail: Boolean; 
    end; 

implementation 

{ TMAPISendMail } 

constructor TMAPISendMail.Create; 
begin 
    FPrerequisites := TPrerequisites.Create; 
    FAJclEmail := TJclEmail.Create; 
    FShowDialog := True; 
end; 

destructor TMAPISendMail.Destroy; 
begin 
    FreeAndNil(FAJclEmail); 
    FreeAndNil(FPrerequisites); 

    inherited; 
end; 

function TMAPISendMail.DoSendMail: Boolean; 
begin 
    Result := FAJclEmail.Send(FShowDialog); 
end; 

function TMAPISendMail.SendMail: Boolean; 
begin 
    Result := DoSendMail; 
end; 

function TMAPISendMail.GetMailBody: string; 
begin 
    Result := FAJclEmail.Body; 
end; 

procedure TMAPISendMail.SetMailBody(const Value: string); 
begin 
    FAJclEmail.Body := Value; 
end; 

procedure TMAPISendMail.AddAttachment(const FileName: string); 
begin 
    FAJclEmail.Attachments.Add(FileName); 
end; 

procedure TMAPISendMail.AddRecipient(const Address, Name: string); 
var 
    LocalName: string; 
    LocalAddress: string; 
begin 
    LocalAddress := Address; 
    LocalName := Name; 

    if FResolveNames then 
    if not FAJclEmail.ResolveName(LocalName, LocalAddress) then 
     raise Exception.Create('Could not resolve Recipient name and address!'); 

    FAJclEmail.Recipients.Add(LocalAddress, LocalName); 
end; 

function TMAPISendMail.GetMailSubject: string; 
begin 
    Result := FAJclEmail.Subject; 
end; 

procedure TMAPISendMail.SetMailSubject(const Value: string); 
begin 
    FAJclEmail.Subject := Value; 
end; 

function TMAPISendMail.GetHTMLBody: Boolean; 
begin 
    Result := FAJclEmail.HtmlBody; 
end; 

procedure TMAPISendMail.SetHTMLBody(const Value: Boolean); 
begin 
    FAJclEmail.HtmlBody := Value; 
end; 

{ TPrerequisites } 

function TPrerequisites.IsClientAvailable: Boolean; 
var 
    SimpleMAPI: TJclSimpleMapi; 
begin 
    SimpleMAPI := TJclSimpleMapi.Create; 
    try 
    Result := SimpleMAPI.AnyClientInstalled; 
    finally 
    SimpleMAPI.Free; 
    end; 
end; 

function TPrerequisites.IsMapiAvailable: Boolean; 
var 
    SimpleMAPI: TJclSimpleMapi; 
begin 
    SimpleMAPI := TJclSimpleMapi.Create; 
    try 
    Result := SimpleMAPI.SimpleMapiInstalled; 
    finally 
    SimpleMAPI.Free; 
    end; 
end; 

end. 

mẫu:

unit f_Main; 

interface 

uses 
    Windows, SysUtils, Classes, Controls, Forms, Graphics, StdCtrls, XPMan, 

    // project units 
    JclMapi, MAPI.SendMail, Dialogs; 

type 
    TfMain = class(TForm) 
    XPManifest: TXPManifest; 
    gbMailProperties: TGroupBox; 
    eMailSubject: TEdit; 
    stMailSubject: TStaticText; 
    stMailBody: TStaticText; 
    mmMailBody: TMemo; 
    cbHTMLBody: TCheckBox; 
    gbAttachments: TGroupBox; 
    gbRecipients: TGroupBox; 
    btnSendMail: TButton; 
    lbRecipients: TListBox; 
    eRecipAddress: TEdit; 
    StaticText1: TStaticText; 
    eRecipName: TEdit; 
    btnAddRecipient: TButton; 
    stRecipName: TStaticText; 
    OpenDialog: TOpenDialog; 
    lbAttachments: TListBox; 
    btnAddAttachment: TButton; 
    stMAPILabel: TStaticText; 
    stClientLabel: TStaticText; 
    stMAPIValue: TStaticText; 
    stClientValue: TStaticText; 
    procedure btnSendMailClick(Sender: TObject); 
    procedure btnAddRecipientClick(Sender: TObject); 
    procedure btnAddAttachmentClick(Sender: TObject); 
    procedure FormCreate(Sender: TObject); 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    end; 

var 
    fMain: TfMain; 

implementation 

{$R *.dfm} 

procedure TfMain.btnSendMailClick(Sender: TObject); 
var 
    I: Integer; 
    Name: string; 
    Address: string; 
    ItemStr: string; 
    Pos1, Pos2: Integer; 
    MAPISendMail: TMAPISendMail; 
begin 
    MAPISendMail := TMAPISendMail.Create; 
    try 
    for I := 0 to lbRecipients.Items.Count - 1 do 
    begin 
     ItemStr := lbRecipients.Items[I]; 
     Pos1 := Pos('[', ItemStr); 
     Pos2 := Pos(']', ItemStr); 

     Name := Trim(Copy(ItemStr, Pos1 + 1, Pos2 - Pos1 - 1)); 
     Address := Trim(Copy(ItemStr, 1, Pos1 - 1)); 
     MAPISendMail.AddRecipient(Address, Name); 
    end; 

    for I := 0 to lbAttachments.Items.Count - 1 do 
     MAPISendMail.AddAttachment(lbAttachments.Items[I]); 

    MAPISendMail.MailSubject := eMailSubject.Text; 
    MAPISendMail.HTMLBody := cbHTMLBody.Checked; 
    MAPISendMail.MailBody := mmMailBody.Text; 
    MAPISendMail.SendMail; 
    finally 
    MAPISendMail.Free; 
    end; 
end; 

procedure TfMain.btnAddRecipientClick(Sender: TObject); 
begin 
    lbRecipients.Items.Add(Format('%s [%s]', [eRecipAddress.Text, 
              eRecipName.Text])); 
end; 

procedure TfMain.btnAddAttachmentClick(Sender: TObject); 
begin 
    if OpenDialog.Execute then 
    lbAttachments.Items.Add(OpenDialog.FileName); 
end; 

procedure TfMain.FormCreate(Sender: TObject); 
var 
    ValidHost: Boolean; 
    MAPISendMail: TMAPISendMail; 
begin 
    MAPISendMail := TMAPISendMail.Create; 
    try 
    ValidHost := True; 

    if MAPISendMail.Prerequisites.IsMapiAvailable then 
    begin 
     stMAPIValue.Caption := 'Available'; 
     stMAPIValue.Font.Color := clGreen; 
    end 
    else 
    begin 
     stMAPIValue.Caption := 'Unavailable'; 
     stMAPIValue.Font.Color := clRed; 
     ValidHost := False; 
    end; 

    if MAPISendMail.Prerequisites.IsClientAvailable then 
    begin 
     stClientValue.Caption := 'Available'; 
     stClientValue.Font.Color := clGreen; 
    end 
    else 
    begin 
     stClientValue.Caption := 'Unavailable'; 
     stClientValue.Font.Color := clRed; 
     ValidHost := False; 
    end; 

    btnSendMail.Enabled := ValidHost; 
    finally 
    MAPISendMail.Free; 
    end; 
end; 

end. 
2

This article cho biết cách Delphi có thể mô phỏng lệnh trình đơn ngữ cảnh "Gửi tới ..." và mở trình khách thư mặc định có phần đính kèm theo chương trình.

Giải pháp này không cần MAPI và hoạt động với ứng dụng thư mặc định, nhưng không hoàn chỉnh, vì người nhận thư, nội dung và chủ đề sẽ không được điền tự động. (Nội dung thư có thể được sao chép bằng clipboard).

+0

Cảm ơn bạn. Đó là sự thay thế mà tôi không biết về điều đó tôi đã hy vọng một người nào đó sẽ tìm thấy tôi. – lkessler

+0

Không. Nó hoạt động trong một thời gian tải vào Windows Mail. Sau đó, không thể giải thích sau ngày hôm nay, nó bắt đầu tải vào Outlook mà không phải là chương trình thư mặc định của tôi. Đã phải lấy đi "câu trả lời được chấp nhận" của bạn. Lấy làm tiếc. – lkessler

0

Dưới đây là một bản tóm tắt về tất cả những thiết lập email và những gì họ làm:
http://thesunstroke.blogspot.de/2017/03/how-to-configure-eurekalog-to-send-bugs.html

enter image description here

Vì vậy, hãy tránh xa Shell (mailto).
Mapi cũng là một ý tưởng tồi vì nó chỉ hoạt động với các ứng dụng email MS.
Tôi đặt mặc định là MAPI đơn giản nhưng tôi hiếm khi nhận được email do kênh này gửi. Hầu hết các email được nhận qua SMTP Server.

BIG WARNING !!!!!!!!!
Tôi đã thấy rằng số lượng báo động dương tính giả từ máy quét chống vi-rút cao hơn nhiều khi bạn kích hoạt EurekaLog. Vì vậy, chỉ sử dụng EurekaLog khi thật cần thiết.
Ngoài ra, bản thân Eureka cũng bị lỗi (chỉ cần nhìn vào lịch sử phát hành và thấy rằng đối với mỗi tính năng mới (hoặc thậm chí thay đổi) chúng phát hành, sau đó chúng sẽ sửa một vài lỗi! Bản thân EurekaLog có thể giới thiệu một số ít trong EXE của bạn!

Các vấn đề liên quan