ฉันกำลังพัฒนาแอพพลิเคชั่นใน Android ฉันไม่ทราบวิธีการส่งอีเมลจากแอปพลิเคชัน
ฉันกำลังพัฒนาแอพพลิเคชั่นใน Android ฉันไม่ทราบวิธีการส่งอีเมลจากแอปพลิเคชัน
คำตอบ:
วิธีที่ดีที่สุด (และง่ายที่สุด) คือการใช้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();
}
มิฉะนั้นคุณจะต้องเขียนลูกค้าของคุณเอง
Intent i = new Intent(Intent.ACTION_SENDTO);
i.setType("message/rfc822");
i.setData(Uri.parse("mailto:"));
การใช้งาน.setType("message/rfc822")
หรือตัวเลือกจะแสดงแอปพลิเคชั่น (มาก) ทั้งหมดที่สนับสนุนการส่ง
message/rfc822
ฉันใช้มันมานานแล้วและดูเหมือนว่าไม่มีแอพที่ไม่ใช่อีเมลปรากฏขึ้น อีกวิธีหนึ่งในการส่งเจตนาส่งอีเมล:
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);
ฉันใช้บางอย่างตามคำตอบที่ยอมรับในปัจจุบันเพื่อส่งอีเมลพร้อมไฟล์บันทึกข้อผิดพลาดไบนารีที่แนบมา GMail และ K-9 ส่งได้ดีและมันก็มาถึงดีบนเมลเซิร์ฟเวอร์ของฉัน ปัญหาเดียวคือไคลเอนต์อีเมลที่ฉันเลือก Thunderbird ซึ่งมีปัญหาในการเปิด / บันทึกไฟล์บันทึกที่แนบมา ในความเป็นจริงมันก็ไม่ได้บันทึกไฟล์เลยโดยไม่บ่น
ฉันได้ดูจากอีเมลเหล่านี้รหัสแหล่งที่มาและพบว่าสิ่งที่แนบแฟ้มบันทึกได้ (เข้าใจ) message/rfc822
ประเภทละครใบ้ แน่นอนว่าไฟล์แนบไม่ใช่อีเมลที่แนบมา แต่ทันเดอร์เบิร์ดไม่สามารถรับมือกับข้อผิดพลาดเล็ก ๆ นั้นได้อย่างสง่างาม นั่นเป็นคนเกียจคร้าน
หลังจากการวิจัยและการทดลองเล็กน้อยฉันพบวิธีแก้ปัญหาต่อไปนี้:
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);
}
}
มันสามารถใช้ดังนี้:
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"));
อย่างที่คุณเห็นวิธีการ createEmailOnlyChooserIntent สามารถป้อนได้อย่างง่ายดายด้วยเจตนาที่ถูกต้องและประเภท mime ที่ถูกต้อง
จากนั้นจะผ่านรายการกิจกรรมที่มีอยู่ซึ่งตอบสนองต่อความmailto
ตั้งใจของโปรโตคอลACTION_SENDTO (ซึ่งเป็นแอปอีเมลเท่านั้น) และสร้างตัวเลือกตามรายการกิจกรรมนั้นและเจตนา ACTION_SEND ดั้งเดิมที่มีประเภทไมม์ที่ถูกต้อง
ข้อดีอีกอย่างคือ Skype ไม่ได้อยู่ในรายการอีกต่อไป (ซึ่งเกิดขึ้นเพื่อตอบสนองต่อประเภท mcfc822)
ACTION_SEND
เช่นกัน
File
อินสแตนซ์ที่ชี้ไปยังไฟล์บันทึกข้อขัดข้องแอพ Android ของฉันสร้างขึ้นในพื้นหลังในกรณีที่มีข้อยกเว้นที่ไม่ได้ตรวจสอบ ตัวอย่างนั้นควรอธิบายวิธีเพิ่มไฟล์แนบอีเมล คุณสามารถแนบไฟล์อื่น ๆ จากที่จัดเก็บข้อมูลภายนอกได้ (เช่นรูปภาพ) นอกจากนี้คุณยังสามารถลบบรรทัดนั้นcrashLogFile
เพื่อรับตัวอย่างการทำงาน
หากต้องการให้LET EMAIL APPSเพื่อแก้ไขเจตนาของคุณคุณต้องระบุ ACTION_SENDTO เป็น Action และ mailto เป็น Data
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();
}
}
ฉันแก้ไขปัญหานี้ด้วยรหัสบรรทัดง่าย ๆ ตามที่อธิบายในเอกสารประกอบ android
( https://developer.android.com/guide/components/intents-common.html#Email )
ที่สำคัญที่สุดคือธง: มันเป็นACTION_SENDTO
และไม่ACTION_SEND
สายสำคัญอื่น ๆ คือ
intent.setData(Uri.parse("mailto:")); ***// only email apps should handle this***
โดยวิธีการที่ถ้าคุณส่งที่ว่างเปล่าExtra
ที่if()
ในตอนท้ายจะไม่ทำงานและ app ที่จะไม่เปิดอีเมลไคลเอ็นต์
ตามเอกสาร Android หากคุณต้องการให้แน่ใจว่าแอพอีเมลของคุณมีเจตนาที่จะจัดการเท่านั้น (และไม่ใช่แอพส่งข้อความหรือโซเชียลแอปอื่น) ให้ใช้การACTION_SENDTO
กระทำนั้นและรวมชุดmailto:
ข้อมูล "" ตัวอย่างเช่น:
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);
}
}
กลยุทธ์ของการใช้.setType("message/rfc822")
หรือACTION_SEND
ดูเหมือนว่าจะยังตรงกับปพลิเคชันที่ไม่ได้ส่งอีเมลถึงลูกค้าเช่นAndroid Beamและบลูทู ธ
การใช้ACTION_SENDTO
และmailto:
URI ดูเหมือนว่าจะทำงานได้อย่างสมบูรณ์แบบและเป็นที่แนะนำในเอกสารนักพัฒนา อย่างไรก็ตามหากคุณทำเช่นนี้กับอีมูเลเตอร์อย่างเป็นทางการและไม่มีการตั้งค่าบัญชีอีเมล (หรือไม่มีไคลเอนต์อีเมล) คุณจะได้รับข้อผิดพลาดต่อไปนี้:
การกระทำที่ไม่สนับสนุน
การกระทำนั้นไม่ได้รับการสนับสนุนในปัจจุบัน
ดังแสดงด้านล่าง:
ปรากฎว่าอีมูเลเตอร์สามารถแก้ไขความตั้งใจในกิจกรรมที่เรียกว่าcom.android.fallback.Fallback
ซึ่งแสดงข้อความข้างต้น เห็นได้ชัดว่านี่คือการออกแบบ
หากคุณต้องการให้แอปของคุณหลีกเลี่ยงปัญหานี้เพื่อให้ทำงานได้อย่างถูกต้องบนอีมูเลเตอร์อย่างเป็นทางการคุณสามารถตรวจสอบได้ก่อนลองส่งอีเมล:
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();
}
การส่งอีเมลสามารถทำได้ด้วย Intents ซึ่งไม่จำเป็นต้องมีการกำหนดค่า แต่จะต้องมีการโต้ตอบกับผู้ใช้และรูปแบบจะถูก จำกัด เล็กน้อย
สร้างและส่งอีเมลที่ซับซ้อนยิ่งขึ้นโดยที่ผู้ใช้ไม่ต้องดำเนินการใด ๆ เพื่อสร้างลูกค้าของคุณเอง สิ่งแรกคือ Sun Java API สำหรับอีเมลไม่พร้อมใช้งาน ฉันประสบความสำเร็จในการใช้ประโยชน์จากห้องสมุด Apache Mime4j เพื่อสร้างอีเมล ทั้งหมดขึ้นอยู่กับเอกสารที่nilvec
นี่คือตัวอย่างโค้ดการทำงานที่เปิดแอปพลิเคชันอีเมลในอุปกรณ์ Android และป้อนอัตโนมัติไปยังที่อยู่และหัวเรื่องในเมลที่เขียน
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()
และ Avi putExtra()
ในชุด ทั้งสองรุ่นใช้งานได้ แต่ถ้าลบsetData
และการใช้งานเท่านั้นintent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hi@example.com"});
, ActivityNotFoundException
จะมีการ
ฉันใช้รหัสด้านล่างในแอพของฉัน สิ่งนี้แสดงแอปไคลเอนต์อีเมลที่แน่นอนเช่น 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)));
สิ่งนี้จะแสดงให้คุณเห็นเฉพาะไคลเอนต์อีเมล (รวมถึง PayPal ด้วยเหตุผลที่ไม่ทราบสาเหตุ)
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";
ที่นี่เพราะจะนำไปสู่ข้อยกเว้น
นี่คือวิธีที่ฉันทำ ดีและเรียบง่าย
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);
ฟังก์ชั่นนี้จะส่ง gmail เจตนาส่งผ่านโดยตรงเป็นครั้งแรกหากไม่พบ gmail ให้เลื่อนการเลือกเจตนาไปที่ ฉันใช้ฟังก์ชั่นนี้ในแอพเชิงพาณิชย์มากมายและมันก็ใช้ได้ดี หวังว่ามันจะช่วยคุณ:
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);
}
}
}
ง่ายๆลองอันนี้
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 :"));
}
});
}
วิธีอื่นสามารถ
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);
สมมติว่าอุปกรณ์ android ส่วนใหญ่ติดตั้งแอป GMail แล้ว
ใช้สำหรับส่งอีเมล ...
boolean success = EmailIntentBuilder.from(activity)
.to("support@example.org")
.cc("developer@example.org")
.subject("Error report")
.body(buildErrorReport())
.start();
ใช้การสร้าง gradle:
compile 'de.cketti.mailto:email-intent-builder:1.0.0'
ฉันใช้รหัสนี้เพื่อส่งจดหมายโดยเปิดตัวแอปเมลเริ่มต้นที่เขียนโดยตรง
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();
}
วิธีนี้ใช้ได้ผลสำหรับฉัน มันเปิดแอป Gmail (ถ้าติดตั้ง) และตั้งค่า 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**
ลองสิ่งนี้:
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
}
รหัสด้านบนจะเปิดไคลเอนต์อีเมลที่ผู้ใช้ชื่นชอบ prefilled พร้อมกับอีเมลพร้อมที่จะส่ง