如何在Android中发送带有文件附件的电子邮件

如何在Android中发送带有文件附件的电子邮件,android,email,email-attachments,vcf-vcard,Android,Email,Email Attachments,Vcf Vcard,我想随邮件附上.vcf文件并通过邮件发送。但是邮件是在没有附件的地址上收到的。我使用了下面的代码,但是这个代码我不知道哪里错了 try { String filelocation="/mnt/sdcard/contacts_sid.vcf"; Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setType("text/plain"); intent.putExtra(In

我想随邮件附上.vcf文件并通过邮件发送。但是邮件是在没有附件的地址上收到的。我使用了下面的代码,但是这个代码我不知道哪里错了

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

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

使用以下代码在电子邮件中发送文件

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("vnd.android.cursor.dir/email");
String to[] = {"asd@gmail.com"};
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..."));

官员身上的例子对我很有用。 所有需要它来添加

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

正如Agarwal的回答所述,Folder\u name是手机内部存储器中的文件名。(实际上是外部存储)。 file_name是要发送的文件的名称

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);
        intent.setType("text/plain");
        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:xyz@gmail.com"));
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

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

SENDTO不支持附件。我已使用提供程序添加了我的答案以读取文件信息。在科特林

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

    }
}

我在Kotlin中编写了一个扩展,用于发送带有多个附件的电子邮件。我希望它对某人有用

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)
        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        putExtra(Intent.EXTRA_TEXT, content)
        putExtra(Intent.EXTRA_EMAIL, arrayOf(email))

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

        if(attachments.isNotEmpty())
            putParcelableArrayListExtra(Intent.EXTRA_STREAM, ArrayList(attachments))
    }

    if (emailIntent.resolveActivity(packageManager) != null)
        startActivity(Intent.createChooser(emailIntent, "Chooser Mail Client"))
}
fun-appcompativity.sendmail(主题:String,内容:String,电子邮件:String,文件附件:List=emptyList()){
val emailIntent=Intent(Intent.ACTION\u SEND\u MULTIPLE)。应用{
type=“text/html”
putExtra(Intent.EXTRA_SUBJECT,SUBJECT)
addFlags(意图、标志、活动、新任务)
putExtra(Intent.EXTRA_文本、内容)
putExtra(Intent.EXTRA_电子邮件,arrayOf(电子邮件))
//配置附件
val attachments=fileAttachments.map{File(it)}.filter{it.exists()&&!it.isDirectory}.map{
getUriForFile(baseContext,${BuildConfig.APPLICATION\u ID}.FileProvider),它)
}托利斯先生()
如果(附件.isNotEmpty())
PutparcelableArrayListXTRA(Intent.EXTRA_流,ArrayList(附件))
}
if(emailIntent.resolveActivity(packageManager)!=null)
startActivity(Intent.createChooser(emailIntent,“Chooser邮件客户端”))
}

看看我的问题……你不应该使用“硬编码”路径,因为它们可能会根据设备的不同而变化。我建议您将filelocation的定义更改为:File filelocation=new File(Environment.getExternalStorageDirectory().getAbsolutePath(),filename);然后定义:uripath=Uri.fromFile(filelocation);并将其放在您的意图中:emailIntent.putExtra(intent.EXTRA\u STREAM,path);emailIntent.putExtra(Intent.EXTRA\u STREAM,filelocation)不会为我附加文件,但使用emailIntent.putExtra(Intent.EXTRA\u STREAM,Uri.parse(“file://”+filelocation)),就像Phillip一样工作得很好。如果文件尚未保存,该如何工作?我将图像数据作为位图,但不是文件。在我们从文件加载位图之前,您能提供保存位图的代码吗?在我的情况下,它将发送到邮件客户端,但没有附件。显示的toast为“无法发送空文件”。我的文件存储在
/data/data/com.example.app/files/temp.txt
中,我使用
emailIntent.putExtra(Intent.EXTRA_STREAM,Uri.parse(“内容:/”+filePath));//文件路径为/data/com.example.app/files/temp.txt
您无法发送文件,因为它位于应用程序的缓存目录中,并且只有应用程序可以从该目录中读取。您应该使用另一个目录,如Environment.getExternalStorageDirectory()。Used Environment.getExternalStorageDirectory(),验证路径是否有效以及该文件是否具有良好的数据。。。。但仍然会收到相同的错误消息(?)。