전자 메일 보내기 의도
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("text/html");
intent.putExtra(Intent.EXTRA_EMAIL, "emailaddress@emailaddress.com");
intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
intent.putExtra(Intent.EXTRA_TEXT, "I'm email body.");
startActivity(Intent.createChooser(intent, "Send Email"));
위의 코드는 다음과 같은 앱을 보여주는 대화상자를 엽니다. - 블루투스, 구글 독스, 야후 메일, 지메일, 오컷, 스카이프 등.
실제로 이 목록 옵션을 필터링하려고 합니다.나는 이메일 관련 앱만 보여주고 싶습니다.Gmail, 그리고 Yahoo Mail.어떻게 하는 거지?
안드로이드 마켓 애플리케이션에서 그런 예를 본 적이 있습니다.
- Android Market 앱 열기
- 개발자가 이메일 주소를 지정한 응용 프로그램을 엽니다. (해당 응용 프로그램을 찾을 수 없는 경우 내 응용 프로그램을 여십시오. - market://http?id=com.computer06.vehicle.vehicle.free 또는 '차량 일지'로 검색하십시오.)
- 아래로 스크롤하여 '개발자'로 이동합니다.
- '이메일 보내기'를 클릭
이 대화 상자에는 전자 메일 앱(예:Gmail, Yahoo Mail 등Bluetooth, Orkut 등은 표시되지 않습니다.어떤 코드가 이러한 대화상자를 생성합니까?
갱신하다
공식적인 접근 방식:
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);
}
}
이전 답변
승인된 답변은 4.1.2에서 작동하지 않습니다.이것은 모든 플랫폼에서 작동해야 합니다.
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.fromParts(
"mailto","abc@gmail.com", null));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
emailIntent.putExtra(Intent.EXTRA_TEXT, "Body");
startActivity(Intent.createChooser(emailIntent, "Send email..."));
업데이트 : marcwjj에 따르면, 4.3에서는 이메일 주소를 위한 문자열이 아닌 문자열 배열을 전달해야 작동할 것 같습니다.다음 행을 하나 더 추가해야 할 수 있습니다.
intent.putExtra(Intent.EXTRA_EMAIL, addresses); // String[] addresses
세 가지 주요 접근 방식이 있습니다.
String email = /* Your email address here */
String subject = /* Your subject here */
String body = /* Your body here */
String chooserTitle = /* Your chooser title here */
사용자 정의Uri
:
Uri uri = Uri.parse("mailto:" + email)
.buildUpon()
.appendQueryParameter("subject", subject)
.appendQueryParameter("body", body)
.build();
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, uri);
startActivity(Intent.createChooser(emailIntent, chooserTitle));
사용Intent
추가:
Intent emailIntent = new Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:" + email));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
//emailIntent.putExtra(Intent.EXTRA_HTML_TEXT, body); //If you are using HTML in your body text
startActivity(Intent.createChooser(emailIntent, "Chooser Title"));
라이브러리ShareCompat
:
Activity activity = /* Your activity here */
ShareCompat.IntentBuilder.from(activity)
.setType("message/rfc822")
.addEmailTo(email)
.setSubject(subject)
.setText(body)
//.setHtmlText(body) //If you are using HTML in your body text
.setChooserTitle(chooserTitle)
.startChooser();
당신이 당신의 의도를 바꿀 때.아래와 같이 유형을 설정합니다.
intent.setType("text/plain");
사용하다android.content.Intent.ACTION_SENDTO
Facebook 또는 다른 앱 없이 전자 메일 클라이언트 목록만 가져옵니다.이메일 클라이언트만 가능합니다. 예:
new Intent(Intent.ACTION_SENDTO);
저는 당신이 이메일 앱에 직접 접속하는 것을 제안하지 않을 것입니다.사용자가 가장 좋아하는 전자 메일 앱을 선택할 수 있습니다.그를 구속하지 마세요.
ACTION_SENDTO를 사용하는 경우, putExtra가 제목과 텍스트를 의도에 추가할 수 없습니다.URI를 사용하여 제목 및 본문 텍스트를 추가합니다.
편집: 사용할 수 있습니다.message/rfc822
에 "text/plain"
MIME 유형으로 표시됩니다.그러나 이는 "전자 메일 클라이언트만 제공"을 나타내는 것이 아니라 "메시지/rfc822 데이터를 지원하는 모든 것을 제공"을 나타냅니다.여기에는 전자 메일 클라이언트가 아닌 일부 응용 프로그램이 쉽게 포함될 수 있습니다.
message/rfc822
의 MIME 원지.mhtml, .mht, .mime
이것은 Android 공식 문서에서 인용한 것으로, 저는 Android 4.4에서 테스트했고 완벽하게 작동합니다.https://developer.android.com/guide/components/intents-common.html#Email 에서 더 많은 예를 확인
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);
}
}
다른 사람들에게 도움이 될 수 있는 해결책을 찾았지만, 늦은 답변:
자바 버전
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(Uri.parse("mailto:abc@xyz.com"));
startActivity(Intent.createChooser(emailIntent, "Send feedback"));
코틀린 버전
val emailIntent = Intent(Intent.ACTION_SENDTO).apply {
data = Uri.parse("mailto:abc@xyz.com")
}
startActivity(Intent.createChooser(emailIntent, "Send feedback"))
다음은 제 출력입니다(Gmail + Inbox만 제안됨).
저는 안드로이드 개발자 사이트에서 이 솔루션을 얻었습니다.
이것은 나에게 도움이 됩니다.
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "me@somewhere.com" });
intent.putExtra(Intent.EXTRA_SUBJECT, "My subject");
startActivity(Intent.createChooser(intent, "Email via..."));
가장 중요한 것은:ACTION_SEND 액션 대신 ACTION_SENDTO 액션을 사용합니다.Android 4.4 기기 몇 대에서 사용해 보았는데 다음과 같습니다.
- 선택기 팝업을 전자 메일 응용 프로그램(Email, Gmail, Yahoo Mail 등)만 표시하도록 올바르게 제한합니다.
- 전자 메일 주소와 제목을 전자 메일에 올바르게 삽입합니다.
시도:
intent.setType("message/rfc822");
이것은 Android Developer 공식 문서에 따라 전자 메일 의도를 보내는 올바른 방법입니다.
다음 코드 줄을 앱에 추가합니다.
Intent intent = new Intent(Intent.ACTION_SEND);//common intent
intent.setData(Uri.parse("mailto:")); // only email apps should handle this
선택 사항:본문과 제목을 추가합니다.
intent.putExtra(Intent.EXTRA_SUBJECT, "Your Subject Here");
intent.putExtra(Intent.EXTRA_TEXT, "E-mail body" );
질문에 이미 이 줄을 추가했습니다.
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"hello@example.com"});
이 주소는 수신자의 주소가 됩니다. 즉, 사용자가 (개발자)에게 전자 메일을 보냅니다.
마지막으로 최선의 방법을 생각해 보십시오.
String to = "test@gmail.com";
String subject= "Hi I am subject";
String body="Hi I am test body";
String mailTo = "mailto:" + to +
"?&subject=" + Uri.encode(subject) +
"&body=" + Uri.encode(body);
Intent emailIntent = new Intent(Intent.ACTION_VIEW);
emailIntent.setData(Uri.parse(mailTo));
startActivity(emailIntent);
모든 Android 버전에서 작동:
String[] to = {"email@server.com"};
Uri uri = Uri.parse("mailto:email@server.com")
.buildUpon()
.appendQueryParameter("subject", "subject")
.appendQueryParameter("body", "body")
.build();
Intent emailIntent = new Intent(ACTION_SENDTO, uri);
emailIntent.putExtra(EXTRA_EMAIL, TO);
startActivity(Intent.createChooser(emailIntent, "Send mail..."));
Android 10용으로 업데이트됨, 이제 Kotlin 사용...
fun Context.sendEmail(
address: String?,
subject: String?,
body: String?,
) {
val recipients = arrayOf(address)
val uri = address.toUri()
.buildUpon()
.appendQueryParameter("subject", subject)
.appendQueryParameter("body", body)
.build()
val emailIntent = Intent(ACTION_SENDTO, uri).apply {
setData("mailto:$address".toUri());
putExtra(EXTRA_SUBJECT, subject);
putExtra(EXTRA_TEXT, body);
putExtra(EXTRA_EMAIL, recipients)
}
val pickerTitle = getString(R.string.some_title)
ContextCompat.startActivity(this, Intent.createChooser(emailIntent, pickerTitle, null)
}
...API 30으로 업데이트한 후 코드가 이메일 클라이언트의 제목과 본문(예: Gmail)을 채우지 못했습니다.하지만 저는 여기서 답을 찾았습니다.
fun Context.sendEmail(
address: String?,
subject: String?,
body: String?,
) {
val selectorIntent = Intent(ACTION_SENDTO)
.setData("mailto:$address".toUri())
val emailIntent = Intent(ACTION_SEND).apply {
putExtra(EXTRA_EMAIL, arrayOf(address))
putExtra(EXTRA_SUBJECT, subject)
putExtra(EXTRA_TEXT, body)
selector = selectorIntent
}
startActivity(Intent.createChooser(emailIntent, getString(R.string.send_email)))
}
에는 자메클트사만사합면니다용야해전려용하일언라이를 .android.content.Intent.EXTRA_EMAIL
보겠습니다.다음은 예입니다.
final Intent result = new Intent(android.content.Intent.ACTION_SEND);
result.setType("plain/text");
result.putExtra(android.content.Intent.EXTRA_EMAIL, new String[] { recipient });
result.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
result.putExtra(android.content.Intent.EXTRA_TEXT, body);
다음 코드는 저에게 잘 맞습니다.
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("message/rfc822");
intent.putExtra(Intent.EXTRA_SUBJECT, subject);
intent.putExtra(Intent.EXTRA_EMAIL, new String[]{"abc@gmailcom"});
Intent mailer = Intent.createChooser(intent, null);
startActivity(mailer);
편집: Gmail의 새 버전에서 더 이상 작동하지 않습니다.
이것이 제가 그 당시에 발견한 유일한 방법입니다. 어떤 캐릭터와도 함께 작동할 수 있게 하기 위해서요.
Gmail의 새로운 버전의 모든 문자와 함께 작동하기 때문에 Doreamon의 대답은 지금 가야 할 올바른 방법입니다.
이전 답변:
여기 제 거예요.제목 및 메시지 본문을 지원하고 전체 utf-8 문자를 지원하는 모든 Android 버전에서 작동하는 것으로 보입니다.
public static void email(Context context, String to, String subject, String body) {
StringBuilder builder = new StringBuilder("mailto:" + Uri.encode(to));
if (subject != null) {
builder.append("?subject=" + Uri.encode(Uri.encode(subject)));
if (body != null) {
builder.append("&body=" + Uri.encode(Uri.encode(body)));
}
}
String uri = builder.toString();
Intent intent = new Intent(Intent.ACTION_SENDTO, Uri.parse(uri));
context.startActivity(intent);
}
이 해결책들 중 어느 것도 저에게 효과가 없었습니다.여기 롤리팝에서 작동하는 최소한의 해결책이 있습니다.내 단말기에서는 Gmail과 기본 이메일 앱만 결과 선택 목록에 나타납니다.
Intent emailIntent = new Intent(Intent.ACTION_SENDTO,
Uri.parse("mailto:" + Uri.encode(address)));
emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
emailIntent.putExtra(Intent.EXTRA_TEXT, body);
startActivity(Intent.createChooser(emailIntent, "Send email via..."));
Android 개발자 문서:
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);
}
}
대부분의 답변은 첨부 파일을 보내지 않는 간단한 경우에만 사용할 수 있습니다.저의 경우 첨부 파일(ACTION_SEND) 또는 두 개의 첨부 파일(ACTION_SEND_MUPLICE)을 보내야 할 때가 있습니다.
그래서 저는 이 스레드에서 최선의 접근법을 취하고 그것들을 결합했습니다.지원러를 ShareCompat.IntentBuilder
하지만 ACTION_SENDTO와 "mailto:" uri가 일치하는 앱만 보여줍니다.이렇게 하면 첨부 파일이 지원되는 이메일 앱 목록만 얻을 수 있습니다.
fun Activity.sendEmail(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null) {
val originalIntent = createEmailShareIntent(recipients, subject, file, text, secondFile)
val emailFilterIntent = Intent(Intent.ACTION_SENDTO, Uri.parse("mailto:"))
val originalIntentResults = packageManager.queryIntentActivities(originalIntent, 0)
val emailFilterIntentResults = packageManager.queryIntentActivities(emailFilterIntent, 0)
val targetedIntents = originalIntentResults
.filter { originalResult -> emailFilterIntentResults.any { originalResult.activityInfo.packageName == it.activityInfo.packageName } }
.map {
createEmailShareIntent(recipients, subject, file, text, secondFile).apply { `package` = it.activityInfo.packageName }
}
.toMutableList()
val finalIntent = Intent.createChooser(targetedIntents.removeAt(0), R.string.choose_email_app.toText())
finalIntent.putExtra(Intent.EXTRA_INITIAL_INTENTS, targetedIntents.toTypedArray())
startActivity(finalIntent)
}
private fun Activity.createEmailShareIntent(recipients: List<String>, subject: String, file: Uri, text: String? = null, secondFile: Uri? = null): Intent {
val builder = ShareCompat.IntentBuilder.from(this)
.setType("message/rfc822")
.setEmailTo(recipients.toTypedArray())
.setStream(file)
.setSubject(subject)
if (secondFile != null) {
builder.addStream(secondFile)
}
if (text != null) {
builder.setText(text)
}
return builder.intent
}
코틀린에서 누군가 찾고 있다면.
val emailArrray:Array<String> = arrayOf("travelagentsupport@kkk.com")
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, emailArrray)
intent.putExtra(Intent.EXTRA_SUBJECT, "Inquire about travel agent")
if (intent.resolveActivity(getPackageManager()) != null) {
startActivity(intent);
}
코드를 따르는 것이 나에게 효과가 있었습니다!!
import android.support.v4.app.ShareCompat;
.
.
.
.
final Intent intent = ShareCompat.IntentBuilder
.from(activity)
.setType("application/txt")
.setSubject(subject)
.setText("Hii")
.setChooserTitle("Select One")
.createChooserIntent()
.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET)
.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.startActivity(intent);
이것은 나에게 완벽하게 잘 맞습니다.
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("mailto:" + address));
startActivity(Intent.createChooser(intent, "E-mail"));
전자 메일 앱(다른 문자 메시지 또는 소셜 앱이 아님)에서만 의도를 처리하려면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);
}
}
저는 이것을 https://developer.android.com/guide/components/intents-common.html#Email 에서 찾았습니다.
사용.intent.setType("message/rfc822");
작동하지만 전자 메일을 반드시 처리할 필요는 없는 추가 앱(예: GDrive)을 표시합니다.사용.Intent.ACTION_SENDTO
와 함께setType("text/plain")
최고지만 당신은 추가해야 합니다.setData(Uri.parse("mailto:"))
최상의 결과를 얻으려면(전자 메일 앱만 해당).전체 코드는 다음과 같습니다.
Intent intent = new Intent(Intent.ACTION_SENDTO);
intent.setType("text/plain");
intent.setData(Uri.parse("mailto:IT@RMAsoft.NET"));
intent.putExtra(Intent.EXTRA_SUBJECT, "Email from My app");
intent.putExtra(Intent.EXTRA_TEXT, "Place your email message here ...");
startActivity(Intent.createChooser(intent, "Send Email"));
만약 당신이 Gmail을 목표로 하고 싶다면, 당신은 다음과 같이 할 수 있습니다.의도는 "ACTION_SEND"가 아니라 "ACTION_SENDTO"이며 Gmail에는 추가 의도 필드가 필요하지 않습니다.
String uriText =
"mailto:youremail@gmail.com" +
"?subject=" + Uri.encode("your subject line here") +
"&body=" + Uri.encode("message body here");
Uri uri = Uri.parse(uriText);
Intent sendIntent = new Intent(Intent.ACTION_SENDTO);
sendIntent.setData(uri);
if (sendIntent.resolveActivity(getPackageManager()) != null) {
startActivity(Intent.createChooser(sendIntent, "Send message"));
}
코틀린에서 아딜의 답변을 업데이트합니다.
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:") // only email apps should handle this
intent.putExtra(Intent.EXTRA_EMAIL, Array(1) { "test@email.com" })
intent.putExtra(Intent.EXTRA_SUBJECT, "subject")
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
} else {
showSnackBar(getString(R.string.no_apps_found_to_send_mail), this)
}
코틀린:
val email: String = getEmail()
val intent = Intent(Intent.ACTION_SENDTO)
intent.data = Uri.parse("mailto:$email" )
startActivity(intent)
String sendEmailTo = "abc@xyz.com";
String subject = "Subject";
String body = "Body";
Uri uri = Uri.parse("mailto:"+sendEmailTo+"?subject="+subject+"&body="+body);
startActivity(new Intent(Intent.ACTION_VIEW, uri);
이것은 저에게 효과가 있었습니다.선택한 메일링 응용프로그램만 표시됩니다.
추가로:제가 이 방법에 직면한 한 가지 문제는 제안과 본문 텍스트에 공백을 추가할 수 없었다는 것입니다.따라서 제안이나 본문 텍스트에 공백을 넣은 다음 공간을 다음으로 대체합니다.%20
다음 코드를 사용하십시오.
try {
String uriText =
"mailto:emailid" +
"?subject=" + Uri.encode("Feedback for app") +
"&body=" + Uri.encode(deviceInfo);
Uri uri = Uri.parse(uriText);
Intent emailIntent = new Intent(Intent.ACTION_SENDTO);
emailIntent.setData(uri);
startActivity(Intent.createChooser(emailIntent, "Send email using..."));
} catch (android.content.ActivityNotFoundException ex) {
Toast.makeText(ContactUsActivity.this, "No email clients installed.", Toast.LENGTH_SHORT).show();
}
당신은 이것을 시도해봐야 할 것 같습니다.intent.setType("plain/text");
여기서 찾았어요.제 앱에서 사용해봤는데 이메일과 지메일 옵션만 나와요.
전화 전자 메일 클라이언트에서 전자 메일 작성:
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL, new String[] { "some@email.address" });
intent.putExtra(Intent.EXTRA_SUBJECT, "subject");
intent.putExtra(Intent.EXTRA_TEXT, "mail body");
startActivity(Intent.createChooser(intent, ""));
사용:
boolean success = EmailIntentBuilder.from(activity)
.to("support@example.org")
.cc("developer@example.org")
.subject("Error report")
.body(buildErrorReport())
.start();
빌드 그라들 사용:
compile 'de.cketti.mailto:email-intent-builder:1.0.0'
이것이 제가 사용하는 것이며, 저에게 유용합니다.
//variables
String subject = "Whatever subject you want";
String body = "Whatever text you want to put in the body";
String intentType = "text/html";
String mailToParse = "mailto:";
//start Intent
Intent variableName = new Intent(Intent.ACTION_SENDTO);
variableName.setType(intentType);
variableName.setData(Uri.parse(mailToParse));
variableName.putExtra(Intent.EXTRA_SUBJECT, subject);
variableName.putExtra(Intent.EXTRA_TEXT, body);
startActivity(variableName);
또한 사용자가 선호하는 전자 메일 앱을 선택할 수 있습니다.이렇게 하면 수신자의 전자 메일 주소를 설정할 수 없습니다.
언급URL : https://stackoverflow.com/questions/8701634/send-email-intent
'programing' 카테고리의 다른 글
파이어베이스:프로덕션 APN 인증서를 업로드할 수 없습니다. (0) | 2023.06.05 |
---|---|
Firebase 아키텍처 x86_64에 대한 정의되지 않은 기호 (0) | 2023.06.05 |
비동기 메서드를 동기적으로 호출하는 중 (0) | 2023.05.31 |
Bash에서 여러 줄로 문자열을 분할하는 방법은 무엇입니까? (0) | 2023.05.31 |
단순 UIA 경고 보기 추가 (0) | 2023.05.31 |