Ich entwickle eine Anwendung in Android. Ich weiß nicht, wie ich eine E-Mail aus der Anwendung heraus senden kann?
Antworten
Zu viele Anzeigen?Die Lösung für dieses Problem ist einfach: Die Android-Dokumentation erklärt es.
( https://developer.Android.com/guide/components/intents-common.html#Email )
Das Wichtigste ist die Flagge: Sie ist ACTION_SENDTO
und nicht ACTION_SEND
Die andere wichtige Zeile lautet
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
Übrigens, wenn Sie eine leere Extra
die if()
am Ende funktioniert nicht und die App startet den E-Mail-Client nicht.
Gemäß der Android-Dokumentation. Wenn Sie sicherstellen möchten, dass Ihre Absicht nur von einer E-Mail-App (und nicht von anderen Textnachrichten- oder sozialen Apps) behandelt wird, dann verwenden Sie die ACTION_SENDTO
Aktion und fügen Sie die " mailto:
Datenschema". Zum Beispiel:
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);
}
}
Die Strategie der Nutzung .setType("message/rfc822")
o ACTION_SEND
scheint auch zu Anwendungen zu passen, die keine E-Mail-Clients sind, wie z. B. Android Beam y Bluetooth .
Verwendung von ACTION_SENDTO
und eine mailto:
URI scheint perfekt zu funktionieren, und wird in der Entwicklerdokumentation empfohlen . Wenn Sie dies jedoch auf den offiziellen Emulatoren tun und es sind keine E-Mail-Konten eingerichtet (oder es gibt keine E-Mail-Clients), erhalten Sie folgende Fehlermeldung:
Nicht unterstützte Aktion
Diese Aktion wird derzeit nicht unterstützt.
Wie unten dargestellt:
Es stellt sich heraus, dass die Emulatoren die Absicht in eine Aktivität namens com.android.fallback.Fallback
der die obige Meldung anzeigt. Offenbar ist dies beabsichtigt.
Wenn Sie möchten, dass Ihre Anwendung dies umgeht, damit sie auch auf den offiziellen Emulatoren korrekt funktioniert, können Sie dies überprüfen, bevor Sie versuchen, die E-Mail zu senden:
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 <johnsmith@yourdomain.com>" })
.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();
}
Weitere Informationen finden Sie unter die Entwicklerdokumentation .
Der Versand von E-Mails kann mit Intents erfolgen, die keine Konfiguration erfordern. Allerdings ist dann eine Benutzerinteraktion erforderlich und das Layout ist etwas eingeschränkt.
Das Erstellen und Versenden einer komplexeren E-Mail ohne Benutzerinteraktion erfordert den Aufbau eines eigenen Clients. Das erste Problem ist, dass die Sun Java API für E-Mail nicht verfügbar ist. Ich hatte Erfolg damit, die Apache Mime4j-Bibliothek für die Erstellung von E-Mails zu nutzen. Alles basierend auf den Dokumenten unter nilvec .
Hier ist ein Beispiel für einen Arbeitscode, der Folgendes öffnet Mail-Anwendung im Android-Gerät und automatisch ausgefüllt mit Ansprechen y Thema bei der Erstellung der Mail.
protected void sendEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:feedback@gmail.com"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Feedback");
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
}
Ich verwende den folgenden Code in meinen Anwendungen. Dies zeigt genau E-Mail-Client-Anwendungen, wie 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)));