it-swarm.com.de

Wie kann ich E-Mails von meiner Android-Anwendung aus senden?

Ich schreibe eine Anwendung für Android. Wie kann ich eine E-Mail daraus senden?

486
Rakesh

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[]{"[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();
}

Ansonsten müssen Sie Ihren eigenen Kunden schreiben.

928
Jeremy Logan

Verwenden Sie .setType("message/rfc822"), oder der Wähler zeigt Ihnen alle (viele) Anwendungen an, die die Sendeabsicht unterstützen.

188
Jeff S

Ich benutze das schon seit langer Zeit und es scheint gut zu sein, dass keine E-Mail-Apps auftauchen. Eine weitere Möglichkeit, eine Sende-E-Mail-Absicht zu senden:

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

Ich habe etwas im Sinne der aktuell akzeptierten Antwort verwendet, um E-Mails mit einer angehängten binären Fehlerprotokolldatei zu senden. GMail und K-9 senden es einwandfrei und es kommt auch auf meinem Mail-Server an. Das einzige Problem war mein Mail-Client der Wahl Thunderbird, der Probleme beim Öffnen/Speichern der angehängten Protokolldatei hatte. Tatsächlich hat es die Datei einfach nicht gespeichert, ohne sich zu beschweren.

Ich habe mir einen der Quellcodes dieser Mails angesehen und festgestellt, dass der Protokolldateianhang (verständlicherweise) den Mimetyp message/rfc822 hatte. Natürlich ist dieser Anhang keine angehängte E-Mail. Aber mit diesem kleinen Fehler kann Thunderbird nicht anmutig fertig werden. Das war also eine Art Mist.

Nach ein wenig Recherche und Experimentieren habe ich folgende Lösung gefunden:

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

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 problemlos mit der richtigen Absicht und dem richtigen Mime-Typ zugeführt werden.

Anschließend durchläuft es die Liste der verfügbaren Aktivitäten, die auf eine ACTION_SENDTO mailto-Protokollabsicht reagieren (dies sind nur E-Mail-Apps), und erstellt eine Auswahl anhand dieser Liste von Aktivitäten und der ursprünglichen ACTION_SEND-Absicht mit dem richtigen MIME-Typ.

Ein weiterer Vorteil ist, dass Skype nicht mehr aufgeführt wird (was auf den Mime-Typ "rfc822" reagiert).

49
tiguchi

Um JUST LET EMAIL APPS 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:" + "[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();
    }

}
33
wildzic

Die Strategie der Verwendung von .setType("message/rfc822") oder ACTION_SEND scheint auch für Apps zu passen, die keine E-Mail-Clients sind, wie Android Beam und Bluetooth.

Die Verwendung von ACTION_SENDTO und einer mailto:-URI scheint einwandfrei zu funktionieren, und wird in der Entwicklerdokumentation empfohlen . Wenn Sie dies jedoch mit den offiziellen Emulatoren tun und keine E-Mail-Konten eingerichtet sind (oder keine E-Mail-Clients vorhanden sind), erhalten Sie die folgende Fehlermeldung:

Nicht unterstützte Aktion

Diese Aktion wird derzeit nicht unterstützt.

Wie nachfolgend dargestellt:

Unsupported action: That action is not currently supported.

Es stellt sich heraus, dass die Emulatoren die Absicht auf eine Aktivität namens com.Android.fallback.Fallback auflösen, die die obige Meldung anzeigt. Anscheinend ist das beabsichtigt.

Wenn Sie möchten, dass Ihre App dies umgeht, funktioniert sie auch auf den offiziellen Emulatoren richtig. Sie können 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 <[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();
}

Weitere Informationen finden Sie in der Entwicklerdokumentation .

18
Sam

Ich habe dieses Problem mit einfachen Codezeilen gelöst, wie die Android-Dokumentation erklärt.

( https://developer.Android.com/guide/components/intents-common.html#Email )

Das wichtigste ist das Flag: Es ist ACTION_SENDTO und nicht ACTION_SEND

Die andere wichtige Linie ist 

intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***

Wenn Sie eine leere Extra senden, funktioniert if() am Ende nicht und die App startet den E-Mail-Client nicht.

Laut Android-Dokumentation. Wenn Sie sicherstellen möchten, dass Ihre Absicht nur von einer E-Mail-App (und nicht von anderen SMS- oder sozialen Apps) verarbeitet wird, verwenden Sie die Aktion ACTION_SENDTO und fügen Sie das Datenschema "mailto:" hinzu. 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);
    }
}
18
Pedro Varela

Das Versenden von E-Mails kann mit Intents erfolgen, für die keine Konfiguration erforderlich ist. Dann ist jedoch eine Benutzerinteraktion erforderlich, und das Layout wird ein wenig eingeschränkt sein.

Erstellen und Senden einer komplexeren E-Mail ohne Benutzerinteraktion erfordert das Erstellen eines eigenen Clients. Die erste Sache ist, dass die Sun Java API für E-Mail nicht verfügbar ist. Ich hatte die Apache Mime4j-Bibliothek erfolgreich zum Erstellen von E-Mails genutzt. Alles basierend auf den Dokumenten unter nilvec .

12
Rene

versuchen Sie es einfach 

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

        }
    });
}
3
NagarjunaReddy

Hier ist der Beispiel-Arbeitscode, der Mail-Anwendung auf dem Android-Gerät öffnet und automatisch mit An Adresse und Betreff in der verfassenden Mail gefüllt wird.

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);
    }
}
3
Sridhar Nalam

Ich verwende den folgenden Code in meinen Apps. Dies zeigt genau E-Mail-Client-Apps wie Google Mail.

    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)));
3
lomza

Andere Lösung kann sein

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

Angenommen, auf dem Android-Gerät ist die GMail-App bereits installiert.

2
silentsudo

Diese Funktion zielt zunächst direkt auf das Senden von E-Mail-Nachrichten ab. Wenn Google Mail nicht gefunden wird, wird der Auswahlbefehl für die Zielgruppe angezeigt. Ich habe diese Funktion in vielen kommerziellen Apps verwendet und sie funktioniert einwandfrei. Hoffe es wird dir helfen:

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);
        }
    }
}
2

Verwenden Sie dies für E-Mail senden ...

boolean success = EmailIntentBuilder.from(activity)
    .to("[email protected]")
    .cc("[email protected]")
    .subject("Error report")
    .body(buildErrorReport())
    .start();

verwenden Sie Build Gradle:

compile 'de.cketti.mailto:email-intent-builder:1.0.0'
2
Manish

Dies zeigt Ihnen nur die E-Mail-Clients (sowie aus unbekannten Gründen auch Paypal). 

 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();
    }
}
2
Avi Parshan

So habe ich es gemacht. Schön und einfach.

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);
1
Dog Lover
 Intent emailIntent = new Intent(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**
0
Tousif Akram

Ich habe diesen Code zum Senden von E-Mails verwendet, indem der Standard-E-Mail-Erstellungsabschnitt direkt gestartet wurde.

    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();
    }
0
Faris Muhammed

Diese Methode funktioniert für mich. Öffnen Sie die Google Mail-App (sofern installiert) und setzen Sie 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);
}
0
psycho

Versuche dies:

String mailto = "mailto:[email protected]" +
    "?cc=" + "[email protected]" +
    "&subject=" + Uri.encode(subject) +
    "&body=" + Uri.encode(bodyText);

Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse(mailto));

try {
    startActivity(emailIntent);
} catch (ActivityNotFoundException e) {
    //TODO: Handle case where no email app is available
}

Mit dem obigen Code wird der bevorzugte E-Mail-Client des Benutzers geöffnet, in dem die E-Mail bereits zum Versand bereitsteht.

Quelle

0
Dan Bray
/**
 * 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.
 */
public static void sendEmail(Context context, String[] emails, String subject, boolean forceGmail) {

    Intent i = new Intent(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.
 */
public static boolean isPackageInstalled(@NonNull Context context, @NonNull String packageName) {
    PackageManager pm = context.getPackageManager();
    if (pm != null) {
        try {
            pm.getPackageInfo(packageName, 0);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
    }
    return false;
}
0
Gal Rom