Enviando e-mail no Android com Delphi XE5

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.

Enviando e-mil no Android com Delphi XE5

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.

Tela da Aplicação de e-mail

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!

 

 

 

 

 

34 respostas para “Enviando e-mail no Android com Delphi XE5”

  1. 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.

    1. 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!

      1. 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!

        1. 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!

    1. 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!

    1. 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!

  2. 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

    1. 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!

    1. 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!

  3. 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.

    1. 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!

    1. 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.

    1. 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!

  4. 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

    1. 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!

  5. 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.

    1. 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!

  6. 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 ?

    1. 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!

  7. 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

Deixe uma resposta