Veja neste tutorial como sua aplicação Android desenvolvida com Delphi XE5 enviar e-mail utilizando o recurso do próprio sistema operacional.
Quando podemos utilizar
Imagine que você tenha um aplicativo de força de vendas e necessite enviar um e-mail para um determinado cliente que conste no cadastro de sua aplicação. Poder fazer isso apenas clicando sobre o cliente pode gerar um ganho de tempo significativo na atividade de seu usuário, é exatamente isso que faremos nessa postagem.
Sempre Intent
Mais uma vez vamos nos comunicar diretamente com o Sistema Operacional Android, para fazê-lo a melhor maneira é fazendo uso de Intents, volto a lembrar que caso não tenha lido ainda a postagem que já fiz sobre o assunto considero altamente recomendável a leitura: INTENTS COM DELPHI XE5 COMUNICANDO APPS ATRAVÉS DO ANDROID.
Concebendo a aplicação
Abra o Delphi XE5 e inicie um Novo Projeto Mobile em Branco, como já fizemos inúmeras vezes aqui no blog. Construiremos uma interface bem simples, inserindo no formulário principal da aplicação: 1 Button, 1 Edit e 1 Image. Como descrito abaixo alteraremos suas propriedades:
- Button1
- Align -> alBottom
- Text -> E-mail
- Edit1
- Align -> alTop
- KeyboardTye -> vktEmailAddress
- Image1
- Align -> alClient
- MultiResBitmap -> [selecione uma imagem de sua preferência]
- WrapMode -> iwStretch
Ao final do processo teremos uma tela bem parecida com a imagem abaixo.
Basicamente, ao clicar no Botão o usuário vai enviar um e-mail para o destinatário informado no Edit. Vamos aos códigos!
Implementando a funcionalidade
Primeiramente vamos inserir na cláusula uses da seção implementation os seguintes Namespaces:
implementation
{$R *.fmx}
uses
FMX.Helpers.Android, Androidapi.Jni.GraphicsContentViewText,
Androidapi.Jni.Net, Androidapi.Jni.JavaTypes, Androidapi.JNIBridge;
No evento OnClick do Button1 vamos inserir o código abaixo:
procedure TForm1.Button1Click(Sender: TObject);
var
Destinatario : string;
Intent : JIntent;
Destinatarios: TJavaObjectArray<JString>;
begin
if Edit1.Text <> EmptyStr then
begin
Destinatario := Edit1.Text;
Destinatarios := TJavaObjectArray<JString>.Create(1);
Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
Destinatarios.Items[0] := StringToJString(Destinatario);
Intent.putExtra(TJIntent.JavaClass.EXTRA_EMAIL, Destinatarios);
Intent.putExtra(TJIntent.JavaClass.EXTRA_SUBJECT, StringToJString('E-mail de Teste'));
Intent.putExtra(TJIntent.JavaClass.EXTRA_TEXT, StringToJString('corpo do email'));
Intent.setType(StringToJString('plain/text'));
SharedActivity.startActivity(TJIntent.JavaClass.createChooser(Intent,
StrToJCharSequence('Qual aplicativo deseja usar?')));
end;
end;
Detalhando algumas linhas
A Intent ACTION_SEND não necessita de uma URI, entretanto passamos para ela alguns EXTRAS, que funcionam como se fosse parâmetros adicionais para o preenchimento de campos na Activity a ser chamada, vamos detalhá-los:
- TJIntent.JavaClass.EXTRA_EMAIL –> destinatário do e-mail.
- TJIntent.JavaClass.EXTRA_SUBJECT –> assunto do e-mail.
- TJIntent.JavaClass.EXTRA_TEXT –> corpo do e-mail.
Adicionamos passamos também o tipo de texto a ser utilizado na intent através da linha: Intent.setType(StringToJString(‘plain/text’));
Notem na declaração de variáveis temos a linha:
Destinatarios TJavaObjectArray<JString>;
Que declara um array de string’s do nativas do Java (JString), que instanciado para conter uma única posição na linha: Destinatarios := TJavaObjectArray<JString>.Create(1); , para depois neste array inserirmos o destinatário de nosso e-mail, vide linha contendo o código: Destinatarios.Items[0] := StringToJString(Destinatario);
Conferindo o Resultado
Execute o projeto e confira o resultado!
Temos nossa aplicação Delphi XE5 enviando e-mail pelo próprio Android.
Até a próxima!







Tudo bem, essa aplicação até funciona, mas não acrescenta muita coisa ao fato de que isso com o aap inventor da pra fazer tranquilo.
Agora a situação é:
mailto:
?subject=
&body=
agora! Esta bem complicado, sem dar tanta volta.
&attachment=
O ANEXO!
Consegue fazer isso incluindo por exemplo uma foto para envio por attachment.
Olá Arley. Primeiramente bem vindo ao Blog! Fazendo uma breve leitura no blog perceberá que todo o conteúdo busca sempre retratar soluções em Delphi, o que realmente pode não acrescentar muito a outras ferramentas, entre estas incluo o APP Inventor que como você disse dá pra fazer tranquilo.
Talvez você possa pesquisar um pouco sobre como fazer no App Inventor o envio de e-mail com anexo.
Embora, não classifique o conteúdo aqui do blog como sendo sua melhor fonte de pesquisa para a referida ferramenta, já que as experiências aqui relatadas, volto a repetir, são Delphi.
Talvez acrescente à sua busca, uma breve observada no Android Developers Reference procurando por ACTION_SEND_MULTIPLE, esta é ação para o envio contendo anexo. Tente aí no APP INVENTOR, se tiver algo a meu alcance em Delphi já sabe onde acessar, é só postar, faço questão de sempre que posso responder e interagir com os comentários!
Abraço e mais uma vez seja bem vindo!
Sim, Claro! Eu concordo só fiz alusão ao fato que seria interessante no seu exemplo uma solução mais ampla sem esquecer os pormenores do uso do que chamamos enviar email.
Acredito que acrescentaria mais interesse aos seus post e contribuiria mais a criar novas ideias do que reproduzir.
Também sou programador Delphi. E acredito que seu objetivo no seu blog e ajudar na fundamentação de novas ideias sobre integrações programadas nas dois plataformas, por isso minha referência ao app inventor.
Gostei da matéria do post só fiz uma critica quanto ao complemento do assunto “enviando e-mail” que também abarca anexar arquivos. rs!
E que já sendo tão simples como você acabou de explicar, teria sido interessante conter esse complemento.
Obrigado pelo retorno!
Arley, vou tentar jogar um exemplo com anexo nos próximos dias, mas como citei o caminho é Através de ACTION_SEND_MULTIPLE.
Na verdade no blog eu apenas relato partes do meu desenvolvimento que possa ser comum a dúvidas dos demais, como tenho focado em aplicações mobile Andoird veio essa sequência de postagens, mas sempre situações que já tenha utilizado em meus projetos no cotidiano.
De qualquer forma, reitero meu agradecimento por sua participação no blog, e como falei procuro sempre que possível interagir com os leitores, e espero que possamos interagir em novas postagens quando as mesma despertarem seu interesse.
Um cordial abraço!
No Xe6 acrescentar Androidapi.Helpers na uses
Como posso deixar apenas os clientes de email aparecendo na lista? Com esse exemplo aparece skype, google drive etc, mas gostaria que aparecesse somente gmail, outlook etc
Tem como colocar um anexo? Quero gerar um arquivo Texto e já anexar no email. Tem como?
Olá Eduardo requer um pouco mais de estudo, mas tem como sim! De uma pesquisada em SEND_MULTIPLE do Android e faça a adaptação.
Vou tentar procurar, me recordo de já ter encontrado a solução com anexo porém não cheguei a codificá-la nem mesmo a postá-la!
Pintando um tempo aqui eu compartilho!
Quando eu coloco para rodar no telefone aparece ‘Aplication does not support this device’ o que eu faço ?
Olá Sara! Bem vinda!!! Esta mensagem você está recebendo no exemplo utilizado no post do seu comentário? Se sim, qual versão do Android do seu telefone, qual marca e modelo do aparelho? E principalmente, qual versão do Delphi você está utilizando?
O e-mail que você utilizou para preencher é válido?
Fico no aguardo do seu feedback!
Tem como enviar um email sem a necessidade de abrir o gerenciador de email do android??
Eduardo talvez seja possível utilizando ACTION_SENDTO, dê uma pesquisada nela!
Olá!
Pessoal, estou usando XE8 e ao utilizar o código acima, recebo msg de não declarado para SharedActivity.startActivity e para StringToJString.
Já adicionei todas as units citadas acima e o problema continua. podem me ajudar? Obrigado
Olá Rodrigo bem vindo!
A partir do XE6 você passa a ter que declarar também a Androidapi.Helpers. Note que há um comentário do Renan Kemp no próprio post sinalizando esse processo.
Espero que resolva aí.
Desde já agradeço sua participação e até uma próxima!
Olá Landerson,
Eu estou usando Delphi XE8, porém ele não reconhece também a UNIT Androidapi.Helpers.
O nome dessa Unit mudou?
vc tem alguem exemplo para mandar imprimir .. ?? e tambem mexendo em arquivos txt
Olá Marcos, estive para tentar fazê-lo por diversas vezes… mas sempre chega um projetinho mais urgente que me tira da linha.
Ainda não fiz mas está nos planos…
Assine aí o blog, saindo você receberá a notícia via e-mail.
Grande abraço e até a próxima!
Landerson, gostaria de enviar um e-mail com anexo em background sem usar o cliente de e-mail do android, como se fosse usar o componente indy…
pesquisei sobre o ACTION_SENDTO mas nao consegui chegar num codigo.
Olá Jefferson… bom tê-lo novamente!
Se vai usar Indy, não precisa da ACTION, ela só é usada na comunicação interna do Android.
Se vai de Indy é direto e reto como se faz no desktop.
Espero tê-lo ajudado, obrigado por sua participação e não deixe de postar um feedback!
Até mais!
Como posso enviar esse email no formato HTML?
Olá João, desculpe-me pela demora…
Bem você precisa alterar o seu tipo: Intent.setType(“text/html”);
Feito isso no texto você passa seu html: Intent.putExtra(android.content.Intent.EXTRA_TEXT,[aqui seu html]);
Espero que ajude.
Obrigado por sua participação.
Como faço para adicionar anexos no email?
Olá Jão, bem vindo!
Como vai notar nas respostas acima a utilização do recurso para enviar um anexo vai requer a utilização da ACTION_SEND_MULTIPLE, seu anexo será passado pela EXTRA_STREAM.
Acredito que com essa breve adaptação no código você vai conseguir.
Desde já agradeço sua participação e peço desculpas pela demora.
Até a próxima.
Olá Landerson,
Gostei do post,mas tenho uma dúvida ? o que significa a última linha do código ?
Obrigado,
Olá Eduardo, seja bem vindo!
Bem a linha a que se refere cria uma “caixa de diálogo” contendo os aplicativos capazes de realizar a Intent que passamos ao Android.
Esse comando CreateChooser pode ser compreendido através do link: https://developer.android.com/reference/android/content/Intent.html#createChooser(android.content.Intent, java.lang.CharSequence, android.content.IntentSender).
Obrigado por sua presença e por sua participação!
Até a próxima!
Bom dia, Estou com um problema preciso abrir um arquivo txt para enviar no corpo do email como faço para abrir o arquivo em delphi usaria:
AssignFile(arq, gsAppPath+’Email.txt’);
Usando firemonkey como seria?
Poderia me Ajudar,
Grato
Olá Claudio… Bem vindo! Você já tentou passar o conteúdo do seu txt como o body do e-mail? Basicamente é isso.
Você precisa saber onde está seu arquivo e carregá-lo normalmente… Loadfromfile por exemplo… Daí é tranquilo!
Olá.
Obrigado pelas dicas.
Gostaria de saber como enviar o email sem abrir o gerenciados de emails. Isso é muito importante.
Sem isso a coisa fica sem brilho.
Obrigado, abraço.
Olá! Faz tempo que estou tentando fazer isso com o delphi seattle e não estou conseguindo. Não reconhece as units declaradas. Pode atualizar esse exemplo?
Olá Normenio, Bem vindo!
Foram feitos alguns refactorys desde o XE5 até as versões mais recentes.
Selecione o recurso, e tente um CTRL+Shift + A para que o Delphi tente localizar ele para você.
Caso ainda esteja com problemas favor sinalizar.
Obrigado por sua participação e até a próxima!
Olá Landerson,
É possível enviar o email diretamente sem passar pelo
SharedActivity.startActivity(TJIntent.JavaClass.createChooser(Intent,
StrToJCharSequence(‘Qual aplicativo deseja usar?’)));
Como ficaria o código nesse caso ?
Olá Robson… tente fazer com os componentes indy, como na VCL.
Acredito que funcionem perfeitamente.
Não deixe de dar um feedback aqui depois com o resultado.
Grande abraço e até a próxima!
Olá Landerson
Funcionou sim, creio que seja o caminho, pois usando intents no delphi não tem ainda muito material na internet.
Obrigado.
Robson
Boa noite,
Usei o exemplo para gerar o email, muito bom!
Porem, preciso enviar um email contendo um pdf com o pedido completo para o email do cliente.
Existe como gerar pdf com firemonkey?
Grato
Oi Landerson, muito bom o Artigo meu Amigo, porem eu gostaria de ir um pouco alem. Gostaria de colocar por exemplo a parte ‘corpo do email’ em negrito.
Como faço ? Pode me ajudar ?
Olá Wallatas, seja bem vindo!
Note que neste exemplo utilizamos o tipo do e-mail como “plain/text”, você precisa alterar esse tipo para HTML, como eu já respondi anteriormente em um dos comentários:
Enfim, estando o seu tipo como html, aí é a mais pura sintaxe html para dar a seu e-mail a cara que você desejar.
Obrigado por sua participação e até a próxima.