Boa noite, leitores!
O tÃtulo do artigo parece um pouco familiar, não é? Sim, já postei um artigo referente a envio de e-mails pelo Delphi 7 em dezembro de 2013, porém, após a publicação, notei que muitas, muitas dúvidas foram postadas nos comentários e enviadas por e-mail, principalmente por desenvolvedores que utilizam as versões da famÃlia XE do Delphi com Indy. Pois bem, vamos considerar que o artigo de hoje é um “remake” daquela dica, trazendo algumas modificações e melhorias, claro, direcionadas para o Delphi XE.
Introdução
Pessoal, para o exemplo apresentado no artigo, utilizarei novamente o servidor do Gmail, no entanto, nada impede o uso de outros servidores, desde que as configurações sejam definidas corretamente (servidor SMTP, porta, tipo de autenticação e protocolos de segurança).
Dessa vez, como estamos codificando a funcionalidade no Delphi XE, trabalharemos com 5 objetos do conjunto Indy, criados em tempo de execução: TIdSMTP
, TIdMessage
, TIdText
, TIdAttachmentFile
e TIdSSLIOHandlerSocketOpenSSL
. Cada um destes objetos serão instanciados, interligados, utilizados e, após o envio, liberados da memória.
Primeiramente, é importante lembrar que as DLLs ssleay32.dll e libeay32.dll são necessárias para o envio do e-mail e devem ser copiadas para a mesma pasta onde está o executável. Muitos desenvolvedores copiam as DLLs para a pasta em que o arquivo DPROJ se encontra, já que o Delphi 7, por padrão, cria o arquivo executável na mesma pasta do projeto. Porém, as versões mais recentes do Delphi geram o executável no subdiretório \plataforma\configuração
, como, por exemplo, Win32\Debug
. É nesse diretório que as DLLs devem ser copiadas!
Antes que eu me esqueça, uma observação: existem várias versões disponÃveis dessas DLLs. Já ajudei desenvolvedores que tentaram utilizar a versão compatÃvel com o Delphi 7 em um projeto no Delphi XE e se depararam com alguns avisos de incompatibilidade. Portanto, para o Delphi XE, clique aqui para baixar a versão correta.
Codificação
Bom, mãos à obra!
Antes de iniciarmos a codificação, devemos declarar as units das classes do Indy na seção uses
do formulário:
1 2 3 |
uses IdSMTP, IdSSLOpenSSL, IdMessage, IdText, IdAttachmentFile, IdExplicitTLSClientServerBase; |
Em seguida, já podemos implementar o código de envio do e-mail (atentem-se aos comentários):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
var // variáveis e objetos necessários para o envio IdSSLIOHandlerSocket: TIdSSLIOHandlerSocketOpenSSL; IdSMTP: TIdSMTP; IdMessage: TIdMessage; IdText: TIdText; sAnexo: string; begin // instanciação dos objetos IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self); IdSMTP := TIdSMTP.Create(Self); IdMessage := TIdMessage.Create(Self); try // Configuração do protocolo SSL (TIdSSLIOHandlerSocketOpenSSL) IdSSLIOHandlerSocket.SSLOptions.Method := sslvSSLv23; IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient; // Configuração do servidor SMTP (TIdSMTP) IdSMTP.IOHandler := IdSSLIOHandlerSocket; IdSMTP.UseTLS := utUseImplicitTLS; IdSMTP.AuthType := satDefault; IdSMTP.Port := 465; IdSMTP.Host := 'smtp.gmail.com'; IdSMTP.Password := 'senha'; // Configuração da mensagem (TIdMessage) IdMessage.From.Name := 'Nome do Remetente'; IdMessage.ReplyTo.EMailAddresses := IdMessage.From.Address; IdMessage.Subject := 'Assunto do e-mail'; IdMessage.Encoding := meMIME; // Configuração do corpo do email (TIdText) IdText := TIdText.Create(IdMessage.MessageParts); IdText.Body.Add('Corpo do e-mail'); IdText.ContentType := 'text/plain; charset=iso-8859-1'; // Opcional - Anexo da mensagem (TIdAttachmentFile) sAnexo := 'C:\Anexo.pdf'; if FileExists(sAnexo) then begin TIdAttachmentFile.Create(IdMessage.MessageParts, sAnexo); end; // Conexão e autenticação try IdSMTP.Connect; IdSMTP.Authenticate; except on E:Exception do begin MessageDlg('Erro na conexão ou autenticação: ' + E.Message, mtWarning, [mbOK], 0); Exit; end; end; // Envio da mensagem try IdSMTP.Send(IdMessage); MessageDlg('Mensagem enviada com sucesso!', mtInformation, [mbOK], 0); except On E:Exception do begin MessageDlg('Erro ao enviar a mensagem: ' + E.Message, mtWarning, [mbOK], 0); end; end; finally // desconecta do servidor IdSMTP.Disconnect; // liberação da DLL UnLoadOpenSSLLibrary; // liberação dos objetos da memória FreeAndNil(IdMessage); FreeAndNil(IdSSLIOHandlerSocket); FreeAndNil(IdSMTP); end; end; |
Ao realizar o envio, haverá uma pausa de alguns segundos durante a conexão, autenticação e envio da mensagem. Nesse meio tempo, teremos a impressão de que a aplicação não estará respondendo. Para evitar este efeito, eu sugiro implementar uma tela de espera (com um GIF animado, por exemplo), exibir uma mensagem de processamento ou utilizar uma Thread para que o envio seja feito em um fluxo paralelo de processamento.
Embora as propriedades no exemplo acima tenham sido atribuÃdas em tempo de execução, elas também podem, opcionalmente, ser definidas em tempo de projeto, utilizando o Object Inspector. Se o e-mail possui valores fixos (conta de e-mail, servidor, assunto), talvez essa possa ser a melhor opção devido à redução das linhas de código. Mesmo assim, alguns valores deverão ser informados em tempo de execução, como o destinatário e o corpo da mensagem, digitados pelo usuário em caixas de texto.
Só a tÃtulo de conhecimento, caso a aplicação não esteja conseguindo se conectar ao servidor, talvez seja necessário alterar algumas configurações na conta do Gmail, conforme as orientações dispostas neste link.
Bônus 1
Para enviar um e-mail formatado em HTML, basta utilizar o objeto TIdText
no exemplo acima e inserir as tags da linguagem:
1 2 3 4 5 6 7 |
IdText := TIdText.Create(IdMessage.MessageParts); IdText.Body.Add('<html>'); IdText.Body.Add('<body>'); IdText.Body.Add('<h1><font color="red"> Teste Formatação em HTML </font></h1>'); IdText.Body.Add('</body>'); IdText.Body.Add('</html>'); IdText.ContentType := 'text/html; charset=iso-8859-1'; |
Bônus 2
Caso esteja utilizando o servidor do Terra, utilize as configurações a seguir (colaboração do leitor Ricardo Silva):
1 2 3 4 5 6 |
// Configuração do SMTP IdSMTP.AuthenticationType := atLogin; IdSMTP.Port := 587; IdSMTP.Host := 'smtp.sao.terra.com.br'; IdSMTP.Password := 'senha'; |
Bônus 3
Aproveitando a dica acima, confira também as configurações do servidor do Office365:
1 2 3 4 5 6 7 8 9 10 11 12 |
// Configuração do SSL IdSSLIOHandlerSocket.SSLOptions.Method := sslvTLSv1; IdSSLIOHandlerSocket.PassThrough := True; IdSSLIOHandlerSocket.SSLOptions.Mode := sslmServer; // Configuração do SMTP IdSMTP.IOHandler := IdSSLIOHandlerSocket; IdSMTP.AuthenticationType := atLogin; IdSMTP.Port := 587; IdSMTP.Host := 'smtp.office365.com'; IdSMTP.Username := 'usuario'; IdSMTP.Password := 'senha'; |
Grande abraço, leitores! Até mais!
Boa tarde amigo, estou programando no Delphi xe7, porem não consigo enxergar os componentes
TidText e TidAttachmentFile
Como faço para adicioná-los a palleta Indy? Pois os seus respectivos arquivos dcu e pas existem no meu computador, mas não sei como adicioná-los. No Delphi xe7 e meio complicado.ja fui inclusive no menu componente/install componente, mas me enrrolei e desisti. Vc poderia me enviar um tutorial de como adicionar estes dois componentes? Vc esta de parabéns, pois seu tutorial de como enviar email esta excelente…bem simples e bem explicativo.
Olá, Ney, tudo bem?
As classes TIdText e TIdAttachmentFile não são visuais, ou melhor, não são componentes que podem ser arrastados para o formulário. Essas classes devem ser instanciadas em tempo de execução (conforme exemplificado no artigo) devido à dependência de configuração que eles possuem com o componente TIdMessage.
Talvez seja possÃvel criar componentes para essa finalidade, mas não acho viável.
Caso você esteja se deparando com alguma dificuldade na configuração desses objetos, poste nos comentários!
Abraço!
Boa noite André.. Valeu pela dica, então era este o motivo pelo qual eu não conseguia visualizar os dois componentes…obrigado amigo. Qualquer dúvida te dou um toque.
Bom dia André…fiz tudo bonitinho no xe7, conforme vc detalhou, porem depois que tento enviar a mensagem com um arquivo em anexo, o programa além de não enviar ainda exibe a seguinte mensagem de erro: Falha na conexão ou Autenticação………Please log in via your web browser and try again. Estou tentando enviar a mensagem e abri-la em meu celular. Onde esta o erro amigo? Como consertar? De imediato agradeço sua atenção.
Fiz a seguinte alteração no código e deu certo
Olá, Edinaldo!
Obrigado pela colaboração!
O tempo de timeout deve ser definido conforme o perfil de rede/infraestrutura do cliente. Por exemplo, se o cliente utilizar um sistema robusto de Firewall, talvez o tempo de timeout tenha que ser maior para abrir a conexão. No seu caso, 1,5 minuto foi o suficiente.
Opcionalmente, o desenvolvedor pode permitir que o próprio usuário define o tempo de timeout para evitar que o tempo fique fixo no código.
Abraço!
Bom dia, André. Parabéns pelo artigo. Você sabe informar como se faz para enviar e-mail com uma imagem no corpo do e-mail, não é anexar a imagem ao e-mail. É inserir a imagem que esta na pasta “C:\Users\Publico\Pictures” e inserir no corpo do e-mail. Obrigado.
Olá, Otto, tudo bem?
Desculpe-me pela demora para responder. Estive de mudança e fiquei um tempo sem internet.
Não é possÃvel anexar um imagem que está no seu computador no corpo do e-mail, afinal, essa mesma imagem não estará no computador do destinatário.
Para enviar uma imagem no corpo de uma mensagem, é necessário trabalhar com HTML e, além disso, a imagem deve estar armazenada em algum servidor de imagens na Web (Photobucket, ImageShack, FileDen, etc).
Vou enviar um e-mail para você com um exemplo, ok?
Qualquer dúvida, estou à disposição!
Abraço!
André eu vou começar a fazer uma aplicação simples com sql server 2008 usando o Delphi xe5. Queria tirar uma dúvida. Existe alguma função que, por exemplo, quando dois ou mais usuários do sistema tentem gravar no mesmo milésimo de segundo, deixe o sistema em espera aguardando até que o banco de dados consiga armazenar um das informações? Seria como se o sistema deixasse na fila de espera por alguns segundos para não correr risco de duplicidade nos registros quando mais de um usuário estiver gravando ao mesmo tempo um determinado registro?
Desde já agradeço sua atenção!
Olá, Arlindo, tudo bem?
Sua pergunta é bastante interessante! Bom, acredito que você está se referindo à chave primária da tabela, na qual não pode se repetir, certo?
Essa é uma questão que é tratada de diferentes formas. Uma delas é por meio de Triggers no banco de dados. Este é um recurso que funciona como um “gatilho” quando determinado evento acontece em uma tabela, como, por exemplo, a inserção de um novo registro (On Before Insert). Sendo assim, pode-se criar uma Trigger para gerar um novo código antes que o registro seja inserido. Mesmo que dois usuários gravem registros no mesmo milésimo de segundo, o banco de dados irá analisar as transações e disparar essa Trigger para cada um deles em instantes distintos.
Bom, há também uma forma de controlar essa concorrência pela aplicação. Porém, antes de explicá-la, vale fazer uma observação. Muitos desenvolvedores cometem o erro de gerar o novo valor da chave primária (código do cliente, por exemplo), durante a inserção do novo registro. Logo, se dois usuários iniciarem a inserção de dois registros ao mesmo tempo, o mesmo código será gerado, causando a violação de chave primária.
A minha recomendação é atribuir o valor da chave primária antes da gravação do registro, ou seja, ao persistir os dados no banco (com o Post e ApplyUpdates). Para isso, consulte o último código da tabela e some mais 1, atribuindo-o imediatamente ao campo do DataSet. Caso dois usuários insiram dois registros simultaneamente, a possibilidade de duplicidade será bastante reduzida.
Espero que essa explicação lhe ajude, amigo!
Abraço!
Andre,
Fazer um executavel “X” com indy para enviar email,..inclusive com arq. anexo é fácil demais….
Acontece que preciso fazer um servidor de email em delphi,….
até aà tudo OK ! Usei o demo do indy ( SMTPServer)…e ele recebe na minha mesma maquina os dados
que mandei o executável “X”…( from, to, subject..body)
Problemas :
– Como nesse demo eu obtenho os arquivos que foram anexados e como faço para enviar tudo para um email externo.. usando o meu excutável X e o demo ( server) ?
Olá, Ricardo, tudo certo?
Infelizmente ainda não tive a oportunidade de explorar o demo SMTPServer que acompanha o Indy, então não sou a melhor pessoa para lhe ajudar.
A sua necessidade é criar um servidor de e-mail para funcionar em uma rede local?
Muitos optam por subir um servidor de e-mail já pronto e utilizar as configurações de POP e SMTP no Delphi com o Indy. Em muitos dos casos, essa é a melhor opção.
Abraço!
Olá. Segui seu codigo a risca no Delphi XE7, porém na hora de enviar da erro.
Error Connectin With SSL
Já deixei as 2 dlls no diretorio do Exe e mesmo assim não funcionou. Sabe me dizer o que poderia estar acontecendo?
Olá, Renan, tudo bem?
Vou entrar em contato com você por e-mail, ok?
Abraço!
Olá André,
Ótimo post!
Gostaria se possÃvel saber de você se essa função funciona com @hotmail.com.
Estou tento problemas com outra função que tenho, só consigo mandar para gmail.
Obrigado
Olá, Eduardo, tudo bem?
Obrigado pelo feedback!
Para enviar mensagens com uma conta do Hotmail, basta configurar o TIdSMTP da seguinte forma:
E não esqueça também de mudar o endereço de remetente no componente TIdMessage:
Espero ter ajudado, amigo!
Abraço!
Bom dia, Andre!
Fiz na minha aplicação conforme o arquivo, porem ele envia o primeiro email se eu fechar a tela e abrir novamente e tentar enviar ele da a seguinte mensagem:
Project sistema.exe raised exception class EIdOSSLCreatingContextError with message ‘Error creating SSL context’; – Estou usando delphi XE5 e a versao do indy é 10.6.0.504 o estranho que se eu fechar o sistema todo e abrir ele manda o primeiro email ja na segunda fez nao envia percebi tambem que só esta acontecendo com o gmail se eu tentar utilizar outro provedor da certo .
Boa noite, fiz conforme o artigo porem na primeira fez ele envia o e-mail se eu fechar o form ( tela ) e abrir novamente para mandar o e-mail ele da a seguinte mensagem de erro:
Erro na conexão ou autenticação: Error creating SSL context. estou utilizando o delphi XE5 com o indy na versao 10.6.0.504.
Olá, Emerson!
Obrigado pelo comentário! Aparentemente, a mensagem “Error creating SSL context” ocorre porque é preciso liberar a DLL após o envio da mensagem.
Experimente o seguinte procedimento: declare a unit IdSSLOpenSSL na uses do formulário:
Em seguida, após o envio do e-mail, inclua a seguinte instrução (recomendo colocá-la no Finally):
Se o erro persistir, deixe novamente um comentário!
Abraço!
Ola André!
Deu certo problema resolvido, era só liberar a DLL apos o envio, muito obrigado pela ajuda.
Opa, Emerson, que bom!
Atualizei o artigo e coloquei essas instruções para deixá-lo mais completo! 🙂
Abraço!
Bom dia Andre, tudo bem?
Olha só. Seu código é ótimo, obrigado por ter postado. Estou usando ele no Delphi Seattle e roda tranquilo.
Montei até um form de configuração onde cadastro username, password, remetente entre outros. Gostaria de adicionar 2 configurações extras, mas não consegui.
A ideia é colocar um checkbox para “Meu servidor requer autenticação” e outro checkbox para “Conexão SSL”
Poderia me ajudar?
Olá, Renan, tudo certo?
Bom, vamos lá! Para codificar a opção de autenticação no servidor, controle a propriedade AuthType:
A respeito da conexão SSL, Renan, eu ainda não testei, mas acredito que, se o objeto TIdSSLIOHandlerSocketOpenSSL não for vinculado ao TIdSMTP, a conexão SSL é ignorada. Portanto, provavelmente ficaria dessa forma:
Abraço!
Obrigado pelo retorno Andre. Na segunda-feira vou por em pratica.
Sobre o SSL via checkbox acho que preciso ignorar essas 3 linhas, pois foi assim que consegui rodar o código.
O problema é que não estou encontrando uma forma adequada de configurar, mas assim que conseguir volto aqui pra comentar.
Certo, Renan!
Se houver qualquer dúvida, volte a comentar!
Bom dia André. Testes realizados e tudo funcionando. Modifiquei um pouco a ordem para que rodasse e ficou assim:
Legal, Renan!
Obrigado pela contribuição e também por dedicar o seu tempo para retornar e publicar o comentário!
Certamente irá ajudar outros leitores.
Grande abraço!
Amigo parabéns pelo código e a forma como você explica, uma pequena observação depois que fui testá lo, vi que estava dando um pequeno erro quando finalizava, debuguei e vi que o objeto IdSMTP não estava sendo destruÃdo porque teria de desconectar antes do FINALLY colocando a instrução ( IdSMTP.Disconnect(); ) antes, ai funcionou beleza. Nome do erro que apresentava “Access de Violation # read 0x00000000” , obrigado e valeu pelo seu excelente trabalho.
Olá, Bifanio, tudo certo?
Opa, muito obrigado pela dica! Vou editar o artigo e colocar essa instrução, conforme você indicou, para que outros leitores não tenham o mesmo problema.
Grande abraço!
Muchas gracias por la colaboración, muy bien explicado todo. Funcionó perfecto. Gracias.
Gracias por sus comentarios, Jorge!
Estoy feliz de haber ayudado! 🙂
Boa noite André!
Excelente código e melhor ainda a didática.
Meu provedor é o Terra, e estou conseguindo mandar e-mails para os [email protected], mas quando tento mandar para os @gmail e @hotmail e até os @cliente.com.br, o e-mail não vai. Aparece a mensagem de ‘enviado’ mas não chega lá.
Eu vi lá em cima as orientações para o provedor Terra, mas por mais que eu tente, só consigo mandar para o próprio Terra.
Será que estou fazendo algo errado?
Muito obrigado.
Boa noite, Marco, tudo certo?
Você deu uma olhada na caixa de spams ou lixo eletrônico dos destinatários @gmail e @hotmail?
Dependendo do conteúdo da mensagem, estes servidores a encaminham para essas pastas.
Abraço!
Oi André, obrigado por responder.
Eu olhei lá, os destinatários gmail e hotmail, são minha próprias caixas postais e não tem spams, mas o mais importante são os @cliente.com.br.
Ontem, depois de eu ter desistido eu lembrei de um outro programa de envio de e-mails que eu tinha desenvolvido lá em casa usando Delphi 7, e mandei e-mails para meus hotmail e gmail e chegaram bem, inclusive com os anexos.
Eu estou usando agora o XE7, e tentei o seguinte: Abri o programa com problema de envio, e dentro dele, no ambiente de desenvolvimento, abri a UEmail.Pas do outro em Delphi 7, copiei o idSMTP e colei no XE7, já com as configurações de lá, onde estava funcionando. Só que deu a mesma coisa, mandou para o Terra e não mandou para os hotmail/gmail.
Agradeço a atenção.
Entendi, Marco.
Vou entrar em contato com você por e-mail, ok?
Abraço!
Funcionou!!! O erro era o seguinte:
Meu provedor sempre foi o Terra, e o e-mail: [email protected]. Neste caso o Username: usuario
Só que ao cadastrar o domÃnio (hospedado no Terra), o email passou a ser:
[email protected] e o Username mudou para: [email protected] mas eu estava usando o username antigo, e como eu testava mandando e-mail para mim, achava que estava tudo ok. Mas quando comecei a mandar e-mails para os clientes, descobri que tinha algo errado.
Acho que este Delphi XE poderia dar mais mensagens de erro.
Obrigado por tudo, e desculpe-me pelo transtorno!!
Obs: te enviei um e-mail pelo sistema funcionando.
Boa noite, Marco!
Recebi o e-mail. Está funcionando mesmo!
Muito obrigado por dedicar um tempo para retornar ao blog e postar a solução! Talvez poderá ajudar outros usuários do Terra! 🙂
Grande abraço!
Eu que agradeço André.
Lá em cima você deu uma boa ideia de colocar um gif animado ou uma Thread, enquanto algum processamento demorado está em execução.
Muita gente, como eu, está com este problema do gif congelar durante o processamento, e parece que para escrever Threads, tem que ter um pequeno curso Doutorado em Ciência da Computação.
Olá, Marco!
Opa, curso de Doutorado e Mestre! kkkkkkk
Brincadeira. A princÃpio, a utilização de Threads pode parecer um pouco complexa, mas acaba se tornando descomplicada.
Clique neste link e baixe um exemplo de Threads aqui do blog. Talvez poderá servir como uma orientação inicial. 🙂
Abraço!
Muito obrigado.
Funcionou perfeitamente.
Opa, eu que agradeço pela visita, Carlos!
Abraço!
Hola Andrè,
Gracias a gente como tu, publicando ejemplos y conocimientos, muchas veces solucionamos nuestros problemas. Me ha servido perfectamente.
Muito obrigado.
Hola, Juan, ¿cómo estás?
Gracias por el comentario!
Me alegra saber que el artÃculo te ha ayudado!
Mi objetivo es sólo eso: compartir el conocimiento! 🙂
Abrazo!
Olá Andre tudo bom? bom obrigado por posta o código! estou fazendo um envio smtp em massa! para marketing,
e gostaria de sabe como configura seu código para usar servido smtp próprio como smtp.empresa.com
Olá, Júnior, tudo bem?
Toda a configuração de SMTP é feita nas seguintes linhas:
Basta substituir os valores, preenchendo-os com a configuração do seu servidor.
Abraço!
Obrigado andre vou testar! eu fiz a pergunta pq notei que muda de um servidor smtp para outro! como o Gmail, terra e hotmail!
Olá Bom Dia.
Estava usando esta rotina de envio e até então não estava tendo problemas com ela utilizando um E-mail de domÃnio próprio(hospedagem hostgator) e pelo Gmail.
Porém fui utilizar de um DomÃnio hospedado no UOL no qual requer autenticação e não importa o que eu coloque nas configurações a mensagem que retorna é
‘SSL23_GET_SERVER_HELLO:unknown protocol’
Teria ideia do que pode estar ocorrendo ?
Obrigado pela atenção.
Meu Código
Olá, Denis, tudo bem?
Nunca recebi essa mensagem. Vou entrar em contato com você para tentar ajudá-lo!
Abraço!
Bom Dia A todos… Referente ao meu problema o André entrou em contato comigo por E-mail e conseguiu sanar o problema.
Segue abaixo a solução para quem passar pela mesma situação.
Para os E-mails que utilizam a porta 465
eu estava utilizando o código da seguinte maneira.
Código que funcionava perfeitamente, a partir do momento que precisei utilizar a porta 587 a figura mudou e ai que estava o problema, eu fazia as mudanças nos parâmetros e mesmo assim não dava certo pois a solução estava em remove-los, ficando então apenas o código abaixo.
Muito Obrigado André pela pronta ajuda, fantástico ver a atenção que da aos usuários do blog sem exigir nada em troca.
Sucesso pra você.
Que bom que funcionou, Denis!
Muito obrigado por dedicar um tempo para retornar ao blog e publicar a solução!
Com certeza poderá ajudar outros desenvolvedores.
Grande abraço!
Boa noite andré, parabens pela iniciativa e ótima explicação. Não estou conseguindo mostrar alguma mensagem pro cliente de espera, para que ele não tenha a sensação de programa travado. Baixei seu exemplo, mas sinceramente peço desculpas, mas não entendi como aplicá-lo.
Agradeço a paciencia
forte abraço
Olá, Rodrigo, tudo bem?
A implementação de uma tela de espera não consta neste artigo, já que fugiria um pouco do tema.
Mesmo assim, vou tentar elaborar um exemplo para te apresentar, ok?
Obrigado! Abraço!
Bom dia André, estou usando o Delphi xe2 para criar esse soft, e estou com um problema na visualização do meu Html enviado, ou invés de de mostrar a mensagem montada, ele mostra o Código Html, tenho no meu sistema uma classe para criar meus Html, mais não consigo visualizar como era pra ser, se alguém poder me ajudar agradeço muito a todos.
Olá, João Rufino, tudo bem?
Para que o conteúdo HTML seja reconhecido na mensagem, é necessário adicionar a seguinte instrução:
Abraço!
Obrigado Andre, tudo certo agora, na verdade já tinha esta linha no meu código só com uma diferença, o meu estava assim:
O seu está assim:
Agradeço a todos.
Que bom que deu certo, João!
Obrigado por retornar ao blog. Abraço!
Bom dia, André.
Muito massa seu post sobre o envio de email, simples e direto. Gostaria que você me ajudasse se possÃvel, tentei exatamente como o exemplo no post (usando gmail, com usuário e senha válido) apresenta: Connection Closed Gracefully, se mudo para porta 587 que requer o protocolo TLS, apresenta erro na versão SSL mesmo testado com todas as versões que o componente dispõe.
Obrigado.
Olá, Jorge, tudo bem?
Em primeiro lugar, obrigado pelo comentário no blog!
Acredito que esse erro esteja relacionado com segurança. A princÃpio, eu diria para você desabilitar o Firewall/Antivirus e testar novamente.
Há também uma opção do Gmail chamada “Less secure apps” que, em alguns casos, deve ser habilitada para que o envio funcione, mas, atenção: use essa opção conscientemente.
Abraço!
Boa Tarde..
Não estou conseguindo enviar email pelo hotmail. Retorna sempre o erro 140770FC:SSL Routines: ssl23_GET_SERVER_HELLO: Unknown Protocol.
Estou definindo a seguinte configuração:
Estou utilizando Delphi Seattle..
Se possivel, envie um codigo funcional para que eu possa compara-lo.
Grato
Olá, Daniel!
Esse erro refere-se ao protocolo SSL. Provavelmente a configuração está incorreta nas seguintes linhas:
Infelizmente não tenho conhecimento da configuração válida do domÃnio live.com, mas, mesmo assim, experimente trocar o valor da propriedade “Method”.
Em um dos comentários, um desenvolvedor chamado Denis teve o mesmo problema e conseguiu solucionar removendo as linhas do SSL, mas era um servidor diferente do live. Acho que não será a mesma solução.
Abraço!
Olá Boa Tarde.
Segue abaixo a forma funcional para configurar envio a partir de conta Hotmail.
Ah, um detalhe: para utilizar o maException, deve-se declarar a unit IdGlobal.
Muito obrigado pela contribuição, Denis!
O seu código ajudará muitos desenvolvedores, sem dúvidas!
Grande abraço!
André, muito obrigado por pelo tutorial. Fiz o teste com Delphi XE3 e funcionou muito bem, mas tive que alterar a propriedade do gmail (conta que envia) Less secure apps. Não há outra alternativa, não gostaria de sugerir ao cliente que deixe sua conta de email vulnerável.
Mas que funciona bem funciona. muito obrigado
Olá, Rogério, tudo certo?
Infelizmente a opção “Less secure apps” deve ser ajustada na conta do Gmail para que o código funcione. Trata-se de uma medida de segurança imposta pelo servidor já há algum tempo para evitar que aplicativos de terceiros façam operações sem autorização do usuário.
Caso o cliente apresente objeções com a alteração dessa propriedade, uma alternativa é utilizar outro servidor de e-mail, como Yahoo, Hotmail, etc.
Obrigado pelo comentário! Abraço!
Boa tarde André, usando como base a sua rotina de email, desenvolvi a minha. Consegui enviar email para os provedores gmail, terra, yahoo, email proprio da empresa e todos sairam a imagem no corpo do email. Porém não estou conseguindo receber a imagem no corpo do email nos provedores do outlook e hotmail. Será que tem alguma configuração a mais para inserir para funcionar nesses provedores?
Abraço
Olá, Marcos, tudo bem?
Como funciona nos outros provedores, acredito que seja uma restrição de segurança do Hotmail/Outlook. Envie a parte do código da imagem para “[email protected]”. Vou dar uma olhada!
Abraço!
Bom dia André, montei a seguinte função de envio de email com imagem no corpo do email. Espero que ajude.
Olá, Marcos! Muito obrigado pela colaboração.
Embora eu tenho identificado alguns pontos de inconsistência no código, parece ser funcional.
Com certeza irá ajudar outros leitores!
Abraço!
Olá,
Gostaria de alguma dica se alguém puder me ajudar, possuo uma pequena aplicação em delphi 2010, então estou tentando migrar ela para delphi seattle 10, nessa aplicação tenho 2 formulários para envio de email com o indy, porém na hora de migrar não consigo compilar como se os componentes do indy não estivessem mais instalados, verifiquei esta tudo ok, olho visualmente todos estão, exclui-os e coloquei novamente e o erro persiste. Não sei mais como resolver.
Msg de erro:
[dcc32 Fatal Error] EmailC.pas(9): F2063 Could not compile used unit ‘IdMessageClient.pas’
O problema não da só com o IdMessageClient acontece com todos os uses que o delphi coloca automaticamente quando uso o indy que são esses ( IdMessageClient, IdSMTPBase, IdSMTP, IdBaseComponent, IdMessage, IdComponent, IdTCPConnection, IdTCPClient, IdExplicitTLSClientServerBase)
Será que tem alguma dica ?
Se abro a aplicação no delphi 2010 funciona corretamente. Muito estranho.
Obrigado
abraço
Olá, Martins!
Infelizmente ainda não tive a oportunidade de trabalhar com o Delphi Seattle. Elaborei o exemplo do artigo apenas utilizando a famÃlia XE do Delphi.
Pela descrição do erro, talvez a versão Seattle tenha uma estrutura diferente dos componentes Indy.
Só uma dúvida, Martins. Antes do “Fatal Error”, tem mais alguma linha na saÃda do compilador? Normalmente a linha anterior informa qual é o problema.
Abraço!
Olá, André.
Então, não tem erro nenhum, só esse é como se o componente não estivesse instalado, sabe? como a biblioteca estivesse indisponÃvel. muito estranho, não é erro de sintaxe de alteração de funcionalidade.
Por isso estou pedindo opiniões.
obrigado
abraço
Entendi, Martins.
Assim que possÃvel, vou instalar o Seattle e tentar fazer um teste com ele.
Abraço!
Fiz o programa para emviar e-mail com anexo. Meu problema é que quando abro o OpenDialog para encontar o arquivo desejado, tudo certo. Consigo enviar o e-mail. Acontece que depois de enviar, o programa no geral, abre fotos, txt, etc… e o programa não volta para a pasta de instalação do executável onde estão as fotos, etc… Como faria para depois de enviar o arquivo, via e-mail, o programa voltar ao diretório inicial.
Se poder me ajudar, agradeço bastante.
Forte abraço
Olá, MaurÃcio, tudo bem?
O OpenDialog possui uma propriedade chamada InitialDir, que controla o diretório inicial que será exibido ao executá-lo.
Portanto, basta utilizá-lo para voltar para a pasta que você deseja, por exemplo:
Abraço!
olá André, tentei implementar o envio do e-mail HTML com anexo em pdf porem não obtive sucesso, poderia me ajudar:
Quando insiro o codigo do anexo ele deixa o html todo bagunçado
Olá, Douglas, tudo bem?
Vou entrar em contato com você por e-mail. Lembro-me de ter resolvido este problema para outro leitor, mas não recordo da solução.
Abraço!
Qual foi a solução para o problema?
Estou passando pela mesma situação
Olá, Pablo!
Eu enviei um exemplo para o Douglas que talvez possa ajudá-lo.
Vou encaminhar no seu e-mail, ok?
Obrigado pela visita!
André, tentei enviar emails com o SMTP do Gmail que você postou, mas sempre gera uma mensagem de erro. No SMTP do Yahoo funciona bem.
Você pode dizer onde está a falha no código para o Gmail?
Olá, Edinaldo!
Envie a mensagem de erro para “[email protected]”. Vou analisá-la.
Abraço!
Boa tarde Andre, estou com exemplo aqui que eu consigo enviar para Gmail, Bol, Hotmail, mais para o yahoo não estou conseguindo, da um erro de “connect timed out” já vi alguns exemplo falando que deram certo, mais tive analisando que o SMTP: smpt.mail.yahoo.com.br terminando com o “.br” que esta dando certo, mais agora para os novos email yahoo não tem mais “.br” [email protected]. Alguem tem alguma dicas desse de já agradeço em nome de todos que estam na mesma que eu.
Olá, João, tudo bem?
Infelizmente não tenho uma conta no Yahoo para fazer o teste, mas acredito que possa ser a configuração da porta, que deve ser a 465.
Veja se o artigo abaixo pode lhe ajudar:
http://email.about.com/od/accessingyahoomail/f/Yahoo_Mail_SMTP_Settings.htm
Abraço!
Boa tarde voltei para disponibilizar minha solução Para o envio do Yahoo ficou assim
SMTP: smtp.mail.yahoo.com
USUARIO: [email protected] (com “br” no final do email)
E isso espero ajudar. André muito Obrigado e ate a próxima.
Opa, muito obrigado pela contribuição, João!
O seu comentário vai ajudar muitos programadores! 🙂
Abraço!
André, parabéns pelo post.
Me ajudou a implementar o envio de e-mail na aplicação do meu cliente.
Já adicionei seu site nos favoritos pois já vi que vou encontrar muita coisa interessante aqui.
Obrigado.
Olá, Edison!
Opa, fico feliz que o artigo tenha lhe ajudado! 🙂
Obrigado por adicionar o site nos seus favoritos. Aguardo as suas visitas!
Abraço!
Boa Tarde André,
Parabéns pelos post, muito bom e esclarecedor, que voce continue nessa bela trajetória que DEUS te honrou.
Bom eu fiz funcionar no Embarcadero® RAD Studio 10 Seattle.
Passos que eu fiz para funcionamento pelo GMAIL:
1 – Habilitar na sua conta do GMAIL, as opções de usar IMAP e POP
https://support.google.com/mail/troubleshooter/1668960?hl=pt-BR
2 – baixar as DLL’s que você informou no diretório da sua aplicação.
https://www.andrecelestino.com/wp-content/files/DLLs-SSL-DelphiXE.rar
3 – Usei seu código e inclui a chamada do método “LoadOpenSSLLibrary”
Dai foi só alegria 🙂
Boa noite, Renato!
Opa, agradeço pelo elogio! 🙂
Muito obrigado pela colaboração, Renato.
Em qual linha você incluiu a chamada do “LoadOpenSSLLibrary”? Achei essa informação importante!
Abraço!
Bom dia,
Primeira linha do método, logo após o primeiro begin.
Esqueci de mencionar, eu troquei o protocolo SSL, de “sslvSSLv23” para “sslvSSLv3”
abrcs
Legal, Renato! 🙂
Vou editar o artigo e adicionar essa informação!
Agradeço novamente pela contribuição.
Abraço!
Boa noite André, estou tentando implementar mas está dando o seguinte erro:
Erro na conexão ou autenticação: Error connectiong witj SSL.
error:140770fc:ssl
routines:SSL23_GET_SERVER_HELLO:inknown protocol
Olá, Jonathas, tudo bem?
Pelo erro, parece ser uma configuração incorreta do servidor SMTP.
Qual servidor de e-mail você está utilizando?
André, bom dia, até que enfim achei um cara que conhece, bela orientação, André.
Tenho o Delphi 2010 e o Indy não aceita no Uses, poderia me orientar como resolvê-lo.
Obs. O Indy está marcado lá na pasta de packages.
Olá, Claudiney, tudo certo?
Vou entrar em contato com você para solucionar o problema.
Abraço!
André, bom dia, resolvido o item anterior, obrigado.
Tem uma dúvida, pode ajudar? como converter o conteúdo do Messageparts. por exemplo: lMsg.MessageParts.Items[j] em string ou texto para manipular ou armazenar?
Olá, Claudiney.
Não compreendi muito bem a sua dúvida.
Vou entrar em contato, ok?
Abraço!
Como ler “multi-part mesage in MIME format”
André tudo bem?
Muito bom seu artigo.
Mas como eu faria para enviar o PDF no corpo da mensagem poderia me ajudar?
Boa tarde, Ricardo!
Para anexar um arquivo, você pode utilizar o TIdAttachmentFile. Por exemplo:
Abraço!
Boa tarde
parabéns pela matéria muito bom.
Estou tentando usar o Envio de Email com Thread mais a tela continua congelado quanto amando o Email, seria possÃvel vc dar uma explanação sobre este assunto?
Se o demo do Thread que tem aqui no site mais não esta funcionando.
Olá, Paulinho!
Vou entrar em contato com você para ajudá-lo.
Abraço!
Boa noite André!
Ótimo artigo, mas estou muito confuso com a thread. Baixei o exemplo seu, mas não consegui encaixar no meu código… Na verdade não sei o que jogo na thread, se é a função de enviar e-mail ou atualizar a progressbar…
Poderia me ajudar?
Olá, Gabriel!
A rotina de envio de e-mail que deve ficar na Thread. Basta mover todo o código apresentando nesse artigo para o método “Execute” da Thread. Na aplicação cliente, instancie a Thread e chame o método Resume (ou Start, nas versões mais recentes do Delphi).
Abraço!
André, boa noite.
Primeiramente obrigado pela resposta. Mas no caso estou utilizando um dataset pra pegar os endereços de email do database, ao mover o código pra thread eu não consigo localizar o dataset contido no outro form (já coloquei ele em uses). Alguma sugestão?
Abraço.
Olá, Gabriel.
Neste caso, você pode criar uma property do tipo TStringList na classe da Thread para receber os endereços de e-mail da tela. Por exemplo:
A chamada da Thread seria da seguinte forma:
Uma vez que os e-mails estiverem na classe da Thread, basta adicioná-los na propriedade Recipients do componente TIdMessage.
Olá eu consegui usando o gmail mas, no outlook da este erro
Erro na conexão ou atenticação: Error connecting
with SSL.
erro:140770FC:SSL
routinesSSL23_GET_SERVER-HELLO:unknown protocol
veja meu codigo:
Olá, Daiane. Vi que você já enviou um e-mail com essa dúvida. Vou responder por lá, ok?
Até mais.
André, Bom Dia.
Acredito que você esteja bastante familiarizado com esses componentes, por isso da minha pergunta.
Desenvolvi uma rotina de envio de e-mail, para que possa encaminhar documentos que possuo digitalizados salvos em meu banco de dados SQL Server. Até ai tudo bem, o programa conecta, envia, sem problema algum, entretanto sinto que seria importante deixar o usuário consciente do progresso do envio, por tratarem-se de documentos os arquivos anexados geram grandes mensagens, com 5, 6 ou até mais MB e consequentemente demoram para serem enviados, conhece alguma propriedade ou método que retorne o progresso do envio?? que pudesse ser lido recorrentemente e apresentado ao usuário?
Grato desde já.
Olá, Eudardo, como vai?
Em primeiro lugar, obrigado pelo comentário no blog. É uma ótima pergunta!
O componente TIdSMTP traz um evento chamado OnWork que nos permite trabalhar com os dados que são processados durante o envio do e-mail através do parâmetro AWorkCount. Não tive tempo de testar, mas encontrei um trecho de código de um membro do ActiveDelphi que fez a seguinte codificação neste evento utilizando uma TProgressBar:
Espero que lhe ajude! Abraço!
Andre,
Bom Dia.
Realmente verifiquei esse evento e ele também possui um evento OnWorkBegin que teoricamente deveria me trazer o valor máximo, que seria o tamanho da mensagem, o tal do AWorkCountMax, entretanto o AWorkCountMax vem sempre zerado no TIdSMTP, assim fiz uso de um “expediente técnico” disponibilizado por alguém, não lembro onde, para resolver esse problema do valor dado ao ProgressBar1.Max que segue:
Pelo que entendi ele sava a mensagem propriamente dita em um stream e verifica o tamanho desse stream, pois não é suficiente verificar o tamanho dos anexos, pois difere substancialmente do tamanho da mensagem.
e no evento OnWork coloquei:
Assim tenho dois Gauges na tela de envio, uma que traz o progresso: conectando, autenticando, enviando, concluido e outro especÃfico para a hora que chega no enviando, que mostra o progresso do envio propriamente dito.
Espero ter colaborado.
Grande abraço.
Perfeito, Eduardo!
Muito obrigado por ter dedicado um tempo para voltar ao blog e contribuir com este código! 🙂
Achei bem interessante a ideia de “medir” o tamanho da mensagem por meio de uma TMemoryStream para configurar o MaxValue da barra de progresso.
Obrigado!
Ola Andre, disculpa meu portugues, e parabem pelo site.
Seguinte, estou trabalhando com um servidor da hostinger, usei o codigo do Denis para o porto 587 mas esta mandando erro “EIdSMTPReplyError with message ‘Must issue a STARTTLS command first'” ai me lasquei, sou novo no asunto email.
Abraço a todos.
Olá, Daniel, tudo bem?
Obrigado pela visita e pelo comentário!
O erro aparentemente parece estar relacionado com a porta. Você já tentou utilizar a porta 465?
Se mesmo assim não funcionar, peço que envie o código que você está utilizando para “[email protected]”.
Abraço!
Obrigado André, mas parece que o problema era com o servidor mesmo, hoje funciona bem. Valeu pela ajuda. So para esclarecer, usei o seu codigo mas troquei a parte que o Denis mandou na mensagem dele.
Saludos desde Argentina
Certo, Daniel.
Ainda bem que o problema era só no servidor mesmo.
Boa sorte no projeto! Abraço!
Boa noite.
Não consegui enviar o e-mail, aparece a mensagem “Erro na conexão ou autenticação: Socket Error #10060.
Connection timed out.
Firewall está desativado, não tenho anti-vÃrus instalado e estou enviado do gmail.
Boa tarde, Josenice.
Vou entrar em contato com você por e-mail.
Abraço!
Qual a solução encontrada nesse caso? Estou com o mesmo problema.
Vou entrar em contato com você, Lucas!
Abraço!
Bom dia… Estou com problemas de conexão e autenticação e também na parte de instância do TIdText e TIdAttachmentFile e por conta disso eu apaguei a parte de TIdAttachmentFile pois realmente não vou precisar e na TIdText eu substitui por IdMessage1…
Na parte da conexão e autenticação esta dando um erro…
Erro na conexão ou autenticação: Erro connecting with SSL.
error:140770FC:SSL
routines:SSL23_GET_SERVER_HELLO:unknown protocol
e não sei como posso resolver, já pesquisei bastante mas não achei algo explicável..
Se possÃvel me ajudar, agradeço de coração.
Olá, VinÃcius, tudo bem?
Não sei se você está utilizando o Gmail, mas este erro parece estar relacionado com a porta de conexão ou modo de autenticação através do SSL.
Em primeiro momento, sugiro alterar entre as portas 25, 465 e 587. Se ainda não funcionar, experimente trocar as propriedades referente ao SSL:
Os valores acima podem ser obtidos com o suporte do webmail que você está utilizando.
Abraço!
Gostaria de agradecer.
Após 5 horas de frustração pesquisando em sites estrangeiros (parei até em um da Indonésia), me deparei com seu site de maneira explicativa de simples.
Parabéns pela inciativa
Opa, boa noite, Leandro!
Muito obrigado pelo feedback! Comentários como o seu me motivam a continuar o trabalho no blog!
Abraço!
Salam!
Je ne peut pas envoyer l’e-mail, le message “Erreur dans la connexion ou l’ authentification: Socket Error # 10060.
Connection timed out.
je ne comprends pas ce qui ne vas pas ! est ce que vous pouvez m’aidé svp? (j’utilise un compte gmail)
Bonjour, Beddiar. Je vous contacterai par email, ok?
Salam!
Merci beaucoup Monsieur André finalement ça marche !
sans votre aide je serai perdu … 1000 merci!
j’ai suivi vos instructions 🙂
bravo pour le site et pour la rapidité de réponse et surtout les compétences que vous avez !
continu comme ça on a encore besoin de vous, puis je m’excuse pour le français je ne maîtrise pas l’espagnole
muchas gracias ! 🙂
Salut, Beddiar!
Bon! Heureux de savoir que je pourrais vous aider!
Pas besoin de présenter des excuses! communauté Delphi est l’un dans le monde! 🙂
Je vous remercie!
Olá André, sempre que posso dou uma passadinha aqui no seu site pra aprender um pouco mais.
A sua dica de como enviar e-mail é excelente, aliás, me foi muito útil, obrigado, no entanto, não encontro na internet, nenhuma dica de como receber os e-mail na mesma aplicação….
Tem como você nos mostrar como faz?
Obrigado e sem mais.
Atenciosamente.
Adriano.
Boa tarde, Adriano, tudo certo?
Agradeço pelas visitas que sempre faz ao blog! 🙂
Para receber e-mails é necessário utilizar outro componente, chamado TIdPOP3, da mesma paleta. As propriedades são semelhantes ao componente TIdSMTP, mas o seu propósito é processar protocolos POP. Acho que o exemplo do link abaixo pode ajudá-lo:
http://delphi.cjcsoft.net/viewthread.php?tid=45615
Abraço!
Wow…
Excelente, vou testar em minha aplicação e retorno para tirar dúvidas sobre possÃveis melhorias no códigos…rs.
Obrigado André.
Haaaa, outra coisa que eu já ia me esquecendo. Estou precisando de uma forcinha com Socket, para enviar e receber arquivos …
Se não for muito abuso, evidentemente…
Obrigado mais uma vez.
Adriano.
Olá, Adriano!
Não tenho muitos conhecimentos sobre Socket, mas vou entrar em contato com você!
Abraço!
Olá, primeiramente obrigado pelo artigo que me ajudou muito.
Estou tendo um probleminha para saber como enviar um anexo. Estou utilizando este exemplo em um projeto de APP mobile(Android primeiro). Porém este anexo seria uma foto. Gostaria de saber como enviar como anexo uma imagem, tirando de um TImage.
É o seguinte: Eu tenho um botão para escolher o arquivo da galeria e outro para tirar uma foto. Após executado eu jogo para meu TImage da seguinte forma pra aparecer o preview da seguinte forma:
Então, gostaria de enviar está imagem. Poderia me ajudar? É a única coisa que está faltando para eu terminar meu APP.
Obrigado.
Olá, Leandro, tudo bem?
Ainda não tive a oportunidade de testar o código apresentado no artigo em um aplicativo mobile. Mesmo assim, acredito que será necessário referenciar a imagem pelo caminho em que ela está armazenada, ou seja, através do comando GetPicturesPath. Dessa forma o TIdAttachmentFile conseguirá localizar a carregar a imagem como anexo.
Abraço!
Ótimo Post Andre..
Porém como colega Leandro Lanini, gostaria de utilizar o envio de e-mail direto de um APP android. Porém, este exemplo exige as DLL’s.. então Leandro, como vc conseguiu utilizar este exemplo em sua aplicação mobile??
Agradeço desde já!
Boa noite, Marcel!
Recomendo a leitura do artigo do MVP Landerson Gomes:
http://vivaitaocara.com.br/landersongomes/embarcadero/delphi/enviando-e-mail-no-android-com-delphi-xe5
Abraço!
Obrigado pelo Retorno André.
Eu ja vi este artigo do Landerson, porém, não serve..Tem até outras pessoas questionando essa mesma necessidade que estou precisando.
O app precisa efetuar um disparo de e-mail diretamente, sem a intervenção do usuário selecionando um gerenciador de e-mail de seu app.
Situação: Usuário efetua cadastro no App e ao salvar os dados, é disparado um e-mail para a conta cadastrada.. seja uma boas vindas ou confirmação dos dados cadastrados.
Estou pesquisando em vários lugares e não consigo encontrar nada como o Delphi faria isto!!
Utilizo um app(carrorama) que envia e-mail de relatório com o excel em anexo, bastando preencher o e-mail, assunto e texto e pronto.
Deu pra entender o que seria?
Agradeço desde já!
Entendi, Marcel.
Como a sua dúvida é um pouco mais complexa, eu vou conversar com você por e-mail!
Abraço!
olá. também preciso usar esse processo todo de enviar email em um app para android e ios pelo delphi firemonkey. Mas tem essas dll’s necessárias. Alguém pode me ajudar ou solucionou esse problema? ficaria extremamente grato.
Olá, César!
Este código para envio de e-mails não está otimizado para aplicativos Android. Em breve pretendo estender este assunto de envio de e-mails para envolver a tecnologia Firemonkey, abordando a plataforma Android. Enquanto isso, sugiro a leitura de um artigo do MVP Landerson Gomes:
Enviando e-mail no Android com Delphi XE5
Abraço!
Boa tarde Andre, na minha maquina funcionou tranquilo mais ao tentar mandar de outra maquina deu erro
“Erro na conexão ou autenticação.Could not load SSL Lybrary estou usando o xe10
Olá, Renato, tudo certo?
Junto com o executável, você deve levar também as DLLs do Indy para conexão (ssleay32.dll e libeay32.dll), lembrando que estes arquivos devem ficar na mesma pasta do executável.
Abraço!
Ja fiz isso inclusive coloquei tambem no sytem32 e nao deu certoinstalei ate o xe10 na maquina e nao vai.
Project EnviaEmail.exe raised exception class EIdOSSLCouldNotLoadSSLLibrary whith message Çould not load SSL Library’, copiei o projeto da minha maquina para a docliente rodei la e nada o mesmo erro
Vou entrar em contato com você por e-mail, Renato.
Abraço!
Bom dia, Estou seguindo o exemplo dado e também com problemas de COULD NOT LOAD SSL.
Qual foi a solução encontrada?
Olá, Gustavo!
Esse erro é apresentado quando o executável não consegue encontrar as DLLs do SSL para realizar a conexão e envio do e-mail. Portanto, aqui vão algumas orientações:
1) As duas DLLs (ssleay32.dll e libeay32.dll) devem estar na mesma pasta do executável;
2) Verifique se está usando a versão correta das DLLs (no artigo há um link para baixá-las);
3) Verifique se o firewall está bloqueando o seu executável.
Abraço!
Hola Andre
Mucho gusto en escribirle. tengo un problema con el correo que estoy utilizando es de mail.office365.com, en sus opciones de correo me pide esto:
Nombre de servidor: smtp.office365.com
Puerto: 587
Método de cifrado: STARTTL
entonces, yo lo codifico asÃ:
IdSSLIOHandlerSocket.MaxLineAction := maException;
IdSSLIOHandlerSocket.SSLOptions.Method := sslvTLSv1;
IdSSLIOHandlerSocket.PassThrough := True;
IdSSLIOHandlerSocket.SSLOptions.Mode := sslmClient;
IdSMTP.IOHandler := IdSSLIOHandlerSocket;
IdSMTP.UseTLS := utUseImplicitTLS;
IdSMTP.AuthType := satDefault;
IdSMTP.Port := 587;
IdSMTP.Host := ‘pod51004.outlook.com’;
IdSMTP.Username := ‘myuser’;
IdSMTP.Password := ‘mypass’;
Pero cuando intento enviar el email me sale el error: Error connecting with SSL, Error 1408F10B: SSL Routines:SSL3_GET_RECORD: wrong version number
Que puedo estar haciendo mal? alguna idea?
Hola, Joel!
Discúlpame por no saber hablar español, pero aún asÃ, voy a tratar de ayudarle.
Este error parece estar relacionada a la versión incorrecta de la DLL de Indy.
Trate de descargar la última versión de los archivos DLL en esta dirección:
https://indy.fulgan.com/SSL/
Abrazo!
Andre, boa noite.
Estou usando Delphi Berlin e estou com o mesmo problema que o Renato Aquino.
Retorna sempre “Could not Load SSL Library’
Poderia me ajudar.
Boa tarde, Claudio!
Entrarei em contato por e-mail. Abraço!
André, boa tarde.
Gostei muito do seu blog. Tenho pouco tempo no delphi, estou usando o berlin update2, fiz um aplicativo seguindo o seu modelo para usar no android, mas quanto tento enviar ele retorna a seguinte mensagem depois de passar por IdSMTP.Send(IdMessage): “Erro na conexão ou autenticação”, um showmessage que eu coloque, pois não consegui usar o messagedlg. E mesmo assim a momento que ele envia e outros não.
Como faço pra ele ficar 100%, estou precisando muito dele.
Obrigado!!
Olá, Jorge, tudo bem?
Este código para envio de e-mails não está otimizado para aplicativos Android. Acredito que algumas alterações devem ser aplicadas.
Em breve pretendo estender esse assunto de envio de e-mails, envolvendo o Firemonkey.
Abraço!
Boa noite!
Eu também estou recebendo a mensagem de erro “Could not Load SSL Library”. Já adicionei as referidas DLL(s) à pasta da aplicação. Você conseguiu ajudar os demais colegas que estavam passando pelo mesmo problema?
Obrigado.
Boa noite, Lincoln!
Geralmente o problema está relacionado com a versão correta das DLLs.
Vou entrar em contato com você para verificar a versão do Delphi que você está utilizando.
Abraço!
Boa tarde André,
Could not load SSL library, usso Delphi XE7, tentei seguir alguns procedimento que o pessoal colocou aqui e nada, está dando esse erro. Preciso de uma força sua. Muito obrigado
Olá, Guilherme, como vai?
Vou entrar em contato para enviar as DLLs para você. Abraço!
Ola Andre, você já é mestre em enviar email, estou sofrendo para enviar um PDF em anexo, não vai de forma alguma, o email é enviado, mas chega sem anexo, Uso Delphi Xe7, Indy 10.6.0.5169
Agradeço sua ajuda
Olá, Airton, tudo bem?
Já ajudei alguns leitores com o mesmo problema, mas acredito que o problema esteja relacionado com o ContentType do TIdMessage e do TIdText.
Veja o link abaixo do Stack Overflow:
https://pt.stackoverflow.com/questions/133685/envio-de-email-no-delphi
Abraço!
Cara, deu certo mesmo, MUITO obrigado… modifiquei algumas partes do código e ainda assim funcionou.
Ao invés de configurar os parâmetros de forma dinâmica no código, adicionei os componentes idSMTP e IdMessage pelo Ãcone e configurei as propriedades neles mesmo. Isso tudo no bom e velho Delphi 7!! Testei usando o hostgator enviando para o hotmail. O único problema é que ele acrescentou no cabeçalho da mensagem aquela mensagem “Este remetente não passou nas nossas verificações de detecção de fraude e pode não ser quem aparenta.”, mas de resto deu certo.
Agora vou descobrir como modificar o pdf usando uma opendialogbox (deve ser possÃvel, não é?).
Obrigado novamente!!
Olá, xará!
Que bom que o artigo ajudou você. 🙂
Se os parâmetros de configuração do webmail forem sempre fixas, configurá-los no próprio componente é mais adequado. No artigo, estes parâmetros são configurados no código para que a rotina seja adaptada para qualquer servidor.
A respeito do PDF, acredito que é possÃvel, sim!
Boa sorte, André. Abraço!
Olá André,
sabe se é possÃvel definir um endereço de retorno em caso de erro, diferente do endereço de envio?
Exemplo:
Caso o “dominio.com” não exista, deve retornar uma msg do tipo “Remote Server returned ‘554 5.4.4 SMTPSEND.DNS.NonExistentDomain; nonexistent domain'”
A questão é que a vai enviar para o ‘[email protected]’.
A minha questão é se é possÃvel definir outro endereço para receber esta mensagem.
Obrigado, e parabéns pelo post.
Olá, boa noite, Antonio.
Acredito que não é possÃvel configurar um e-mail diferente para resposta, já que os próprios webmails também não trabalham dessa forma. No Gmail, por exemplo, quando envia-se uma mensagem, a resposta é recebida sempre pelo remetente.
Talvez, para simular esse comportamento, sugiro buscar alguma configuração de redirecionamento do seu servidor de e-mails. Pesquise por “email automatic forwarding” para mais informações.
Abraço!
Olá André, mto bom seu tópico. Parabéns pela didática e ajuda…
Estou conseguindo enviar através do bol sem problemas, porém, através do gmail nao vai. Estou recebendo o erro socket error #10060 connection timed out.
Já testei praticamente todas as combinações de métodos, modo e autenticação…
Estou usando porta 587 e servidor smtp.gmail.com.
Alguma ideia do pq acontece isso???
Olá, Felipe!
Este erro pode ser causado por uma série de fatores. Vou entrar em contato para solicitar mais detalhes, ok?
Abraço!
Muito Otimo o artigo André.
Parabéns!!
Estou precisando enviar um e-mail por dispositivo móvel com Delphi Seattle 10.
Por exemplo, quero pegar as informações digitadas dentro do edit e enviar pelo e-mail.
Mas estou garrando em algumas partes. Gostaria de seu auxilio, desde já obrigado!
Olá, Wallatas, boa noite!
Ainda não elaborei um material abordando o envio de e-mail em dispositivos móveis aqui no blog.
Peço que você acesse o blog do Landerson Gomes. Lá tem uma dica de envio de e-mail com a versão XE5, mas, com alguns ajustes, provavelmente funcionará com as versões superiores:
Enviando e-mail no Android com Delphi XE5
Abraço!
Quando envio e-mails pelo Terra dá Connection timed out.
Usando gmail e hotmail funcionam.
O que pode ser?
Obrigado.
Olá, William.
Pela descrição do erro, a aplicação não está conseguindo conectar-se ao servidor de e-mails do Terra.
Veja se as informações do artigo abaixo podem lhe ajudar:
https://www.andrecelestino.com/perguntas-respostas-comentarios-blog-faq/
Abraço!
Olá André, venho acompanhando você há muito tempo, e recentemente migrei um pequeno sistema de emissão de notas fiscais do delphi 7 para o XE10.1. Foi bastante trabalhoso por ser novo pra mim… mas fiz tudo direitinho, só não consegui sucesso com o indy. Fiz direitinho tudo que vc mandou aqui neste teu exemplo… mas sempre ocorre o mesmo erro esse:
Project GBNFe.exe raised exception class EIdOSSLUnderlyingCryptoError with message ‘Error connecting with SSL.
error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol’.
Não sei se vc está disponibilizando tempo ainda pra esse post… mas se puder me ajudar agradeço. O meu código segue muito de perto o teu exemplo como as inclusões na uses e as variáveis, aqui está parte do meu código:
Desde já obrigado, amigo!
Olá, Edson.
Vou entrar em contato por e-mail para tentarmos encontrar uma solução.
Abraço!
Olá, Edson.
Ao utilizar o exemplo acima também recebi o mesmo erro “error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol’.”.
No meu caso alterei a propriedade “UseTLS” para “utUseExplicitTLS” como abaixo, e funcionou perfeitamente.
Muito obrigado pela colaboração, Henri!
Vou enviar um e-mail para Edson notificando-o da sua resposta.
Abraço!
Ola André testei seu código no meu Delphi 10xe mas o mesmo esta dando um erro, o seguinte: COULD NOT LOAD SSL LIBRARY, já adicionei todas dlls na pasta que esta localizado o arquivo .exe, e tambem já adcionei a instrução LoadOpenSSLLibrary; no codigo, mas mesmo assim continuo recebendo o mesmo erro. você poderia me ajudar?
Muito Obrigado
VinÃcius Amorim Rocha
Boa tarde, VinÃcius, tudo bem?
Se as DLLs com as versões corretas já estão adicionadas na mesma pasta do EXE, então este erro não deveria ocorrer.
Vou entrar em contato para identificarmos o problema, ok?
Abraço!
Boa noite.
Não consegui enviar o e-mail, aparece a mensagem “Erro na conexão ou autenticação: Socket Error #10060.
Connection timed out.
Firewall está desativado, não tenho anti-vÃrus instalado e estou enviado do gmail.
meu problema de ontem foi solucionado*
Certo, VinÃcius. Enviei um e-mail para você referente ao comentário anterior.
Vamos tentar resolver tudo isso junto 🙂
Abraço!
Estou com o mesmo problema caso tenha ideia do que seja.
Olá, Rafael.
Pela experiência que estou adquirindo ao ajudar alguns leitores, o erro 10060 parece estar relacionado, em sua maior parte, com a versão das DLLs ssleay32.dll e libeay32.dll. Um deles disse que solucionou o problema utilizando as DLLs que vêm com a instalação do próprio Delphi, geralmente na pasta “..\Program Files (x86)\Embarcadero\Studio\XX.X\bin\subversion”, onde “XX.X” é a versão do RAD Studio.
Abraço!
Boa tarde André, eu estou com um problema, e não sei se é uma limitação do componente. Tenho uma instância deste TidSMTP viva no inÃcio da minha aplicação. Em determinado momento eu faço um loop nos clientes, e para cada laço crio uma thread que irá enviar um email para cada cliente utilizando a mesma intância do TidSMTP. O primeiro email vai, mas no segundo a diante já dá erro de socket e Access Violation. Será que é por eu estar usando a mesma instancia do TidSMTP sem ter terminado o envio de email na primeira thread?
Olá, Cássio, boa tarde.
Ótima questão.
Sim, o erro provavelmente está ocorrendo porque há uma concorrência da mesma instância do componente TIdSMTP entre as threads. O correto, portanto, seria criar uma instância do componente em cada thread, tornando-a independente de outros fluxos paralelos e desacoplada de objetos globais.
Abraço!
Bom dia, temos um serviço de envio de email com Delphi XE2, utilizando o componente IdSMTP, mas precisamos incluir mais um parâmetro para fazer o login no servidor. Desta forma os parâmetros são:
Email
Usuário
Senha
Percebemos que o componente possui as propriedades UserName e Password, que até o momento está sendo usado por nós. Existe alguma forma para estarmos enviando mais o parâmetro de email? (Não o email de destinatário)
Desde já agradeço a atenção!
Olá, Paulo, como vai?
O endereço de e-mail do remetente é configurado no componente TIdMessage, exemplificado nessa linha do artigo:
Basta parametrizá-lo assim como você fez com o usuário e senha!
Caso ainda tenha alguma dúvida, envie um e-mail para [email protected].
Abraço!
Obrigado pelo retorno. Mas esse email compõem o login, não é referente aos envolvidos no corpo do email, e sim uma informação a mais para fazer o login.
Entramos em contato com o pessoal do Servidor e vimos que se trata de uma api.
Muito obrigado pela atenção, abraços!
Certo, Paulo.
Por ser uma API, a configuração será mais fácil.
Abraços!
Bom dia Andre, poderia e ajudar em uma duvida, como faço para enviar um arquivo(foto) que esta em um BD?
Olá, Aloisio, como vai?
Bom, assumo que esse arquivo está gravado como binário no BD, certo? Se este for o caso, primeiro você precisa converter o binário em uma stream em memória, salvá-la em disco (mesmo que em uma pasta temporária) e então anexar o arquivo gerado com o
TIdAttachmentFile
, conforme apresentado no artigo.Abraço!
Olá, André. Primeiro gostaria de parabenizá-lo não só pela ideia do artigo, mas também pela excelente didática.
Eu implementei esse código em minha aplicação para zipar e enviar os cupons fiscais eletrônicos via e-mail. Funciona perfeitamente há algum tempo. Agora, eu estou passando tudo isso para uma thread para deixar minha aplicação livre, e estou recebendo uma mensagem que não recebia antes. Ao instanciar (IdSSLIOHandlerSocket := TIdSSLIOHandlerSocketOpenSSL.Create(Self);) recebo esse erro:
É claro que está faltando alguma declaração, ou coisa parecida, mas não consigo encontrar onde está o erro, já que em condições normais funciona. Será que você pode me ajudar? Agradeço antecipadamente. Se você quiser, posto aqui como estou fazendo. Valeu mesmo.
Olá, Nelson, tudo bem?
Posso ajudá-lo, sim!
O erro indica que não existe um construtor (Create) da classe
TIdSSLIOHandlerSocketOpenSSL
que recebe o parâmetro que você está informando.Há uma explicação: o construtor da classe
TIdSSLIOHandlerSocketOpenSSL
exige um parâmetro do tipoTComponent
no construtor. Enquanto o seu código estava no formulário, tudo funcionava bem, já que o parâmetro “Self” aponta para o próprio formulário que, por sua vez, herda deTComponent
.Porém, quando você moveu o código para a thread, o parâmetro “Self” não aponta mais para o formulário. Agora ele se refere à própria classe da thread, na qual não herda de
TComponent
. Por este motivo, o compilador avisa que o “Self” que você informou não é do tipo que o construtor espera.Para resolver este problema, basta preencher este parâmetro como
nil
:Abraço!
Show de bola! Muito obrigado, campeão. Deu certo.
Sucesso pra voce.
Que bom, Nelson!
Agradeço pelo comentário! 🙂
Ótimo artigo!
Mesmo incluindo o IdText.ContentType := ‘text/html; charset=iso-8859-1’ não consigo enxergar o arquivo HTML nos destinatários… Aparece apenas o código HTML!
Olá, Adriana!
Vou entrar em contato com você!
Olá. Depois de tantas alterações acima, você tem como colocar o exemplo para download?
Olá, Vanderlei, tudo bem?
As alterações que surgiram conforme os comentários dos leitores já foram replicadas no código-fonte do artigo, portanto, está funcional.
Abraço!
André, estou com problemas para enviar email passando pelo proxy, pode me ajudar?
Olá, Alexandre, tudo bem?
Para configurar o proxy, você precisa vincular um componente
TIdSocksInfo
à propriedadeSocksInfo
do componenteTIdSSLIOHandlerSocket
.O componente
TIdSocksInfo
disponibiliza as propriedades necessárias para configuração, como Host, Port, Username e Password.Abraço!
Bom dia, estou tentando enviar email com o Tokyo mas esta ocorrendo o seguinte erro:
SSL negotiation failed
A versão da libeay32.dll e da ssleay32.dll é 1.0.2.15
Poderia me ajudar?
Olá, Paulo, tudo bem?
Vou entrar em contato com você. A versão Tokyo trouxe uma mudança neste contexto do Indy.
Abraço!
boa tarde.
Utilizo o Delphi xe7 e estou com o mesmo problema do Paulo Eduardo.
Pode me enviar o e-mail também fazendo um favor
Olá, Leonardo, boa noite!
Vou entrar em contato com você.
Show de bola André. Obrigado por compartilhar conhecimento. Forte abraço.
Olá, David!
Eu que agradeço pelo comentário!
Grande abraço!
Olá André cara não consigo de maneira nenhuma enviar o email com a internet via proxy.
Criei um MailInfoSocks : TIdSocksInfo;
Setei as cfg do proxy
Liguei na propriedade TransparentProxy do IdSSLIOHandlerSocket e não vai.
Da o erro Socket Error # 11002
Em minha máquina, envio sem proxy e vai certinho, mas na máquina do cliente com proxy não vai.
Teria mais configurações a fazer?
Olá, Roberto, tudo bem?
Por coincidência, outro leitor está com este mesmo problema e estamos tentando identificar a configuração correta.
Vou entrar em contato com você para acompanharmos juntos.
Abraço!
Olá, fiz passo a passo e vi os comentários dos amigos aqui. Ainda está dando esse erro:
Erro na conexão ou autenticação: Please log in via your web browser and then try again.
Learn more at https://support.google.com/mail/answer/78754
Olá, Renan!
Experimente entrar no link abaixo e habilitar a opção “Less Secure Apps”:
https://myaccount.google.com/lesssecureapps?pli=1
Abraço!
Obrigado. Acabei de fazer isso, mas o erro continua ainda.
Renan, acesse o link que é exibido na mensagem. Este link direciona para a parte de “Troubleshoot problems”. Aparentemente há alguma falha na configuração da sua conta do Gmail, ou você inseriu algum dado incorreto na configuração do componente TIdSMTP, como usuário, senha, ou porta.
Além disso, em alguns casos, o antivÃrus ou firewall pode bloquear o envio da mensagem, principalmente no Windows 10.
Se após estes passos você ainda estiver com problemas, envie um e-mail para [email protected].
Abraço!
Muito bom !! Parabéns André por compartilhar seu conhecimento, Show… sucesso irmão !
Muito obrigado, Vilmar!
Um grande abraço! 🙂
Olá
Eu estou usando o Delphi Tokyo 10.2, gostaria de saber quais indys e DLLs devo usar e se esse código funciona para essa versão. Poderia me ajudar?
Olá, Yorelis!
Sim, este código funciona para o Tokyo!
As DLLs que você precisa distribuir com a aplicação são libeay32.dll e ssleay32.dll.
Abraço!
Olá André. Poderia me ajudar com este erro? Estou entrando no e-mail normal, mas o erro persiste.
Abrs.
Error: authentication failed: athentication failure
Olá, Felipe, vou entrar em contato!
Abraço!
É o mesmo erro que eu estava tendo. É um bloqueio do Gmail.
Bom Dia André!
É a primeira vez que faço uma rotina para envio de email, e segui a risca os passos que você colocou no topo do site, porém, caso eu tente enviar com o meu email do Gmail, o email vai mas não chega aos destinatários de Hotmail. Caso o destinatário for Gmail, o email chega normalmente, mas na caixa de Spam. Tentei utilizar a configuração de envio do Hotmail descrita nos comentários, para enviar do meu email do Hotmail, porém dá erro de TimeOut e não envia para nenhum email.
Utilizo o Delphi XE5. Copiei as DLLs fornecidas por você, na pasta onde gera o executável do meu projeto e também copiei as mesmas para o C:\Windows\System32.
Os componentes Indy que estão instalados, foi o que veio com essa versão do Delphi.
Pelo que percebi nos comentários do pessoal, o que geralmente muda da configuração de um email para outro são as linhas abaixo:
Vi que dependendo da porta, muda o sslvSSLv23 para outro e o sslmClient e o utUseImplicitTLS.
Gostaria de saber se você podia me dar um Help:
1) Quais seriam as configurações que eu deveria fazer nessas linhas para enviar por um email de Gmail, Hotmail e um pessoal do WebMail?
2) Teria como ao enviar anexos, não cair na caixa de Spam do destinatário?
Obs.: Nas configurações avançadas das Opções de Internet do Painel de Controle, tem as opções Usar SSL 3.0, Usar TLS 1.0, Usar TLS 1.1, Usar TLS 1.2 e todas estão marcadas, com exceção da opção Usar SSL 3.0.
Se puder ajudar, agradeço muito!
Olá, Xandy.
Vou entrar em contato com você por e-mail.
Abraço!
Olá, parabéns pelo artigo. Estou utilizando o Delphi XE8 e fiz dessa forma:
Olá, Pablo!
Nas versões mais recentes do Delphi, utilize essa instrução:
Abraço!
Olá, deu certinho, obrigado e parabéns pelo trabalho.
Boa Tarde André. Realmente testei esse código no Delphi 7 e com Indy 10, e para “não muita” surpresa o Gmail bloqueou o acesso ao aplicativo. Indo nas configurações do Gmail e alterando a propriedade de acesso a app menos seguro, eu consegui enviar o e-mail. Obrigado, pois depois de muito quebrar a cabeça, esse foi o único código com o qual consegui enviar email.
Olá, William!
Que bom que funcionou! Muitos desenvolvedores se deparam com este erro e imaginam que é uma falha no código. Só o fato de habilitar essa opção no Gmail, o problema já é resolvido.
Abração!
Olá, tenho uma dúvida semelhante à publicada pelo Paulo Eduardo em 08/01/2018, mas parece que ele usou uma API.
A rotina que tenho funciona muito bem, no entanto umas das contas de envio passou a ter 2 métodos de autenticação, se é que posso dizer assim.
A 1ª é a autenticação convencional, conforme citado no exemplo do blog e nos comentários:
A 2ª é a autenticação com um usuário e senha, diferente do acima que é o próprio email e senha, mas não consegui identificar onde devo informar este usuário e senha.
Fazendo uma analogia ao Outlook, na primeira parte da configuração preenchemos os campos nome do usuário com o próprio e email e senha. Clicando em mais configurações, na opção servidor de saÃda, existe a opção de fazer logon usando nome de usuário e senha, que é justamente esta que não estou sabendo configurar na rotina.
Como eu configuro esse usuário e senha?
Desde já agradeço.
Olá, boa tarde, Vanderlei!
Infelizmente desconheço esse segundo método de autenticação que você mencionou. No caso do Outlook, o usuário e senha geralmente são os mesmos das próprias credenciais de e-mail, portanto, são atribuÃdos ao Username e Password do componente
TIdSMTP
, conforme apresentado no artigo.De qualquer forma, envie o erro que ocorre nessa segunda autenticação para o e-mail [email protected]. Vamos nos falando por lá!
Abraço!
Olá.
Encontrei o que eu estava procurando neste link:
https://stackoverflow.com/questions/17734414/using-indy-10-smtp-with-office365
Depois de muitas pesquisas encontrei um trecho de código que não ajudou a resolver diretamente, mas cuja a palavra “TIdUserPassProvider” me chamou a atenção. Fiz outras pesquisas usando esta palavra chave e obtive sucesso.
Olá, Vanderlei.
Muito obrigado pelo retorno! Eu não conhecia essa classe
TIdUserPassProvider
. Mais um aprendizado! 🙂Abração!
Boa tarde,
Sempre que vai autenticar dá erro: incorrect authentication data
Olá, Lucas.
Removi o seu código-fonte do comentário por questões de privacidade.
Este erro está relacionado às configurações dos dados de SMTP, e não propriamente ao Delphi. Veja essa breve explicação:
“Incorrect authentication data” error is usually related to the SMTP User Authentication details you have configured (or not configured) in your email settings.
Pelo seu código não consegui identificar o serviço que você está utilizando, mas sugiro que você reveja as configurações do SMTP, principalmente de SSL.
Abraço!
Olá boa tarde,
Estou com o seguinte erro: Error: authentication failed failure: generic
Estou utilizando o servidor bol smtps.bol.com.br, porta 587, como manda o site.
* Tem um outro e-mail que envia normalmente, com mesmo servidor…
Se puder ajudar, agradeço, obrigado
Olá, Felipe, tudo bem?
Se o envio acontece normalmente com outra conta do mesmo servidor, então o problema aparentemente está nessa conta especÃfica que está sendo utilizada.
Digo isso porque, caso fosse um erro de codificação ou do componente, nenhuma conta desse servidor enviaria a mensagem.
Como a mensagem de erro aponta uma falha de autenticação, eu confirmaria se as credenciais realmente estão corretas.
Abraço!
Boa tarde André! Artigo magnÃfico.
Infelizmente não estou conseguindo enviar o email. A conexão é feita perfeitamente, porém, na hora do envio recebo a seguinte mensagem:
ssl is not available on this server
Estou utilizando o Google pra enviar o email. Saberia me dize o que pode ser?
Obrigado!
Olá, Fernando. Que estranho!
Copiei o código do artigo e consegui enviar a mensagem normalmente.
Verifique essas três possibilidades:
1) A propriedade
Port
deve estar como 465, e a propriedadeUseTLS
deve estar configurado comoutUseImplicitTLS
;2) As DLLs referente ao Indy devem ser baixadas e copiadas para o mesmo diretório em que está o executável;
3) Lembre-se de ativar a opção de Allow less secure apps na conta do Google através do link: https://myaccount.google.com/lesssecureapps.
Espero que ajude! Abraço!
Bom dia André
Artigo perfeito, didático e funcional.
Eu gostaria de formatar o texto no MS Word e carrega-lo no email, mas é enviado em branco.
Acrescentei estas linhas no seu exemplo para testar:
Somente o texto “Corpo do e-mail” é enviado. Você poderia me dar uma dica?
Obrigado, Geraldo
Olá, Geraldo, bom dia!
Experimente remover o primeiro bloco (que adiciona o texto “Corpo do e-mail”) e manter somente o novo bloco que você acrescentou.
Além disso, não tenho certeza se é possÃvel carregar um texto através de um DOCX. Normalmente carregamos a partir de um arquivo HTML.
Abraço!
Olá,
Tenho minha aplicação em Delphi 7 usado Indy a um bom tempo, porém tem um requisito no meu projeto que tem que identificar o e-mail do usuário remetente, configurei na propriedade:
porém, o e-mail é enviado sempre com o e-mail de autenticação.
Natanael, já estamos nos falando por e-mail! 🙂
Bom dia André usei sua rotina de envio de e-mail para uma aplicação desktop em fmx. E ocorreu um erro no envio do e-mail na parte de autenticação. Por gentileza vc tem uma sugestão para indicar do porque deste problema. Segue que fiz.
Olá, Judeir, bom dia!
Vou entrar em contato com você por e-mail.
Obs: eu removi o seu código do comentário por questões de segurança.
Abraço!
Bom dia André, estou tendo dificuldades para autenticar e enviar um email no Office 365.
Estou usando o Delphi7 com o Indy 10.1.5 e está ocorrendo o seguinte erro:
error connecting with ssl
Por favor, poderia me ajudar?
Olá, Daniel, boa noite!
Eu suspeito que o problema esteja relacionado com as DLLs. Tente as seguintes ações:
1) Certifique-se que as DLLs (ssleay32.dll e libeay32.dll) estão no mesmo diretório do executável, ou seja, no mesmo diretório do .exe, e não do .dpr;
2) Experimente utilizar as DLLs que estão nesse link;
3) Verifique se algum antivirus ou firewall está bloqueando a sua aplicação.
Espero que uma dessas sugestões lhe ajude!
Abraço!
Boa tarde! tudo certo?
Preciso de uma ajuda se possÃvel. Tenho 2 assinaturas no outlook onde preciso usar de forma aleatória.
Mas não consigo pelo delphi adicionar a assinatura criada pelo outlook. Segue meu código. Agradeço desde já.
estou usando Utils.EnviaEmailviaOLE(Emails.Destino,”, ”, Emails.Assunto, Text, ”, Emails.MostraEdita, Emails.FormataHTML);
Olá, Guaracy, tudo bem?
Não conheço a implementação do método
EnviaEmailViaOLE
, mas essa questão já foi postada no Stack Overflow e, segundo o autor da resposta, a assinatura do Outlook é automaticamente adicionada ao chamar os métodosDisplay
ouGetInspector
. Veja a resposta:https://stackoverflow.com/questions/24065385/send-email-with-ms-outlook-dont-add-signature
Abraço!
Depois de sofrer bastante com a hostGator, graças a Deus consegui descobrir, sem depender do suporte da HostGator, na verdade “não existe suporte na hostgator”, mas funciona muito melhor do que a locaweb, que tem suporte, mas cada mês da uma bugada diferente.
Estou usando o Delphi 10.2
Então as configurações para o HostGator é:
Na Locaweb são as mesmas configuracoes do Gmail, só muda o host:
Muito obrigado pela contribuição, Charles, e também pelo feedback sobre a HostGator, rsrs.
Na época eu fiquei na dúvida sobre hospedar o blog na HostGator, mas acabei optando pelo Hostinger.
Abração!
Amigo Como libera a dll pelo delphi7? estou tento conflito com a dll ntdll.dll….
Olá, Bruno!
A princÃpÃo a ntdll.dll não está relacionada com a rotina de envio do e-mail.
Desconfio que seja algo do antivirus, firewall, ou outros bloqueadores.
E lembre-se que você precisar colocar as DLLs do Indy na mesma pasta do executável, ok?
Abraço!
Amigo eu poderia tar enviando meu codigo para você dar uma olhada ? estou tendo problemas com a ntdll.dll.
talvez você posssa me ajudar com esse erro…
Vou entrar em contato com você, Bruno!
André, bom dia!
Agora que o google desabilitou o acesso a app menos seguros, como proceder para conseguir enviar o e-mail?
Olá, Dino, bom dia.
Excelente pergunta. Inclusive acho que devo atualizar esse artigo com essas novas informações.
Bom, já que esse recurso foi desabilitado, acredito que há 2 opções:
1) Habilitar uma senha exclusiva para o seu aplicativo (App Password). Trata-se de um recurso que foi disponibilizado para “substituir” o acesso à apps menos seguros. Veja mais informações nesse link e aqui também.
2) Usar um provedor diferente para envio de e-mails. Infelizmente alguns desenvolvedores estão optando por isso.
Espero ter ajudado. Abraço!
André, obrigado pela resposta. Eu já consegui fazer o envio pelo google com as adaptações sugeridas. Agora o estranho é que não consigo, a partir do meu e-mail com meu domÃnio, enviar para um e-mail @gmail. Para @hotmail vai normal.
Mas fiz exatamente isso, ativei o MFA no Google (agora precisa fazer isso) para então poder ativar o APP Password.
Olá, Dino, tudo bem?
O envio falha somente quando você envia pelo Delphi?
Se sim, pode estar ocorrendo uma exceção silenciosa. Neste caso, sugiro que você faça uma depuração do código durante a operação de envio, ou envolva o código em um bloco try/except para capturar a mensagem.
Por outro lado, se a sua mensagem não chega no endereço do Gmail mesmo usando o webmail da sua hospedagem, provavelmente é algo relacionado à s polÃticas de segurança do Google para bloquear spams, phishing e correntes de mensagens. Se este é o caso, recomendo entrar em contato com a sua hospedagem e explicar a situação. Eles certamente irão ajudá-lo a identificar o problema.
Abraço!
Que tal Andre, saúdo você do México, primeiro obrigado por compartilhar seu conhecimento, estou tentando configurar um e-mail ionos para enviar os e-mails e recebo um erro “Autenticação necessária”, alguma ideia?
Hi, Raul. Would it be better for you if I write my reply in English?
It seems to be something failing during the authentication process or a security restriction. Gmail, for example, has disabled the “less secure apps” feature, which allows sending emails from third-party apps. Could you forward more details to [email protected]? Thanks.
Oi, André. Segui seu artigo e deu muito certo. Obrigado! Parabéns pelo site. Tenho uma pergunta e não sei se você já teve está preocupação e alguma solução. Tenho um certo receio de colocar a senha dentro do .EXE. Hoje em dia com hackers em toda parte, e é relativamente fácil ler strings na memória. Você já pensou nesse problema alguma vez?
Olá, Custódio.
Primeiramente, obrigado pelo feedback!
Sim, já tive essa preocupação. A solução mais segura é não fixar a senha no código. Ao invés disso, procure armazenar a senha no banco de dados, de forma criptograda. Ou então, em um arquivo externo (como JSON ou INI, também aplicando alguma criptografia). Outra solução é armazenar na nuvem, como em um servidor HTTP, embora isso exija a compra de uma hospedagem.
Abraço!
Valeu!! Obrigado pelo seu tempo e pelas dicas!
André, poderias me enviar por email o codigo para anexar imagem no corpo do email atraves de uma URL externa?
Olá, Henrique, tudo bem?
Bom, depende da forma como você está definindo a sua mensagem. Se for HTML, você pode inserir a imagem externa dentro de uma tag “img src”.
Se estiver utilizando o Indy, basta trabalhar com a classe TIdAttachmentFile. Veja esses dois tópicos:
https://www.indyproject.org/2005/08/17/html-messages/
https://www.indyproject.org/2008/01/16/new-html-message-builder-class/
Espero que lhe ajude. Abraço!
Excelente conteúdo! Parabéns!
Estou fazendo o envio do email via OAUTH2 o qual não envio User e senha, apenas o AccessToken, estou com um problema que diz que preciso de STARTTLS antes de fazer o Send, você já viu algo desse tipo?
Olá, João, ainda não fiz testes com OAUTH2. É um teste que ainda estou pendente de fazer (e publicar algo sobre).
Mesmo assim, pela mensagem, pode ser que as DLLs do SSL não estão na mesma pasta do executável ou são de versões incompatÃveis com o Delphi que você está usando.
Veja esse post do Stack Overflow:
https://stackoverflow.com/questions/7717495/starttls-error-while-sending-email-using-indy-in-delphi-xe
Abraço!