Ich schreibe eine Anwendung für Android. Wie kann ich eine E-Mail daraus senden?
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.
Verwenden Sie .setType("message/rfc822")
, oder der Wähler zeigt Ihnen alle (viele) Anwendungen an, die die Sendeabsicht unterstützen.
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);
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).
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();
}
}
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:
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 .
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);
}
}
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 .
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 :"));
}
});
}
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);
}
}
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)));
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.
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);
}
}
}
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'
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();
}
}
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);
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**
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();
}
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);
}
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.
/**
* 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;
}