exchange - ¿Cómo puedo enviar correos electrónicos desde mi aplicación de Android?
configurar correo outlook en android (18)
Estoy escribiendo una aplicación para Android. ¿Cómo puedo enviar un correo electrónico desde allí?
Aquí está el código de trabajo de muestra que abre la aplicación de correo en el dispositivo Android y se llena automáticamente con A dirección y asunto en el correo de composición.
protected void sendEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:[email protected]"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Así es como lo hice. Agradable y sencillo.
String emailUrl = "mailto:[email protected]?subject=Subject Text&body=Body Text";
Intent request = new Intent(Intent.ACTION_VIEW);
request.setData(Uri.parse(emailUrl));
startActivity(request);
El envío de correo electrónico se puede hacer con Intenciones que no requerirán configuración. Pero luego requerirá la interacción del usuario y el diseño será un poco restringido.
Construir y enviar un correo electrónico más complejo sin la interacción del usuario implica construir su propio cliente. Lo primero es que la API de Java de Sun para correo electrónico no está disponible. He tenido éxito aprovechando la biblioteca Apache Mime4j para crear correo electrónico. Todo basado en los documentos en nilvec .
Esta función primero dirige directamente gmail para enviar correos electrónicos, si no se encuentra gmail, promueva el selector de intenciones. Utilicé esta función en muchas aplicaciones comerciales y está funcionando bien. Espero que te ayude:
public static void sentEmail(Context mContext, String[] addresses, String subject, String body) {
try {
Intent sendIntentGmail = new Intent(Intent.ACTION_VIEW);
sendIntentGmail.setType("plain/text");
sendIntentGmail.setData(Uri.parse(TextUtils.join(",", addresses)));
sendIntentGmail.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
sendIntentGmail.putExtra(Intent.EXTRA_EMAIL, addresses);
if (subject != null) sendIntentGmail.putExtra(Intent.EXTRA_SUBJECT, subject);
if (body != null) sendIntentGmail.putExtra(Intent.EXTRA_TEXT, body);
mContext.startActivity(sendIntentGmail);
} catch (Exception e) {
//When Gmail App is not installed or disable
Intent sendIntentIfGmailFail = new Intent(Intent.ACTION_SEND);
sendIntentIfGmailFail.setType("*/*");
sendIntentIfGmailFail.putExtra(Intent.EXTRA_EMAIL, addresses);
if (subject != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_SUBJECT, subject);
if (body != null) sendIntentIfGmailFail.putExtra(Intent.EXTRA_TEXT, body);
if (sendIntentIfGmailFail.resolveActivity(mContext.getPackageManager()) != null) {
mContext.startActivity(sendIntentIfGmailFail);
}
}
}
Estaba usando algo en la línea de la respuesta actualmente aceptada para enviar correos electrónicos con un archivo de registro de errores binarios adjunto. GMail y K-9 lo envían bien y también llega bien a mi servidor de correo. El único problema fue mi cliente de correo de Thunderbird, que tenía problemas para abrir / guardar el archivo de registro adjunto. De hecho, simplemente no guardó el archivo sin quejarse.
Eché un vistazo a uno de los códigos fuente de estos correos y noté que el archivo adjunto de registro tenía (de manera comprensible) el message/rfc822
tipo mime message/rfc822
. Por supuesto que el archivo adjunto no es un correo electrónico adjunto. Pero Thunderbird no puede hacer frente a ese pequeño error con gracia. Así que eso fue una especie de rollo.
Después de un poco de investigación y experimentación se me ocurrió la siguiente solución:
public Intent createEmailOnlyChooserIntent(Intent source,
CharSequence chooserTitle) {
Stack<Intent> intents = new Stack<Intent>();
Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
"[email protected]", null));
List<ResolveInfo> activities = getPackageManager()
.queryIntentActivities(i, 0);
for(ResolveInfo ri : activities) {
Intent target = new Intent(source);
target.setPackage(ri.activityInfo.packageName);
intents.add(target);
}
if(!intents.isEmpty()) {
Intent chooserIntent = Intent.createChooser(intents.remove(0),
chooserTitle);
chooserIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS,
intents.toArray(new Parcelable[intents.size()]));
return chooserIntent;
} else {
return Intent.createChooser(source, chooserTitle);
}
}
Se puede utilizar de la siguiente manera:
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("*/*");
i.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(crashLogFile));
i.putExtra(Intent.EXTRA_EMAIL, new String[] {
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 puede ver, el método createEmailOnlyChooserIntent puede alimentarse fácilmente con la intención correcta y el tipo de mime correcto.
Luego pasa a través de la lista de actividades disponibles que responden a una intención del protocolo de correo electrónico ACTION_SENDTO (que son solo aplicaciones de correo electrónico) y construye un selector basado en esa lista de actividades y la intención ACTION_SEND original con el tipo mime correcto.
Otra ventaja es que Skype ya no aparece en la lista (lo que sucede es que responde al tipo mime rfc822).
Este método funciona para mí. Abre la aplicación de Gmail (si está instalada) y configura mailto.
public void openGmail(Activity activity) {
Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setType("text/plain");
emailIntent.setType("message/rfc822");
emailIntent.setData(Uri.parse("mailto:"+activity.getString(R.string.mail_to)));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, activity.getString(R.string.app_name) + " - info ");
final PackageManager pm = activity.getPackageManager();
final List<ResolveInfo> matches = pm.queryIntentActivities(emailIntent, 0);
ResolveInfo best = null;
for (final ResolveInfo info : matches)
if (info.activityInfo.packageName.endsWith(".gm") || info.activityInfo.name.toLowerCase().contains("gmail"))
best = info;
if (best != null)
emailIntent.setClassName(best.activityInfo.packageName, best.activityInfo.name);
activity.startActivity(emailIntent);
}
Esto le mostrará solo los clientes de correo electrónico (así como PayPal por alguna razón desconocida)
public void composeEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "Body");
try {
startActivity(Intent.createChooser(intent, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(MainActivity.this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
}
He estado usando esto desde hace mucho tiempo y parece bueno, no aparecen aplicaciones que no sean de correo electrónico. Solo otra forma de enviar un intento de envío de correo electrónico:
Intent intent = new Intent(Intent.ACTION_SENDTO); // it''s not ACTION_SEND
intent.setType("text/plain");
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);
La estrategia de usar .setType("message/rfc822")
o ACTION_SEND
también parece coincidir con aplicaciones que no son clientes de correo electrónico, como Android Beam y Bluetooth .
El uso de ACTION_SENDTO
y mailto:
URI parece funcionar perfectamente, y se recomienda en la documentación del desarrollador . Sin embargo, si hace esto en los emuladores oficiales y no hay ninguna cuenta de correo electrónico configurada (o no hay clientes de correo), aparece el siguiente error:
Acción no soportada
Esa acción no es compatible actualmente.
Como se muestra abajo:
Resulta que los emuladores resuelven la intención de una actividad llamada com.android.fallback.Fallback
, que muestra el mensaje anterior. Al parecer esto es por diseño.
Si desea que su aplicación evite esto para que también funcione correctamente en los emuladores oficiales, puede verificarlo antes de enviar el correo electrónico:
private void sendEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO)
.setData(new Uri.Builder().scheme("mailto").build())
.putExtra(Intent.EXTRA_EMAIL, new String[]{ "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 matched
Intent 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();
}
Encuentra más información en la documentación del desarrollador .
Otra solución puede ser
Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND);
emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
emailIntent.setType("plain/text");
emailIntent.setClassName("com.google.android.gm", "com.google.android.gm.ComposeActivityGmail");
emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, new String[]{"[email protected]"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi");
startActivity(emailIntent);
Suponiendo que la mayor parte del dispositivo Android tiene la aplicación GMail ya instalada.
Para JUST LET EMAIL APPS para resolver su intención, debe especificar ACTION_SENDTO como Acción y enviar por correo como Datos.
private void sendEmail(){
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:" + "[email protected]"));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "My email''s subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "My email''s body");
try {
startActivity(Intent.createChooser(emailIntent, "Send email using..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(Activity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
}
}
Resolví este problema con líneas de código simples, como explica la documentación de Android.
( https://developer.android.com/guide/components/intents-common.html#Email )
La más importante es la bandera: es ACTION_SENDTO
y no ACTION_SEND
La otra línea importante es
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
Por cierto, si envía un Extra
vacío, el if()
al final no funcionará y la aplicación no iniciará el cliente de correo electrónico.
Según la documentación de Android. Si desea asegurarse de que su intención sea manejada solo por una aplicación de correo electrónico (y no por otra mensajería de texto o aplicaciones sociales), use la acción ACTION_SENDTO
e incluya el esquema de datos " mailto:
". Por ejemplo:
public void composeEmail(String[] addresses, String subject) {
Intent intent = new Intent(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);
}
}
Use .setType("message/rfc822")
o el selector le mostrará todas las (muchas) aplicaciones que admiten el intento de envío.
Utilice esto para enviar correo electrónico ...
boolean success = EmailIntentBuilder.from(activity)
.to("[email protected]")
.cc("[email protected]")
.subject("Error report")
.body(buildErrorReport())
.start();
usar construir gradle:
compile ''de.cketti.mailto:email-intent-builder:1.0.0''
Yo uso el siguiente código en mis aplicaciones. Esto muestra exactamente las aplicaciones de cliente de correo electrónico, como Gmail.
Intent contactIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", getString(R.string.email_to), null));
contactIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.email_subject));
startActivity(Intent.createChooser(contactIntent, getString(R.string.email_chooser)));
simplemente prueba este
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
buttonSend = (Button) findViewById(R.id.buttonSend);
textTo = (EditText) findViewById(R.id.editTextTo);
textSubject = (EditText) findViewById(R.id.editTextSubject);
textMessage = (EditText) findViewById(R.id.editTextMessage);
buttonSend.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String to = textTo.getText().toString();
String subject = textSubject.getText().toString();
String message = textMessage.getText().toString();
Intent email = new Intent(Intent.ACTION_SEND);
email.putExtra(Intent.EXTRA_EMAIL, new String[] { to });
// email.putExtra(Intent.EXTRA_CC, new String[]{ to});
// email.putExtra(Intent.EXTRA_BCC, new String[]{to});
email.putExtra(Intent.EXTRA_SUBJECT, subject);
email.putExtra(Intent.EXTRA_TEXT, message);
// need this to prompts email client only
email.setType("message/rfc822");
startActivity(Intent.createChooser(email, "Choose an Email client :"));
}
});
}
Utilicé este código para enviar correo lanzando directamente la sección de redacción de la aplicación de correo predeterminada.
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[email protected]"});
i.putExtra(Intent.EXTRA_SUBJECT, "Subject");
i.putExtra(Intent.EXTRA_TEXT , "body of email");
try {
startActivity(Intent.createChooser(i, "Send mail..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(this, "There are no email clients installed.", Toast.LENGTH_SHORT).show();
}
La mejor manera (y la más fácil) es usar un Intent
:
Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"[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();
}
De lo contrario tendrás que escribir tu propio cliente.