How can a Delphi Program send an Email with Attachments via the DEFAULT E-mail Client?

前端 未结 5 870
醉梦人生
醉梦人生 2020-12-24 15:31

Within my program, I am composing an email to send using the default e-mail client software installed on a user\'s machine.

I have composed the mailto address, the

5条回答
  •  有刺的猬
    2020-12-24 16:00

    I use two methods for sending a MAPI mail, depending on whether an attatchment is needed. For the simple case with no attachment I use the following:

    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;
    

    This uses a simple shell execute method, so you should not have any real problems other than the more recent alerts to get the User to confirm that they are ok with your program sending an email.

    For attatchments I use the following code originally taken from the Delphi Magazine by Brian Long. It is also possible to send an email WITHOUT using the MAPI client but using a nominated SMTP server but I think you explicitly do not want this. I can provide code for this if you do.

    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;
    

提交回复
热议问题