How to send an email with a file attachment in Android

The question:

I want to attach .vcf file with my mail and send through the mail. But the mail is received on the address without the attachment.I have used the below code but the code for this and i don’t know where i am wrong.

try {      
  String filelocation="/mnt/sdcard/contacts_sid.vcf";      
  Intent intent = new Intent(Intent.ACTION_SENDTO);    
  intent.putExtra(Intent.EXTRA_SUBJECT, "");      
  intent.putExtra(Intent.EXTRA_STREAM, Uri.parse( "file://"+filelocation));      
  intent.putExtra(Intent.EXTRA_TEXT, message);         

  } catch(Exception e)  {
     System.out.println("is exception raises during sending mail"+e);

The Solutions:

Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.

Method 1

Use the below code to send a file within a email.

String filename="contacts_sid.vcf"; 
File filelocation = new File(Environment.getExternalStorageDirectory().getAbsolutePath(), filename);
Uri path = Uri.fromFile(filelocation); 
Intent emailIntent = new Intent(Intent.ACTION_SEND);
// set the type to 'email'
emailIntent .setType("");
String to[] = {"[email protected]"};
emailIntent .putExtra(Intent.EXTRA_EMAIL, to);
// the attachment
emailIntent .putExtra(Intent.EXTRA_STREAM, path);
// the mail subject
emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject");
startActivity(Intent.createChooser(emailIntent , "Send email..."));

Method 2

Folder_name is the name of the file in the Internal Storage of your phone. (ACTUALLY EXTERNAL_STORAGE).
file_name is the name of the file you want to send.

private void ShareViaEmail(String folder_name, String file_name) {
    try {
        File root= Environment.getExternalStorageDirectory();
        String filelocation= root.getAbsolutePath() + folder_name + "/" + file_name;
        Intent intent = new Intent(Intent.ACTION_SENDTO);
        String message="File to be shared is " + file_name + ".";
        intent.putExtra(Intent.EXTRA_SUBJECT, "Subject");
        intent.putExtra(Intent.EXTRA_STREAM, Uri.parse( "file://"+filelocation));
        intent.putExtra(Intent.EXTRA_TEXT, message);
        intent.setData(Uri.parse("mailto:[email protected]"));

    } catch(Exception e)  {
        System.out.println("is exception raises during sending mail"+e);

Method 3

The example on the official Android site worked for me.
All what is need it to add the

startActivity(Intent.createChooser(emailIntent , "Send email..."));

as done in Agarwal’s answer

Method 4

SENDTO doesnt support attachment. I have added my answer using Provider to read the file information. Its in Kotlin.

fun shareFile(context: Context, filePath: File?, fileShareInfo: FileShareInfo) {

    val intentFileShare = Intent(Intent.ACTION_SEND)

    if (filePath!!.exists()) {
        intentFileShare.type = fileShareInfo.fileType
        val uri = FileProvider.getUriForFile(context, BuildConfig.APPLICATION_ID + ".provider", filePath)
        intentFileShare.putExtra(Intent.EXTRA_STREAM, uri)
        fileShareInfo.recipients?.let {
            intentFileShare.putExtra(Intent.EXTRA_EMAIL, fileShareInfo.recipients)
        intentFileShare.putExtra(Intent.EXTRA_SUBJECT, fileShareInfo.shareSubjectText)
        fileShareInfo.shareExtraText?.let {
            intentFileShare.putExtra(Intent.EXTRA_TEXT, AppViewUtil.fromHtml(fileShareInfo.shareExtraText!!))
        try {
            ContextCompat.startActivity(context, Intent.createChooser(intentFileShare, fileShareInfo.shareTitle), null)
        } catch (e: ActivityNotFoundException) {
            Toast.makeText(context, context.getString(R.string.sharing_no_app_found), Toast.LENGTH_LONG).show()


Method 5

I have written an extension in Kotlin for sending emails with multiple attachments. I hope it is useful for someone.

fun AppCompatActivity.sendEmail(subject: String, content: String, email: String, fileAttachments: List<String> = emptyList()) {

    val emailIntent = Intent(Intent.ACTION_SEND_MULTIPLE).apply {
        type = "text/html"
        putExtra(Intent.EXTRA_SUBJECT, subject)
        putExtra(Intent.EXTRA_TEXT, content)
        putExtra(Intent.EXTRA_EMAIL, arrayOf(email))

        // Configure attachments
        val attachments = { File(it) }.filter { it.exists() && !it.isDirectory }.map {
            FileProvider.getUriForFile(baseContext, "${BuildConfig.APPLICATION_ID}.fileprovider", it)

            putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList(attachments))

    if (emailIntent.resolveActivity(packageManager) != null)
        startActivity(Intent.createChooser(emailIntent, "Chooser Mail Client"))

All methods was sourced from or, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

Leave a Comment