2015-03-23 3 views
-1

Я использовал следующую функцию для отправки почты с использованием MAPI, и она работает нормально, но теперь я хотел бы добавить параметр для отправки сообщений Cc и Bcc. и это дает мне проблемы, так как я не смог выяснить, какИспользование Cc и Bcc в Delphi MAPI

Файловые файлы не работают, но я не использую их сейчас.

function SendMailMAPI(const aFrom, aTo, aBcc, aSubject, aBody: string; aReceipt: boolean; FileNames: TStringList): boolean; 
var 
    MAPIError: DWord; 
    MapiMessage: TMapiMessage; 
    Originator: TMapiRecipDesc; 
    Recipient: TMapiRecipDesc; 
    MapiFiles: PMapiFileDesc; 
    FilesTmp: PMapiFileDesc; 
    FilesCount: Integer; 
begin 
    MAPIError := SUCCESS_SUCCESS; 
    Result := True; 
    try 
    FillChar(MapiMessage, Sizeof(TMapiMessage), 0); 
    if aReceipt then 
     MapiMessage.flFlags := MAPI_RECEIPT_REQUESTED; 
    MapiMessage.lpszSubject := PAnsiChar(AnsiString(aSubject)); 
    MapiMessage.lpszNoteText := PAnsiChar(AnsiString(aBody)); 
    FillChar(Originator, Sizeof(TMapiRecipDesc), 0); 
    Originator.lpszName := PAnsiChar(AnsiString(aFrom)); 
    Originator.lpszAddress := PAnsiChar(AnsiString(aFrom)); 
    MapiMessage.lpOriginator := nil; 
    MapiMessage.nRecipCount := 1; 
    FillChar(Recipient, Sizeof(TMapiRecipDesc), 0); 
    Recipient.ulRecipClass := MAPI_TO; 
    Recipient.lpszName := PAnsiChar(AnsiString(aTo)); 
    Recipient.lpszAddress := PAnsiChar(AnsiString(aTo)); 
    MapiMessage.lpRecips := @Recipient; 
    MapiMessage.nFileCount := FileNames.Count; 
    MapiFiles := AllocMem(SizeOf(TMapiFileDesc) * MapiMessage.nFileCount); 
    MapiMessage.lpFiles := MapiFiles; 
    FilesTmp := MapiFiles; 
    for FilesCount := 0 to FileNames.Count - 1 do 
     begin 
     FilesTmp.nPosition := $FFFFFFFF; 
     FilesTmp.lpszPathName := PAnsiChar(AnsiString(FileNames.Strings[FilesCount])); 
     Inc(FilesTmp) 
     end; 
    try 
     MAPIError := MapiSendMail(0, Application.MainForm.Handle, MapiMessage, MAPI_LOGON_UI + MAPI_DIALOG, 0); 
{or MAPI_NEW_SESSION} 
    finally 
     FreeMem(MapiFiles) 
    end; 
    except 
    on E:Exception do 
     Logfile.Error('U_Mailing.Mapi.SendMailMAPI: ' + E.Message); 
    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.'); 
    else 
     Showmessage('MAPISendMail failed with an unknown error code.'); 
    Result := False; 
    end; 
end; 
+0

Ваш TRY/наконец-то все не так. Вы рискуете передать неинициализированный указатель на FreeMem. Попробуйте/наконец легко. Поместите попытку сразу после получения ресурса. Вот и все. –

+0

Код вырезать и вставлять из Интернета - я не очень «отлаживал» его, так как он всегда работал на меня. Но я вижу вашу точку зрения. – OZ8HP

+0

Действительно? Вы просто используете случайный код, даже не утруждая себя тем, что он делает, и исправляете его недостатки. Hmm ...... –

ответ

2

Заменить Recipient.ulRecipClass := MAPI_TO с Recipient.ulRecipClass := MAPI_CC или Recipient.ulRecipClass := MAPI_BCC

+0

Я бы хотел не заменить ничего, поскольку мне может понадобиться использовать To, CC и BCC в одной и той же почте. – OZ8HP

+0

Затем вам нужно объявить Recipient как массив TMapiRecipDesc, заполнить каждый элемент и соответствующим образом установить MapiMessage.nRecipCount. –

+0

Я играл с кодом, и похоже, что он работает - но он падает, когда почта отправлена ​​(так что она не работает :-)). Я сделал небольшой образец с моим кодом и поместил его в свой Dropbox, если у кого-то должен быть момент и некоторые предложения https://dl.dropboxusercontent.com/u/65392149/Mapi_MCVE.ZIP – OZ8HP

Смежные вопросы