내 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();
}

그렇지 않으면 자신의 클라이언트를 작성해야합니다.


답변

사용 .setType("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 메일 클라이언트였습니다. 실제로 그것은 불평없이 파일을 전혀 저장하지 않았습니다.

이 메일의 소스 코드 중 하나를 살펴본 결과 로그 파일 첨부 파일에 MIME 유형이 있음을 알았습니다 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 유형으로 쉽게 공급 될 수 있습니다.

그런 다음 ACTION_SENDTO mailto프로토콜 의도 (이메일 앱만 해당)에 응답하는 사용 가능한 활동 목록을 살펴보고 해당 활동 목록과 올바른 MIME 유형의 원래 ACTION_SEND 의도를 기반으로 선택 자를 구성합니다.

또 다른 장점은 Skype가 더 이상 나열되지 않는다는 것입니다 (rfc822 MIME 유형에 응답 함).


답변

의도를 해결하기 위해 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();
    }

}

답변

안드로이드 문서가 설명하는 것처럼 간단한 코드 줄 로이 문제를 해결했습니다.

( 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***

당신이 빈을 보내는 경우 그건 그렇고, Extraif()끝이 작동하지 않습니다 앱은 이메일 클라이언트를 실행하지 않습니다.

안드로이드 문서에 따르면. 인 텐트가 다른 문자 메시지 나 소셜 앱이 아닌 이메일 앱으로 만 처리되도록하려면 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);
    }
}

답변

Android BeamBluetooth 와 같이 이메일 클라이언트가 아닌 앱을 사용 .setType("message/rfc822")하거나 ACTION_SEND일치시키는 전략 도 있습니다 .

ACTION_SENDTOmailto: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();
}

개발자 설명서 에서 자세한 정보를 찾으십시오 .