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: [email protected] [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