555 Stimmen

Wie versende ich E-Mails aus meiner Android-Anwendung?

Ich entwickle eine Anwendung in Android. Ich weiß nicht, wie ich eine E-Mail aus der Anwendung heraus senden kann?

1018voto

Jeremy Logan Punkte 46499

Der beste (und einfachste) Weg ist die Verwendung einer Intent :

Intent i = new Intent(Intent.ACTION_SEND);
i.setType("message/rfc822");
i.putExtra(Intent.EXTRA_EMAIL  , new String[]{"recipient@example.com"});
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();
}

Andernfalls müssen Sie Ihren eigenen Client schreiben.

206voto

Jeff S Punkte 3196

Utilice .setType("message/rfc822") oder die Auswahlliste zeigt Ihnen alle (vielen) Anwendungen, die die Sendeabsicht unterstützen.

99voto

Ich benutze das Programm schon seit langer Zeit und es scheint gut zu sein, keine Nicht-E-Mail-Anwendungen werden angezeigt. Nur ein weiterer Weg, um eine E-Mail senden Absicht zu senden:

Intent intent = new Intent(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:default@recipient.com")); // 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);

58voto

tiguchi Punkte 5352

Ich habe etwas Ähnliches wie die derzeit akzeptierte Antwort verwendet, um E-Mails mit einer angehängten binären Fehlerprotokolldatei zu versenden. GMail und K-9 senden sie problemlos und sie kommt auch auf meinem Mailserver gut an. Das einzige Problem war mein bevorzugter Mail-Client Thunderbird, der Probleme mit dem Öffnen/Speichern der angehängten Protokolldatei hatte. Tatsächlich speicherte er die Datei einfach nicht, ohne sich zu beschweren.

Ich habe mir den Quellcode einer dieser Mails angesehen und festgestellt, dass der Anhang der Protokolldatei (verständlicherweise) den Mime-Typ message/rfc822 . Natürlich ist dieser Anhang keine angehängte E-Mail. Aber Thunderbird kommt mit diesem kleinen Fehler nicht zurecht. Das war also ein ziemlicher Reinfall.

Nach einigen Recherchen und Experimenten bin ich auf folgende Lösung gekommen:

public Intent createEmailOnlyChooserIntent(Intent source,
    CharSequence chooserTitle) {
    Stack<Intent> intents = new Stack<Intent>();
    Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto",
            "info@domain.com", 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);
    }
}

Es kann wie folgt verwendet werden:

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"));

Wie Sie sehen, kann die createEmailOnlyChooserIntent-Methode einfach mit dem richtigen Intent und dem richtigen Mime-Typ gefüttert werden.

Anschließend wird die Liste der verfügbaren Aktivitäten durchlaufen, die auf eine ACTION_SENDTO mailto Protokoll-Intent (die nur E-Mail-Anwendungen sind) und erstellt eine Auswahl auf der Grundlage dieser Liste von Aktivitäten und der ursprünglichen ACTION_SEND-Intent mit dem richtigen Mime-Typ.

Ein weiterer Vorteil ist, dass Skype nicht mehr aufgeführt ist (das zufällig auf den Mime-Typ rfc822 reagiert).

39voto

wildzic Punkte 406

A E-MAIL-ANWENDUNGEN EINFACH ZULASSEN um Ihre Absicht zu lösen, müssen Sie ACTION_SENDTO als Aktion und mailto als Daten angeben.

private void sendEmail(){

    Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
    emailIntent.setData(Uri.parse("mailto:" + "recipient@example.com")); // You can use "mailto:" if you don't know the address beforehand.
    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();
    }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X