Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Отправить email с аттачем


Автор: Guest 25.11.2005, 16:39
Надо сабж
smile

Автор: Snowy 25.11.2005, 17:10
mailto не поддерживает отправку аттачей.
Нужно использовать MAPI.
Код

unit Email;

interface

uses Windows, SysUtils, Classes;

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;

implementation

uses Mapi;

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  dwRet := MapiLogon(Handle,'', '', MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@MAPI_Session);
  if (dwRet <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,'Error while trying to send email','Error', MB_ICONERROR or MB_OK);
  end else begin
    FillChar(MapiMessage, SizeOf(MapiMessage), 0);
    Attachments := nil;
    FillChar(Receip, SizeOf(Receip), 0);
    if Mail.Values['to'] <> '' then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := PChar(Mail.Values['to']);
      Receip.lpszAddress := PChar('SMTP:' + Mail.Values['to']);
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;
    AttachCount := 0;
    for i1 := 0 to MaxInt do
    begin
      if Mail.Values['attachment' + IntToStr(i1)] = '' then break;
      Inc(AttachCount);
    end;
    if AttachCount > 0 then
    begin
      GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);
      for i1 := 0 to AttachCount - 1 do
      begin
        FileName := Mail.Values['attachment' + IntToStr(i1)];
        Attachments[i1].ulReserved := 0;
        Attachments[i1].flFlags := 0;
        Attachments[i1].nPosition := ULONG($FFFFFFFF);
        Attachments[i1].lpszPathName := StrNew(PChar(FileName));
        Attachments[i1].lpszFileName :=
        StrNew(PChar(ExtractFileName(FileName)));
        Attachments[i1].lpFileType := nil;
      end;
      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := @Attachments^;
    end;
    if Mail.Values['subject'] <> '' then
    MapiMessage.lpszSubject := PChar(Mail.Values['subject']);
    if Mail.Values['body'] <> '' then
    MapiMessage.lpszNoteText := PChar(Mail.Values['body']);
    try
      Result := MapiSendMail(MAPI_Session,Handle,MapiMessage, MAPI_DIALOG, 0);
    except end;
    for i1 := 0 to AttachCount - 1 do
    begin
      StrDispose(Attachments[i1].lpszPathName);
      StrDispose(Attachments[i1].lpszFileName);
    end;
    if Assigned(MapiMessage.lpszSubject) then
      StrDispose(MapiMessage.lpszSubject);
    if Assigned(MapiMessage.lpszNoteText) then
      StrDispose(MapiMessage.lpszNoteText);
    if Assigned(Receip.lpszAddress) then
      StrDispose(Receip.lpszAddress);
    if Assigned(Receip.lpszName) then
      StrDispose(Receip.lpszName);
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;

end.


Использование:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  mail: TStringList;
begin
  mail := TStringList.Create;
  try
    mail.values['to'] := '[email protected]';
    mail.values['subject'] := 'Hello';
    mail.values['body'] := 'String1'+#13#10+'String2'+#13#10+'String3';
    // или mail.values['body'] := Memo1.Text;
    mail.values['attachment0'] := 'C:\1.zip';
    mail.values['attachment1'] := 'C:\2.zip';
    sendEMail(Application.Handle, mail);
  finally
    mail.Free;
  end;
end;

Автор: Guest 25.11.2005, 22:53
Цитата(Snowy @ 25.11.2005, 17:10)
mailto не поддерживает отправку аттачей.
Нужно использовать MAPI.

thx, открывается
но при этом возникает error "invalid pointer operation" smile

Автор: Snowy 26.11.2005, 02:19
Хм. У меня открывалосьчисто.
Ошибка программы или почтовика?
Если программы, то в каком месте выпадает?
Что-нить менял, или пробовал этот вариант без изменений?

Автор: Guest 26.11.2005, 23:50
Цитата(Snowy @ 26.11.2005, 02:19)
Хм. У меня открывалосьчисто.
Ошибка программы или почтовика?
Если программы, то в каком месте выпадает?
Что-нить менял, или пробовал этот вариант без изменений?

Ничего не изменял, ошибка программы на строке
Код

sendEMail(Application.Handle, mail);

зы. Сейчас запустил ... ошибки нет.
Странно, ведь единственное, что я изменил - это вынес код в отдельный файл функций

Автор: maleziv 20.2.2012, 11:21
Цитата(Snowy @ 25.11.2005,  17:10)
mailto не поддерживает отправку аттачей.
Нужно использовать MAPI.
Код

unit Email;

interface

uses Windows, SysUtils, Classes;

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;

implementation

uses Mapi;

function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
type
  TAttachAccessArray = array [0..0] of TMapiFileDesc;
  PAttachAccessArray = ^TAttachAccessArray;
var
  MapiMessage: TMapiMessage;
  Receip: TMapiRecipDesc;
  Attachments: PAttachAccessArray;
  AttachCount: Integer;
  i1: integer;
  FileName: string;
  dwRet: Cardinal;
  MAPI_Session: Cardinal;
  WndList: Pointer;
begin
  dwRet := MapiLogon(Handle,'', '', MAPI_LOGON_UI or MAPI_NEW_SESSION,0,@MAPI_Session);
  if (dwRet <> SUCCESS_SUCCESS) then
  begin
    MessageBox(Handle,'Error while trying to send email','Error', MB_ICONERROR or MB_OK);
  end else begin
    FillChar(MapiMessage, SizeOf(MapiMessage), 0);
    Attachments := nil;
    FillChar(Receip, SizeOf(Receip), 0);
    if Mail.Values['to'] <> '' then
    begin
      Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_TO;
      Receip.lpszName := PChar(Mail.Values['to']);
      Receip.lpszAddress := PChar('SMTP:' + Mail.Values['to']);
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 1;
      MapiMessage.lpRecips := @Receip;
    end;
    AttachCount := 0;
    for i1 := 0 to MaxInt do
    begin
      if Mail.Values['attachment' + IntToStr(i1)] = '' then break;
      Inc(AttachCount);
    end;
    if AttachCount > 0 then
    begin
      GetMem(Attachments, SizeOf(TMapiFileDesc) * AttachCount);
      for i1 := 0 to AttachCount - 1 do
      begin
        FileName := Mail.Values['attachment' + IntToStr(i1)];
        Attachments[i1].ulReserved := 0;
        Attachments[i1].flFlags := 0;
        Attachments[i1].nPosition := ULONG($FFFFFFFF);
        Attachments[i1].lpszPathName := StrNew(PChar(FileName));
        Attachments[i1].lpszFileName :=
        StrNew(PChar(ExtractFileName(FileName)));
        Attachments[i1].lpFileType := nil;
      end;
      MapiMessage.nFileCount := AttachCount;
      MapiMessage.lpFiles := @Attachments^;
    end;
    if Mail.Values['subject'] <> '' then
    MapiMessage.lpszSubject := PChar(Mail.Values['subject']);
    if Mail.Values['body'] <> '' then
    MapiMessage.lpszNoteText := PChar(Mail.Values['body']);
    try
      Result := MapiSendMail(MAPI_Session,Handle,MapiMessage, MAPI_DIALOG, 0);
    except end;
    for i1 := 0 to AttachCount - 1 do
    begin
      StrDispose(Attachments[i1].lpszPathName);
      StrDispose(Attachments[i1].lpszFileName);
    end;
    if Assigned(MapiMessage.lpszSubject) then
      StrDispose(MapiMessage.lpszSubject);
    if Assigned(MapiMessage.lpszNoteText) then
      StrDispose(MapiMessage.lpszNoteText);
    if Assigned(Receip.lpszAddress) then
      StrDispose(Receip.lpszAddress);
    if Assigned(Receip.lpszName) then
      StrDispose(Receip.lpszName);
    MapiLogOff(MAPI_Session, Handle, 0, 0);
  end;
end;

end.


Использование:
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  mail: TStringList;
begin
  mail := TStringList.Create;
  try
    mail.values['to'] := '[email protected]';
    mail.values['subject'] := 'Hello';
    mail.values['body'] := 'String1'+#13#10+'String2'+#13#10+'String3';
    // или mail.values['body'] := Memo1.Text;
    mail.values['attachment0'] := 'C:\1.zip';
    mail.values['attachment1'] := 'C:\2.zip';
    sendEMail(Application.Handle, mail);
  finally
    mail.Free;
  end;
end;

Подскажите, а  как в этом коде копия письма приклепляется ?
Юзал так, но не выходит:
Код

 Receip.ulReserved := 0;
      Receip.ulRecipClass := MAPI_CC;
      Receip.lpszName := StrNew(PChar(Mail.Values['cc']));
      Receip.lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['cc']));
      Receip.ulEIDSize := 0;
      MapiMessage.nRecipCount := 2;

Автор: maleziv 21.2.2012, 10:45
Доброго времени суток уважаемые.
С прикреплением в коде программы  Копии письма разобрался.
Прошу помочь разобраться в следующем:
После запуска программы письмо остается в Microsoft Office Outlook 2003 в папке Исходящие, а не отправляется сразу заданным адресатам в программе, что не есть хорошо. Подскажите в чем может быть дело, почему письмо не отправляется  сразу, может быть дело не в коде вовсе, а в Outlook-е(в нем где покрутить)?

PS: После того как письмо отсалось в папке Исходящие, через некоторое время Outlook  делает синхронизацию(Отправка и получение) с почтовым ящиком и письмо лежавшее в папке Исходящие спокойно и без ошибок уходит само, но это не есть хорошо, так как нужна немедленная отправка программным путем.

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mapi,Clipbrd, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
    type
      TAttachAccessArray = array [0..0] of TMapiFileDesc;
      PAttachAccessArray = ^TAttachAccessArray;
    var
      MapiMessage: TMapiMessage;
      Receip: array of TMapiRecipDesc;
      dwRet: Cardinal;
      MAPI_Session: Cardinal;
      WndList: Pointer;
      Attachment: TMapiFileDesc;
    begin
      Result := 0;

dwRet := MapiLogon(Handle, '',    '', MAPI_NEW_SESSION, 0, @MAPI_Session);
      if (dwRet <> SUCCESS_SUCCESS) then
      begin

        MessageBox(Handle,
          PChar('Почтовый клиент, заданный по умолчанию, не обнаружен'),
          PChar('Ошибка'),
          MB_ICONERROR or MB_OK);
      end
      else
      begin
        FillChar(MapiMessage, SizeOf(MapiMessage), #0);
     
        FillChar(Receip, SizeOf(Receip), #0);
     
        if Mail.Values['to'] <> '' then
        begin
          SetLength(Receip, 1);
          Receip[0].ulReserved := 0;
          Receip[0].ulRecipClass := MAPI_TO;
          Receip[0].lpszName := StrNew(PChar(Mail.Values['to']));
          Receip[0].lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['to']));
          Receip[0].ulEIDSize := 0;
          if Mail.Values['cc'] <> '' then
          begin
            SetLength(Receip, 2);
            Receip[1].ulReserved := 0;
            Receip[1].ulRecipClass := MAPI_CC;
            Receip[1].lpszName := StrNew(PChar(Mail.Values['cc']));
            Receip[1].lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['cc']));
            Receip[1].ulEIDSize := 0;
            MapiMessage.nRecipCount := 2;
          end
          else
            MapiMessage.nRecipCount := 1;
            MapiMessage.lpRecips := @Receip[0];
        end;
     
        if Mail.Values['subject'] <> '' then
          MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
        if Mail.Values['body'] <> '' then
          MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));
            {
        if Mail.Values['attachment'] <> '' then
        begin
          ZeroMemory(@Attachment, SizeOf(TMapiFileDesc));
          Attachment.nPosition := DWORD(-1);
          Attachment.lpszPathName := PChar(Mail.Values['attachment']);
          Attachment.lpszFileName := PChar(ExtractFileName(Mail.Values['attachment']));
          MapiMessage.nFileCount := 1;
          MapiMessage.lpFiles := @Attachment;
        end;
           }
        WndList := DisableTaskWindows(0);
        try
    Result := MapiSendMail(MAPI_Session, Handle, MapiMessage, 0, 0);

        finally
          EnableTaskWindows(WndList);
        end;
     
        if Assigned(MapiMessage.lpszSubject) then
          StrDispose(MapiMessage.lpszSubject);
        if Assigned(MapiMessage.lpszNoteText) then
          StrDispose(MapiMessage.lpszNoteText);
        if Assigned(Receip[0].lpszAddress) then
          StrDispose(Receip[0].lpszAddress);
        if Assigned(Receip[0].lpszName) then
          StrDispose(Receip[0].lpszName);
        if Mail.Values['cc'] <> '' then
        begin
          if Assigned(Receip[1].lpszAddress) then
            StrDispose(Receip[1].lpszAddress);
          if Assigned(Receip[1].lpszName) then
            StrDispose(Receip[1].lpszName);
        end;
        MapiLogOff(MAPI_Session, Handle, 0, 0);
      end;
    end;
procedure TForm1.FormCreate(Sender: TObject);
var
  mail: TStringList;
begin
  mail := TStringList.Create;
  try

    mail.values['to'] :='[email protected]';
    mail.values['cc'] :='[email protected]';
    mail.values['subject'] := 'message';
    mail.values['body'] := ' ';
    sendEMail(Application.Handle, mail);
  finally
    mail.Free;
  end;

end;

end.


Автор: maleziv 22.2.2012, 13:40
Цитата(maleziv @ 21.2.2012,  10:45)
Доброго времени суток уважаемые.
С прикреплением в коде программы  Копии письма разобрался.
Прошу помочь разобраться в следующем:
После запуска программы письмо остается в Microsoft Office Outlook 2003 в папке Исходящие, а не отправляется сразу заданным адресатам в программе, что не есть хорошо. Подскажите в чем может быть дело, почему письмо не отправляется  сразу, может быть дело не в коде вовсе, а в Outlook-е(в нем где покрутить)?

PS: После того как письмо отсалось в папке Исходящие, через некоторое время Outlook  делает синхронизацию(Отправка и получение) с почтовым ящиком и письмо лежавшее в папке Исходящие спокойно и без ошибок уходит само, но это не есть хорошо, так как нужна немедленная отправка программным путем.

Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, mapi,Clipbrd, ComCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
 function SendEMail(Handle: THandle; Mail: TStrings): Cardinal;
    type
      TAttachAccessArray = array [0..0] of TMapiFileDesc;
      PAttachAccessArray = ^TAttachAccessArray;
    var
      MapiMessage: TMapiMessage;
      Receip: array of TMapiRecipDesc;
      dwRet: Cardinal;
      MAPI_Session: Cardinal;
      WndList: Pointer;
      Attachment: TMapiFileDesc;
    begin
      Result := 0;

dwRet := MapiLogon(Handle, '',    '', MAPI_NEW_SESSION, 0, @MAPI_Session);
      if (dwRet <> SUCCESS_SUCCESS) then
      begin

        MessageBox(Handle,
          PChar('Почтовый клиент, заданный по умолчанию, не обнаружен'),
          PChar('Ошибка'),
          MB_ICONERROR or MB_OK);
      end
      else
      begin
        FillChar(MapiMessage, SizeOf(MapiMessage), #0);
     
        FillChar(Receip, SizeOf(Receip), #0);
     
        if Mail.Values['to'] <> '' then
        begin
          SetLength(Receip, 1);
          Receip[0].ulReserved := 0;
          Receip[0].ulRecipClass := MAPI_TO;
          Receip[0].lpszName := StrNew(PChar(Mail.Values['to']));
          Receip[0].lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['to']));
          Receip[0].ulEIDSize := 0;
          if Mail.Values['cc'] <> '' then
          begin
            SetLength(Receip, 2);
            Receip[1].ulReserved := 0;
            Receip[1].ulRecipClass := MAPI_CC;
            Receip[1].lpszName := StrNew(PChar(Mail.Values['cc']));
            Receip[1].lpszAddress := StrNew(PChar('SMTP:' + Mail.Values['cc']));
            Receip[1].ulEIDSize := 0;
            MapiMessage.nRecipCount := 2;
          end
          else
            MapiMessage.nRecipCount := 1;
            MapiMessage.lpRecips := @Receip[0];
        end;
     
        if Mail.Values['subject'] <> '' then
          MapiMessage.lpszSubject := StrNew(PChar(Mail.Values['subject']));
        if Mail.Values['body'] <> '' then
          MapiMessage.lpszNoteText := StrNew(PChar(Mail.Values['body']));
            {
        if Mail.Values['attachment'] <> '' then
        begin
          ZeroMemory(@Attachment, SizeOf(TMapiFileDesc));
          Attachment.nPosition := DWORD(-1);
          Attachment.lpszPathName := PChar(Mail.Values['attachment']);
          Attachment.lpszFileName := PChar(ExtractFileName(Mail.Values['attachment']));
          MapiMessage.nFileCount := 1;
          MapiMessage.lpFiles := @Attachment;
        end;
           }
        WndList := DisableTaskWindows(0);
        try
    Result := MapiSendMail(MAPI_Session, Handle, MapiMessage, 0, 0);

        finally
          EnableTaskWindows(WndList);
        end;
     
        if Assigned(MapiMessage.lpszSubject) then
          StrDispose(MapiMessage.lpszSubject);
        if Assigned(MapiMessage.lpszNoteText) then
          StrDispose(MapiMessage.lpszNoteText);
        if Assigned(Receip[0].lpszAddress) then
          StrDispose(Receip[0].lpszAddress);
        if Assigned(Receip[0].lpszName) then
          StrDispose(Receip[0].lpszName);
        if Mail.Values['cc'] <> '' then
        begin
          if Assigned(Receip[1].lpszAddress) then
            StrDispose(Receip[1].lpszAddress);
          if Assigned(Receip[1].lpszName) then
            StrDispose(Receip[1].lpszName);
        end;
        MapiLogOff(MAPI_Session, Handle, 0, 0);
      end;
    end;
procedure TForm1.FormCreate(Sender: TObject);
var
  mail: TStringList;
begin
  mail := TStringList.Create;
  try

    mail.values['to'] :='[email protected]';
    mail.values['cc'] :='[email protected]';
    mail.values['subject'] := 'message';
    mail.values['body'] := ' ';
    sendEMail(Application.Handle, mail);
  finally
    mail.Free;
  end;

end;

end.

На этой ветке форума  есть кто живой?? smile  

Автор: Akella 15.3.2012, 13:55
Ну здесь сетевое программирование, и не вопросы по аутлук и т.д.
Попробуй задать вопрос в соответствующей теме, например по com-серверам.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)