programing

전자 메일 보내기 의도

closeapi 2023. 5. 31. 15:57
반응형

전자 메일 보내기 의도

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.어떻게 하는 거지?

안드로이드 마켓 애플리케이션에서 그런 예를 본 적이 있습니다.

  1. Android Market 앱 열기
  2. 개발자가 이메일 주소를 지정한 응용 프로그램을 엽니다. (해당 응용 프로그램을 찾을 수 없는 경우 내 응용 프로그램을 여십시오. - market://http?id=com.computer06.vehicle.vehicle.free 또는 '차량 일지'로 검색하십시오.)
  3. 아래로 스크롤하여 '개발자'로 이동합니다.
  4. '이메일 보내기'를 클릭

이 대화 상자에는 전자 메일 앱(예: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_SENDTOFacebook 또는 다른 앱 없이 전자 메일 클라이언트 목록만 가져옵니다.이메일 클라이언트만 가능합니다. 예:

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 기기 몇 대에서 사용해 보았는데 다음과 같습니다.

  1. 선택기 팝업을 전자 메일 응용 프로그램(Email, Gmail, Yahoo Mail 등)만 표시하도록 올바르게 제한합니다.
  2. 전자 메일 주소와 제목을 전자 메일에 올바르게 삽입합니다.

시도:

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

반응형