Intent i =newIntent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL ,newString[]{"[email protected]"});
i.putExtra(Intent.EXTRA_SUBJECT,"subject of email");
i.putExtra(Intent.EXTRA_TEXT ,"body of email");try{
startActivity(Intent.createChooser(i,"Send mail..."));}catch(android.content.ActivityNotFoundException ex){Toast.makeText(MyActivity.this,"There are no email clients installed.",Toast.LENGTH_SHORT).show();}
Caso contrário, você terá que escrever seu próprio cliente.
No código acima, não há identificação de e-mail do remetente. Então, como a mensagem é enviada?
KIRAN KJ
38
KIRAN: Você precisará examinar como as Intents funcionam para entender isso. Basicamente, ele abre um aplicativo de email com o destinatário, o assunto e o corpo já preenchidos. Cabe ao aplicativo de e-mail fazer o envio.
11309 Jeremy Logan
8
O email não aparece no campo "PARA" iniciando a atividade. Alguém sabe?
Hamza Waqas 26/03
11
a grande contribuição deste comentário é: mensagem / rfc822
Guilherme Oliveira
22
adicione-os para garantir que o seletor exiba apenas aplicativos de e-mail: Intent i = new Intent(Intent.ACTION_SENDTO);i.setType("message/rfc822");i.setData(Uri.parse("mailto:"));
Edris 7/15
194
Use .setType("message/rfc822")ou o seletor mostrará todos os (muitos) aplicativos que suportam a intenção de envio.
Bom, isso deve ter mais votos positivos. Você não notará os testes no emulador, mas quando enviar "texto / texto" em um dispositivo real, ele fornecerá uma lista de mais de 15 aplicativos! então "message / rfc822" é definitivamente recomendado (o padrão do email).
Blundell
7
@Blundell oi, mas não vi diferença depois de mudar paramessage/rfc822
draw
2
Você pode remover o bluetooth da lista? Isso também aparece com esse tipo. +1, porém, truque puro!
Ingh.am
4
Salvo nosso bacon. Não consigo imaginar explicar ao cliente que o usuário pode twittar solicitações de suporte em vez de enviá-las por email.
23412 Kevin Galligan
1
+1111111 Isso merece + 1s infinitos para que outros possam ver isso. Eu perdi essa parte e tive que lidar com esse problema por um tempo!
ChallengeAccepted
89
Eu uso isso há muito tempo e parece bom, nenhum aplicativo que não seja de e-mail aparecendo. Apenas outra maneira de enviar uma intenção de enviar email:
Intent intent =newIntent(Intent.ACTION_SENDTO);// it's not ACTION_SEND
intent.putExtra(Intent.EXTRA_SUBJECT,"Subject of email");
intent.putExtra(Intent.EXTRA_TEXT,"Body of email");
intent.setData(Uri.parse("mailto:[email protected]"));// or just "mailto:" for blank
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);// this will make such that when user returns to your app, your app is displayed, instead of the email app.
startActivity(intent);
Eu estava usando algo como a resposta atualmente aceita para enviar emails com um arquivo de log de erros binários anexado. O GMail e o K-9 o enviam muito bem e também chegam bem no meu servidor de email. O único problema foi o meu cliente de email Thunderbird, que teve problemas com a abertura / salvamento do arquivo de log anexado. Na verdade, ele simplesmente não salvou o arquivo sem reclamar.
Examinei um desses códigos-fonte do correio e notei que o anexo do arquivo de log tinha (compreensivelmente) o tipo mime message/rfc822 . É claro que esse anexo não é um email anexado. Mas o Thunderbird não pode lidar com esse pequeno erro normalmente. Então isso foi meio chato.
Depois de um pouco de pesquisa e experimentação, vim com a seguinte solução:
Intent i =newIntent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM,Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL,newString[]{
ANDROID_SUPPORT_EMAIL
});
i.putExtra(Intent.EXTRA_SUBJECT,"Crash report");
i.putExtra(Intent.EXTRA_TEXT,"Some crash report details");
startActivity(createEmailOnlyChooserIntent(i,"Send via email"));
Como você pode ver, o método createEmailOnlyChooserIntent pode ser facilmente alimentado com a intenção correta e o tipo MIME correto.
Em seguida, ele percorre a lista de atividades disponíveis que respondem a uma mailtointenção do protocolo ACTION_SENDTO (que são apenas aplicativos de email) e constrói um seletor com base nessa lista de atividades e na intenção ACTION_SEND original com o tipo de mímica correto.
Outra vantagem é que o Skype não está mais listado (o que responde ao tipo mime rfc822).
Acabei de inserir o seu trecho de código e funciona bem. Antes de haver aplicativos listados como Google Drive, Skype etc. Mas não há como enviar um email para fora do aplicativo sem chamar outro aplicativo? Acabei de ler o artigo sobre o cliente de e-mail que @Rene postet acima, mas parece ser muito complicado para apenas enviar um e-mail simples
Alex Cio
Excelente resposta. Eu também tinha o Skype e o Google Drive ACTION_SEND, e isso explica tudo muito bem.
darrenp 4/09/13
1
A solução mais popular acima retorna o Skype e o Vkontakte também. Esta solução é melhor.
Denis Kutlubaev
o que é crashLogFile? onde ele inicializou? pease sepecify
Noufal
@Noufal Este é apenas um pouco da minha própria base de código. É uma Fileinstância que aponta para um arquivo de log de falha que meus aplicativos Android criam em segundo plano, caso haja uma exceção não detectada. Esse exemplo deve apenas ilustrar como adicionar um anexo de email. Você também pode anexar qualquer outro arquivo do armazenamento externo (uma imagem por exemplo). Você também pode remover essa linha crashLogFilepara obter um exemplo de trabalho.
tiguchi
37
Para deixar EMAIL APPS para resolver sua intenção, você precisa especificar ACTION_SENDTO como Ação e mailto como Dados.
O mais importante é a bandeira: é ACTION_SENDTO, e nãoACTION_SEND
A outra linha importante é
intent.setData(Uri.parse("mailto:"));***// only email apps should handle this***
A propósito, se você enviar um vazio Extra, o if()final não funcionará e o aplicativo não iniciará o cliente de email.
De acordo com a documentação do Android. Se você deseja garantir que sua intenção seja tratada apenas por um aplicativo de email (e não por outros aplicativos de mensagens de texto ou sociais), use a ACTION_SENDTOação e inclua o " mailto:" esquema de dados. Por exemplo:
publicvoid composeEmail(String[] addresses,String subject){Intent intent =newIntent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));// only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, addresses);
intent.putExtra(Intent.EXTRA_SUBJECT, subject);if(intent.resolveActivity(getPackageManager())!=null){
startActivity(intent);}}
A estratégia de usar .setType("message/rfc822")ou ACTION_SENDparece também corresponder a aplicativos que não são clientes de email, como Android Beam e Bluetooth .
O uso de ACTION_SENDTOum mailto:URI parece funcionar perfeitamente e é recomendado na documentação do desenvolvedor . No entanto, se você fizer isso nos emuladores oficiais e não houver contas de email configuradas (ou não houver clientes de email), você receberá o seguinte erro:
Se você deseja que seu aplicativo contorne isso para que também funcione corretamente nos emuladores oficiais, verifique-o antes de tentar enviar o email:
privatevoid sendEmail(){Intent intent =newIntent(Intent.ACTION_SENDTO).setData(newUri.Builder().scheme("mailto").build()).putExtra(Intent.EXTRA_EMAIL,newString[]{"John Smith <[email protected]>"}).putExtra(Intent.EXTRA_SUBJECT,"Email subject").putExtra(Intent.EXTRA_TEXT,"Email body");ComponentName emailApp = intent.resolveActivity(getPackageManager());ComponentName unsupportedAction =ComponentName.unflattenFromString("com.android.fallback/.Fallback");if(emailApp !=null&&!emailApp.equals(unsupportedAction))try{// Needed to customise the chooser dialog title since it might default to "Share with"// Note that the chooser will still be skipped if only one app is matchedIntent chooser =Intent.createChooser(intent,"Send email with");
startActivity(chooser);return;}catch(ActivityNotFoundException ignored){}Toast.makeText(this,"Couldn't find an email app and account",Toast.LENGTH_LONG).show();}
O envio de email pode ser feito com o Intents, que não exigirá configuração. Mas isso exigirá interação do usuário e o layout será um pouco restrito.
Criar e enviar um email mais complexo sem a interação do usuário implica a criação de seu próprio cliente. A primeira coisa é que a API Sun Java para email não está disponível. Tive sucesso ao alavancar a biblioteca Apache Mime4j para criar email. Tudo baseado nos documentos da nilvec .
Aqui está o código de exemplo de trabalho que abre o aplicativo de correio no dispositivo Android e é preenchido automaticamente com o endereço Para e Assunto no e- mail de composição.
Obrigado. Comparando com uma solução do @Avi Parshan, você define um email setData()e o Avi define putExtra(). Ambas as variantes estão funcionando. Mas se remover setDatae usar apenas intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});, haveria um ActivityNotFoundException.
precisa saber é o seguinte
5
Eu uso o código abaixo em meus aplicativos. Isso mostra exatamente os aplicativos clientes de e-mail, como o Gmail.
Ótima solução! Evita muitos aplicativos inadequados (usados principalmente como "Compartilhar"). Não adicione intent.type = "message/rfc822"; intent.type = "text/html";aqui, pois isso levará à exceção.
Essa função primeiro direciona o gmail com intenção de enviar e-mail, se o gmail não for encontrado, promova o seletor de intenção. Eu usei essa função em muitos aplicativos comerciais e está funcionando bem. Espero que ajude você:
@PedroVarela sempre podemos verificar a atividade não encontrada exceção.
silentsudo
1
Sim, nós podemos. Mas sua solução não é a correta. A documentação do Android indica claramente o que você deve fazer para mostrar apenas os aplicativos de correio no seletor de intenção. Você escreveu "Supondo que a maioria dos dispositivos Android já tenha o aplicativo Gmail instalado"; E se for um dispositivo raiz e o usuário excluir o cliente do Gmail? Suponha que você esteja criando seu próprio aplicativo de email ?, se um usuário enviar um email, seu aplicativo não estará nessa lista. O que acontece se o gmail alterar o nome do pacote? Você vai atualizar seu aplicativo?
/**
* Will start the chosen Email app
*
* @param context current component context.
* @param emails Emails you would like to send to.
* @param subject The subject that will be used in the Email app.
* @param forceGmail True - if you want to open Gmail app, False otherwise. If the Gmail
* app is not installed on this device a chooser will be shown.
*/publicstaticvoid sendEmail(Context context,String[] emails,String subject,boolean forceGmail){Intent i =newIntent(Intent.ACTION_SENDTO);
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL, emails);
i.putExtra(Intent.EXTRA_SUBJECT, subject);if(forceGmail && isPackageInstalled(context,"com.google.android.gm")){
i.setPackage("com.google.android.gm");
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(i);}else{try{
context.startActivity(Intent.createChooser(i,"Send mail..."));}catch(ActivityNotFoundException e){Toast.makeText(context,"No email app is installed on your device...",Toast.LENGTH_SHORT).show();}}}/**
* Check if the given app is installed on this devuice.
*
* @param context current component context.
* @param packageName The package name you would like to check.
* @return True if this package exist, otherwise False.
*/publicstaticboolean isPackageInstalled(@NonNullContext context,@NonNullString packageName){PackageManager pm = context.getPackageManager();if(pm !=null){try{
pm.getPackageInfo(packageName,0);returntrue;}catch(PackageManager.NameNotFoundException e){
e.printStackTrace();}}returnfalse;}
Intent emailIntent =newIntent(Intent.ACTION_SENDTO,Uri.fromParts("mailto","[email protected]",null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT,"Forgot Password");
emailIntent.putExtra(Intent.EXTRA_TEXT,"Write your Pubg user name or Phone Number");
startActivity(Intent.createChooser(emailIntent,"Send email..."));**strong text**
String mailto ="mailto:[email protected]"+"?cc="+"[email protected]"+"&subject="+Uri.encode(subject)+"&body="+Uri.encode(bodyText);Intent emailIntent =newIntent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));try{
startActivity(emailIntent);}catch(ActivityNotFoundException e){//TODO: Handle case where no email app is available}
O código acima abrirá o cliente de email favorito dos usuários pré-preenchido com o email pronto para enviar.
Respostas:
A melhor (e mais fácil) maneira é usar um
Intent
:Caso contrário, você terá que escrever seu próprio cliente.
fonte
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
Use
.setType("message/rfc822")
ou o seletor mostrará todos os (muitos) aplicativos que suportam a intenção de envio.fonte
message/rfc822
Eu uso isso há muito tempo e parece bom, nenhum aplicativo que não seja de e-mail aparecendo. Apenas outra maneira de enviar uma intenção de enviar email:
fonte
Eu estava usando algo como a resposta atualmente aceita para enviar emails com um arquivo de log de erros binários anexado. O GMail e o K-9 o enviam muito bem e também chegam bem no meu servidor de email. O único problema foi o meu cliente de email Thunderbird, que teve problemas com a abertura / salvamento do arquivo de log anexado. Na verdade, ele simplesmente não salvou o arquivo sem reclamar.
Examinei um desses códigos-fonte do correio e notei que o anexo do arquivo de log tinha (compreensivelmente) o tipo mime
message/rfc822
. É claro que esse anexo não é um email anexado. Mas o Thunderbird não pode lidar com esse pequeno erro normalmente. Então isso foi meio chato.Depois de um pouco de pesquisa e experimentação, vim com a seguinte solução:
Pode ser usado da seguinte maneira:
Como você pode ver, o método createEmailOnlyChooserIntent pode ser facilmente alimentado com a intenção correta e o tipo MIME correto.
Em seguida, ele percorre a lista de atividades disponíveis que respondem a uma
mailto
intenção do protocolo ACTION_SENDTO (que são apenas aplicativos de email) e constrói um seletor com base nessa lista de atividades e na intenção ACTION_SEND original com o tipo de mímica correto.Outra vantagem é que o Skype não está mais listado (o que responde ao tipo mime rfc822).
fonte
ACTION_SEND
, e isso explica tudo muito bem.File
instância que aponta para um arquivo de log de falha que meus aplicativos Android criam em segundo plano, caso haja uma exceção não detectada. Esse exemplo deve apenas ilustrar como adicionar um anexo de email. Você também pode anexar qualquer outro arquivo do armazenamento externo (uma imagem por exemplo). Você também pode remover essa linhacrashLogFile
para obter um exemplo de trabalho.Para deixar EMAIL APPS para resolver sua intenção, você precisa especificar ACTION_SENDTO como Ação e mailto como Dados.
fonte
Resolvi esse problema com linhas simples de código, conforme explica a documentação do Android.
( https://developer.android.com/guide/components/intents-common.html#Email )
O mais importante é a bandeira: é
ACTION_SENDTO
, e nãoACTION_SEND
A outra linha importante é
A propósito, se você enviar um vazio
Extra
, oif()
final não funcionará e o aplicativo não iniciará o cliente de email.De acordo com a documentação do Android. Se você deseja garantir que sua intenção seja tratada apenas por um aplicativo de email (e não por outros aplicativos de mensagens de texto ou sociais), use a
ACTION_SENDTO
ação e inclua o "mailto:
" esquema de dados. Por exemplo:fonte
A estratégia de usar
.setType("message/rfc822")
ouACTION_SEND
parece também corresponder a aplicativos que não são clientes de email, como Android Beam e Bluetooth .O uso de
ACTION_SENDTO
ummailto:
URI parece funcionar perfeitamente e é recomendado na documentação do desenvolvedor . No entanto, se você fizer isso nos emuladores oficiais e não houver contas de email configuradas (ou não houver clientes de email), você receberá o seguinte erro:Como mostrado abaixo:
Acontece que os emuladores resolvem a intenção de uma atividade chamada
com.android.fallback.Fallback
, que exibe a mensagem acima.Aparentemente, isso ocorre por design.Se você deseja que seu aplicativo contorne isso para que também funcione corretamente nos emuladores oficiais, verifique-o antes de tentar enviar o email:
Encontre mais informações na documentação do desenvolvedor .
fonte
O envio de email pode ser feito com o Intents, que não exigirá configuração. Mas isso exigirá interação do usuário e o layout será um pouco restrito.
Criar e enviar um email mais complexo sem a interação do usuário implica a criação de seu próprio cliente. A primeira coisa é que a API Sun Java para email não está disponível. Tive sucesso ao alavancar a biblioteca Apache Mime4j para criar email. Tudo baseado nos documentos da nilvec .
fonte
Aqui está o código de exemplo de trabalho que abre o aplicativo de correio no dispositivo Android e é preenchido automaticamente com o endereço Para e Assunto no e- mail de composição.
fonte
setData()
e o Avi defineputExtra()
. Ambas as variantes estão funcionando. Mas se removersetData
e usar apenasintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
, haveria umActivityNotFoundException
.Eu uso o código abaixo em meus aplicativos. Isso mostra exatamente os aplicativos clientes de e-mail, como o Gmail.
fonte
Isso mostrará apenas os clientes de e-mail (além do PayPal por algum motivo desconhecido)
fonte
intent.type = "message/rfc822"; intent.type = "text/html";
aqui, pois isso levará à exceção.Foi assim que eu fiz. Agradável e simples.
fonte
Essa função primeiro direciona o gmail com intenção de enviar e-mail, se o gmail não for encontrado, promova o seletor de intenção. Eu usei essa função em muitos aplicativos comerciais e está funcionando bem. Espero que ajude você:
fonte
simples tente este
fonte
Outra solução pode ser
Supondo que a maioria dos dispositivos Android já tenha o aplicativo GMail instalado.
fonte
Use isso para enviar email ...
use build gradle:
fonte
Usei esse código para enviar e-mail iniciando a seção de composição do aplicativo de e-mail padrão diretamente.
fonte
Este método funciona para mim. Ele abre o aplicativo Gmail (se instalado) e define mailto.
fonte
fonte
fonte
Tente o seguinte:
O código acima abrirá o cliente de email favorito dos usuários pré-preenchido com o email pronto para enviar.
Fonte
fonte