Antworten:
Der beste (und einfachste) Weg ist die Verwendung eines 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.
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
Verwenden Sie .setType("message/rfc822")
oder die Auswahl zeigt Ihnen alle (vielen) Anwendungen, die die Sendeabsicht unterstützen.
message/rfc822
Ich benutze dies seit langer Zeit und es scheint gut, dass keine Nicht-E-Mail-Apps angezeigt werden. Nur eine andere Möglichkeit, eine E-Mail-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);
Ich habe etwas in Anlehnung an die aktuell akzeptierte 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 einwandfrei auf meinem Mailserver 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 überhaupt nicht gespeichert, ohne sich zu beschweren.
Ich habe mir einen der Quellcodes dieser Mail angesehen und festgestellt, dass der Protokolldateianhang (verständlicherweise) den MIME-Typ hat message/rfc822
. Natürlich ist dieser Anhang keine angehängte E-Mail. Aber Thunderbird kann diesen winzigen Fehler nicht anmutig bewältigen. Das war also eine Art Mist.
Nach ein wenig Recherche und Experimentieren habe ich die 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",
"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 können, kann die Methode createEmailOnlyChooserIntent problemlos mit der richtigen Absicht und dem richtigen MIME-Typ eingegeben werden.
Anschließend wird die Liste der verfügbaren Aktivitäten durchgearbeitet, die auf eine ACTION_SENDTO- mailto
Protokollabsicht reagieren (bei der es sich nur um E-Mail-Apps handelt), und eine Auswahl basierend auf dieser Liste von Aktivitäten und der ursprünglichen ACTION_SEND-Absicht mit dem richtigen MIME-Typ erstellt.
Ein weiterer Vorteil ist, dass Skype nicht mehr aufgeführt ist (was zufällig auf den MIME-Typ rfc822 reagiert).
ACTION_SEND
und das macht es wunderbar.
File
Instanz, die auf eine Absturzprotokolldatei verweist, die meine Android-Apps im Hintergrund erstellen, falls es eine nicht erfasste Ausnahme gab. Dieses Beispiel soll nur veranschaulichen, wie ein E-Mail-Anhang hinzugefügt wird. Sie können auch jede andere Datei aus dem externen Speicher anhängen (z. B. ein Image). Sie können diese Zeile auch mit entfernen, crashLogFile
um ein funktionierendes Beispiel zu erhalten.
Um E-Mail-Apps einfach zuzulassen , 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"));
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();
}
}
Ich habe dieses Problem mit einfachen Codezeilen gelöst, wie in der Android-Dokumentation erläutert.
( https://developer.android.com/guide/components/intents-common.html#Email )
Das wichtigste ist die Flagge: es ist ACTION_SENDTO
und nichtACTION_SEND
Die andere wichtige Linie ist
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
Übrigens, wenn Sie ein leeres senden Extra
, if()
funktioniert das 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 Textnachrichten oder sozialen Apps) verarbeitet wird, verwenden Sie die ACTION_SENDTO
Aktion und fügen Sie das mailto:
Datenschema " " 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);
}
}
Die Strategie, Apps zu verwenden .setType("message/rfc822")
oder ACTION_SEND
zu passen, die keine E-Mail-Clients sind, wie Android Beam und Bluetooth .
Die Verwendung von ACTION_SENDTO
und eines mailto:
URI scheint einwandfrei zu funktionieren und wird in der Entwicklerdokumentation empfohlen . Wenn Sie dies jedoch auf den offiziellen Emulatoren tun und keine E-Mail-Konten eingerichtet sind (oder keine E-Mail-Clients vorhanden sind), wird die folgende Fehlermeldung angezeigt:
Nicht unterstützte Aktion
Diese Aktion wird derzeit nicht unterstützt.
Wie nachfolgend dargestellt:
Es stellt sich heraus, dass die Emulatoren die Absicht in eine aufgerufene Aktivität auflösen com.android.fallback.Fallback
, die die obige Meldung anzeigt. Anscheinend ist dies beabsichtigt.
Wenn Sie möchten, dass Ihre App dies umgeht, damit es auch auf den offiziellen Emulatoren ordnungsgemäß 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 in der Entwicklerdokumentation .
Das Senden von E-Mails kann mit Absichten erfolgen, für die keine Konfiguration erforderlich ist. Dann ist jedoch eine Benutzerinteraktion erforderlich, und das Layout ist etwas eingeschränkt.
Um eine komplexere E-Mail ohne Benutzerinteraktion zu erstellen und zu senden, müssen Sie Ihren eigenen Client erstellen. Das erste ist, dass die Sun Java-API für E-Mails nicht verfügbar ist. Ich hatte Erfolg damit, die Apache Mime4j-Bibliothek zum Erstellen von E-Mails zu nutzen. Alles basierend auf den Dokumenten bei nilvec .
Hier ist der Beispielarbeitscode, der die E-Mail-Anwendung auf dem Android-Gerät öffnet und automatisch mit An Adresse und Betreff in der verfassten E-Mail gefüllt wird .
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);
}
}
setData()
und Avi setzt ein putExtra()
. Beide Varianten funktionieren. Aber wenn nur entfernen setData
und verwenden intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
, würde es eine geben ActivityNotFoundException
.
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)));
Dies zeigt Ihnen nur die E-Mail-Clients (sowie PayPal aus einem unbekannten Grund).
public void composeEmail() {
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
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();
}
}
intent.type = "message/rfc822"; intent.type = "text/html";
hier nicht hinzu , da dies zu Ausnahmen führen kann.
So habe ich es gemacht. Schön und einfach.
String emailUrl = "mailto:email@example.com?subject=Subject Text&body=Body Text";
Intent request = new Intent(Intent.ACTION_VIEW);
request.setData(Uri.parse(emailUrl));
startActivity(request);
Diese Funktion leitet zuerst Absichts-Google Mail zum Senden von E-Mails. Wenn Google Mail nicht gefunden wird, fördern Sie die Absichtsauswahl. 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);
}
}
}
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 :"));
}
});
}
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[]{"someone@gmail.com"});
emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Yo");
emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Hi");
startActivity(emailIntent);
Angenommen, auf dem größten Teil des Android-Geräts ist die GMail-App bereits installiert.
Verwenden Sie dies zum Senden von E-Mails ...
boolean success = EmailIntentBuilder.from(activity)
.to("support@example.org")
.cc("developer@example.org")
.subject("Error report")
.body(buildErrorReport())
.start();
benutze Build Gradle:
compile 'de.cketti.mailto:email-intent-builder:1.0.0'
Ich habe diesen Code zum Senden von E-Mails verwendet, indem ich den Standardabschnitt zum Erstellen von E-Mail-Apps direkt gestartet habe.
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
i.putExtra(Intent.EXTRA_EMAIL , new String[]{"test@gmail.com"});
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 bei mir. Es öffnet die Google Mail-App (falls installiert) und setzt 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);
}
/**
* 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;
}
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto","ebgsoldier@gmail.com", 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**
Versuche dies:
String mailto = "mailto:bob@example.org" +
"?cc=" + "alice@example.com" +
"&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
}
Der obige Code öffnet den bevorzugten E-Mail-Client des Benutzers, der mit der E-Mail gefüllt ist, die zum Senden bereit ist.