Seguem abaixo duas funções que eu uso aqui. Uma trabalha com MAPI (Exchange)
e a outra com SMTP porque no terminal não temos conexão com o Servidor MAPI,
daí mando E-mail via SMTP.

As duas funcionam (pelo menos aqui).

Declare na cláusula uses as seguintes units (Requer o Indy 10.0 que você
baixa completo, gratúito e com fontes lá no indy.org):

uses
  Mapi, IdMessage, IdSMTP


procedure SendSMTPMail(pName, pFrom, pTo, pCC, pCCo, pAssunto, pTexto:
pChar; aFiles: Array Of PChar);
var
  sMessage: TStrings;
  MsgSend : TIdMessage;
  SMTP : TIdSMTP;
begin
   sMessage := TStringList.Create;
   MsgSend := TIdMessage.Create(nil);
   sMessage.Add(pTexto);
   SMTP := TIdSMTP.Create(nil);
   SMTP.AuthenticationType := atNone;
   SMTP.Host := <IP do servidor MAPI ou mesmo nome dele serve>;
   SMTP.Port := <numero da porta>;
   SMTP.Connect;
   with MsgSend do
   begin
     Body.Assign(sMessage);
     From.Name := pName;
     From.Address := pFrom;
     Recipients.EMailAddresses := pTo; { To: header }
     Subject := pAssunto; { Subject: header }
     Priority := TIdMessagePriority(2); { Message Priority }
     CCList.EMailAddresses := ''; {CC}
     BccList.EMailAddresses := ''; {BBC}
     ReceiptRecipient.Text := '';
   end;
   try
     SMTP.Send(MsgSend);
   finally
      SMTP.Disconnect;
   end;
end;


Function  SendMapiMail( pTo, pCC, pCCo, pAssunto, pTexto: pChar; aFiles:
Array Of PChar ) : String;
var
  iRetorno : cardinal;
  sTo, sCC, sCCo, sAux: String;
  MapiMessage: TMapiMessage;
  pRecipiente: PMapiRecipDesc ;
  aRecipiente :array of TMapiRecipDesc ;
  aArquivoEnvio: array of  TMapiFileDesc ;
  i, iRecip, iFiles:integer;
Const
   ERRO_MAPI_AMBIGUOUS_RECIPIENT= 'O destinatário não pode ser resolvido!!';
   ERRO_MAPI_FAILURE            = 'Ocorreram erros não
especificados!'+#13+'Verifique se o Outlook Express é o sistema de mensagens
padrão.';
   ERRO_MAPI_INSUFFICIENT_MEMORY= 'Memória insuficiente!!';
   ERRO_MAPI_NOT_SUPPORTED      = 'Operação não suportada pelo sistema de
mensagens!';
begin
  iRecip := 0;
  //  Define destinatários TO
  sTo    := '';
  If Assigned( pTo ) Then
  Begin
    sAux := pTo;
    If sAux[Length(sAux)] <> ';' Then
      sAux := sAux + ';';
    While Pos( ';', sAux ) > 0 Do
    Begin
      Inc( iRecip );
      sTo := sTo + Copy( sAux, 1, Pos( ';', sAux ) );
      Delete( sAux, 1, Pos( ';', sAux ) );
    End;
  End;
  //  Define destinatários CC
  sCC    := '';
  If Assigned( pCC ) Then
  Begin
    sAux := pCC;
    If sAux[Length(sAux)] <> ';' Then
      sAux := sAux + ';';
    While Pos( ';', sAux ) > 0 Do
    Begin
      Inc( iRecip );
      sCC := sCC + Copy( sAux, 1, Pos( ';', sAux ) );
      Delete( sAux, 1, Pos( ';', sAux ) );
    End;
  End;
  //  Define destinatários CCo
  sCCo    := '';
  If Assigned( pCCo ) Then
  Begin
    sAux := pCCo;
    If sAux[Length(sAux)] <> ';' Then
      sAux := sAux + ';';
    While Pos( ';', sAux ) > 0 Do
    Begin
      Inc( iRecip );
      sCCo := sCCo + Copy( sAux, 1, Pos( ';', sAux ) );
      Delete( sAux, 1, Pos( ';', sAux ) );
    End;
  End;
  // cria  o tamanho do array de recipiente
  SetLength(aRecipiente, iRecip);
  I := 0;
  // Define recipientes TO
  While sTO <> '' Do
  Begin
    iRetorno := MAPIResolveName( 0, 0, PChar(Copy( sTo, 1, Pos(';', sTo) - 1
) ), 0, 0, pRecipiente );
    // VERIFICA  SE NÃO OCORREU ERROS
    If (iRetorno <> SUCCESS_SUCCESS) Then
    begin
       Case iRetorno Of
         MAPI_E_AMBIGUOUS_RECIPIENT: Result:= ERRO_MAPI_AMBIGUOUS_RECIPIENT;
         MAPI_E_FAILURE            : Result:= ERRO_MAPI_FAILURE            ;
         MAPI_E_INSUFFICIENT_MEMORY: Result:= ERRO_MAPI_INSUFFICIENT_MEMORY;
         MAPI_E_NOT_SUPPORTED      : Result:= ERRO_MAPI_NOT_SUPPORTED      ;
       else
         Result:= 'Erro ('+IntToStr(iRetorno)+') desconhecido !';
       end;
       Exit;
    end;
    aRecipiente[i].ulReserved   := pRecipiente.ulReserved;
    aRecipiente[i].lpszName     := pRecipiente.lpszName;
    aRecipiente[i].lpszAddress  := pRecipiente.lpszAddress;
    aRecipiente[i].ulEIDSize    := pRecipiente.ulEIDSize;
    aRecipiente[i].lpEntryID    := pRecipiente.lpEntryID;
    aRecipiente[i].ulRecipClass := MAPI_TO;
    Delete( sTO, 1, Pos( ';', sTO ) );
    Inc( I );
  End;
  // Define recipientes CC
  While sCC <> '' Do
  Begin
    iRetorno := MAPIResolveName( 0, 0, PChar( Copy( sCC, 1, Pos(';', sCC) -
1 ) ), 0, 0, pRecipiente );
    // VERIFICA  SE NÃO OCORREU ERROS
    If (iRetorno <> SUCCESS_SUCCESS) Then
    begin
       Case iRetorno Of
         MAPI_E_AMBIGUOUS_RECIPIENT: Result:= ERRO_MAPI_AMBIGUOUS_RECIPIENT;
         MAPI_E_FAILURE            : Result:= ERRO_MAPI_FAILURE            ;
         MAPI_E_INSUFFICIENT_MEMORY: Result:= ERRO_MAPI_INSUFFICIENT_MEMORY;
         MAPI_E_NOT_SUPPORTED      : Result:= ERRO_MAPI_NOT_SUPPORTED      ;
       else
         Result:= 'Erro ('+IntToStr(iRetorno)+') desconhecido !';
       end;
       Exit;
    end;
    aRecipiente[i].ulReserved   := pRecipiente.ulReserved;
    aRecipiente[i].lpszName     := pRecipiente.lpszName;
    aRecipiente[i].lpszAddress  := pRecipiente.lpszAddress;
    aRecipiente[i].ulEIDSize    := pRecipiente.ulEIDSize;
    aRecipiente[i].lpEntryID    := pRecipiente.lpEntryID;
    aRecipiente[i].ulRecipClass := MAPI_CC;
    Delete( sCC, 1, Pos( ';', sCC ) );
    Inc( I );
  End;
  // Define recipientes BCC
  While sCCo <> '' Do
  Begin
    iRetorno := MAPIResolveName( 0, 0, PChar( Copy( sCCo, 1, Pos(';', sCCo)
- 1 ) ), 0, 0, pRecipiente );
    // VERIFICA  SE NÃO OCORREU ERROS
    If (iRetorno <> SUCCESS_SUCCESS) Then
    begin
       Case iRetorno Of
         MAPI_E_AMBIGUOUS_RECIPIENT: Result:= ERRO_MAPI_AMBIGUOUS_RECIPIENT;
         MAPI_E_FAILURE            : Result:= ERRO_MAPI_FAILURE            ;
         MAPI_E_INSUFFICIENT_MEMORY: Result:= ERRO_MAPI_INSUFFICIENT_MEMORY;
         MAPI_E_NOT_SUPPORTED      : Result:= ERRO_MAPI_NOT_SUPPORTED      ;
       else
         Result:= 'Erro ('+IntToStr(iRetorno)+') desconhecido !';
       end;
       Exit;
    end;
    aRecipiente[i].ulReserved   := pRecipiente.ulReserved;
    aRecipiente[i].lpszName     := pRecipiente.lpszName;
    aRecipiente[i].lpszAddress  := pRecipiente.lpszAddress;
    aRecipiente[i].ulEIDSize    := pRecipiente.ulEIDSize;
    aRecipiente[i].lpEntryID    := pRecipiente.lpEntryID;
    aRecipiente[i].ulRecipClass := MAPI_BCC;
    Delete( sCCo, 1, Pos( ';', sCCo ) );
    Inc( I );
  End;

  iFiles := Length( aFiles );

  // cria o tamanho do array de anexos
  SetLength(aArquivoEnvio, iFiles);

  // indica os parâmetros para cada recepiente de anexos
  For I := 0 To High(aArquivoEnvio) Do
  Begin
    aArquivoEnvio[i].ulReserved   := 0;
    aArquivoEnvio[i].flFlags      := 0;
    aArquivoEnvio[i].nPosition    := 0;
    aArquivoEnvio[i].lpszPathName := aFiles[I];
    aArquivoEnvio[i].lpszFileName := Nil;
    aArquivoEnvio[i].lpFileType   := Nil;
  End;
  //  configura o MapiMessage  para ser usando pelo MapiSendMail
  With MapiMessage Do
  Begin
    ulReserved         := 0;
    lpszSubject        := pAssunto;
    lpszNoteText       := pTexto;
    lpszMessageType    := Nil;
    lpszDateReceived   := Nil;
    lpszConversationID := Nil;
    flFlags            := 0;
    lpOriginator       := Nil;
    nRecipCount        := iRecip;
    lpRecips           := @aRecipiente[0];
    nFileCount         := iFiles;
    lpFiles            := @aArquivoEnvio[0];
  end;
  // ativo o e-mail usado pelo usuário e coloca o destinatário,
Assunto,corpo do e-mail e anexos
  //  Result := MapiSendMail(0, 0, MapiMessage, MAPI_DIALOG or
MAPI_LOGON_UI or MAPI_NEW_SESSION, 0);
  //   caso você queira que não seja ativado o e-mail, apenas enviando a
mensagem use a linha abaixo no lugar da linha acima.
  iRetorno := MapiSendMail( 0, 0, MapiMessage, 0, 0 );

  If iRetorno <> 0 Then
     Result:='Erro no envio ('+IntToStr(iRetorno)+')';

  // libera a memória alocada para o Recipiente
  MAPIFreeBuffer( pRecipiente );
end;


[]s

Walter Alves Chagas Junior
Projeto e desenvolvimento de sistemas
Telemont Engenharia de telecomunicações
Belo Horizonte - MG - Brazil
[EMAIL PROTECTED]
Fone: (31) 3389-8215 Fax: (31) 3389-8200


-----Mensagem original-----
De: delphi-br@yahoogrupos.com.br [mailto:[EMAIL PROTECTED]
nome de Luciano Alves de Oliveira
Enviada em: quarta-feira, 29 de março de 2006 14:17
Para: Delphi
Assunto: [delphi-br] E-mail no Delphi


Por favor, estou precisando acrescentar a minha aplicação o envio de dados
de uma tabela por e-mail.

Tenho uma aplicação de chamados de help desk e atualmente o usuário tem que
reunir as informações, copiar e colar para outlook e para então mandar um
e-mail.

Alguém saberia me dar uma dicar sobre se a alguma maneira de enviar e-mail
via aplicação.

Grato.

Luciano



[As partes desta mensagem que não continham texto foram removidas]



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>


 
Links do Yahoo! Grupos




 




[As partes desta mensagem que não continham texto foram removidas]



-- 
<<<<< FAVOR REMOVER ESTA PARTE AO RESPONDER ESTA MENSAGEM >>>>>

<*> Para ver as mensagens antigas, acesse:
    http://br.groups.yahoo.com/group/delphi-br/messages

<*> Para falar com o moderador, envie um e-mail para:
    [EMAIL PROTECTED]
 
Links do Yahoo! Grupos

<*> Para visitar o site do seu grupo na web, acesse:
    http://br.groups.yahoo.com/group/delphi-br/

<*> Para sair deste grupo, envie um e-mail para:
    [EMAIL PROTECTED]

<*> O uso que você faz do Yahoo! Grupos está sujeito aos:
    http://br.yahoo.com/info/utos.html

 



Responder a