Thema: Delphi String zu PAnsiChar

Einzelnen Beitrag anzeigen

Berni68

Registriert seit: 9. Jan 2006
Ort: Villingen
162 Beiträge
 
Delphi XE5 Professional
 
#9

Re: String zu PAnsiChar

  Alt 21. Mär 2010, 21:18
Das hat garnichts mit Steuerzeichen zu tun, das waren lediglich Beispielstrings.
Der Hintergrung ist die Unit Mapi um eMails mit dem Standard eMail-client zu versenden.
Hat in Delphi2010 nicht mehr funktioniert.

Aber jetzt klappt's wieder; wer's gebrauchen kann:
Delphi-Quellcode:
function SendEMail(Handle:THandle; Mail:TStrings):Cardinal;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: array of TMapiFileDesc;
  i, AttachCount: Integer;
  FileName: string;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
Result:= MAPI_E_FAILURE;
  if (MapiLogon(Handle, PAnsiChar(''), PAnsiChar(''), MAPI_LOGON_UI or MAPI_NEW_SESSION, 0, @MAPI_Session) <> SUCCESS_SUCCESS)
  then
    MessageBox(Handle, PChar('Error while trying to send email'), PChar('Error'), MB_ICONERROR or MB_OK)
  else
    begin
      if Mail.Values['to']<>'then begin
        Receip.ulReserved:= 0;
        Receip.ulRecipClass:= MAPI_TO;
        Receip.lpszName:= PAnsiChar(AnsiString(Mail.Values['to']));
        Receip.lpszAddress:= PAnsiChar(AnsiString('SMTP:' + Mail.Values['to']));
        Receip.ulEIDSize:= 0;
        MapiMessage.nRecipCount:= 1;
        MapiMessage.lpRecips:= @Receip;
      end;
      if Mail.Values['subject']<>'then MapiMessage.lpszSubject:= PAnsiChar(AnsiString(Mail.Values['subject']));
      if Mail.Values['body']<>'then MapiMessage.lpszNoteText:= PAnsiChar(AnsiString(Mail.Values['body']));

      AttachCount:= 0;
      for i:= 0 to MaxInt do begin
        if Mail.Values['attachment' + IntToStr(i)] = 'then break;
        Inc(AttachCount);
      end;
      SetLength(Attachments, AttachCount);

      if AttachCount>0 then begin
        for i:=0 to AttachCount-1 do begin
          FileName:= Mail.Values['attachment' + IntToStr(i)];
          Attachments[i].ulReserved:= 0;
          Attachments[i].flFlags:= 0;
          Attachments[i].nPosition:= ULONG($FFFFFFFF);
          Attachments[i].lpszPathName:= StrNew(PAnsiChar(AnsiString(FileName)));
          Attachments[i].lpszFileName:= StrNew(PAnsiChar(AnsiString(ExtractFileName(FileName))));
          Attachments[i].lpFileType:= nil;
        end;
        MapiMessage.nFileCount := AttachCount;
        MapiMessage.lpFiles := Pointer(Attachments);
      end;

      WndList:= DisableTaskWindows(0);
      try
        Result:= MapiSendMail(MAPI_Session, Handle, MapiMessage, MAPI_DIALOG, 0);
      finally
        EnableTaskWindows(WndList);
        for i:=0 to AttachCount-1 do begin
          StrDispose(Attachments[i].lpszPathName);
          StrDispose(Attachments[i].lpszFileName);
        end;
        Finalize(Attachments);
      end;
      MapiLogOff(MAPI_Session, Handle, 0, 0);
    end;
end;
so zu verwenden:
Delphi-Quellcode:
procedure TTestForm.Mail1Click(Sender: TObject);
var
  mail: TStringList;
begin
  mail:= TStringList.Create;
  try
      mail.values['to']:= 'fifi@abc.de';
      mail.values['subject']:= 'subject';
      mail.values['body']:= 'text text text';
      mail.values['attachment0']:= 'C:\Anhang1.txt';
      mail.values['attachment1']:= 'C:\Anhang2.txt';
      mail.values['attachment2']:= 'C:\Anhang3.txt';
    SendEMail(Self.Handle, mail);
  finally
    mail.Free;
  end;
end;
Allerdings gab' hierzu mehrmals die Bemerkung, daß Mapi bereits fast tot ist.
Ich hab auch bei Indy geschaut, aber so wie ich das dort verstanden hab, geht der eMail versand
dann nicht über das Mailprogramm Thundrbird outlook etc. ist also dort nicht drin, was ich aber will.
Ausserdem dar ganze Anmeldekram
Aber wenn das auch mit Indy geht lass ich mich gerne aufklären.
Bernhard
  Mit Zitat antworten Zitat