【问题标题】:How to attach file to email? - android如何将文件附加到电子邮件? - 安卓
【发布时间】:2015-10-08 20:00:36
【问题描述】:

我尝试将文件附加到电子邮件。 用户写入文件。 完成后,文件将保存在内部存储中,并应通过电子邮件发送。

代码如下:

// write text to file
public void WriteBtn(View v) {
    // add-write text into file
    try {
        FileOutputStream fileout = openFileOutput(fileName, MODE_PRIVATE);
        OutputStreamWriter outputWriter=new OutputStreamWriter(fileout);
        outputWriter.write(textmsg.getText().toString());
        outputWriter.close();
        fileout.close();
        String fileLocation= Environment.getDataDirectory()+"/"+fileName;
        Intent emailIntent = new Intent(Intent.ACTION_SEND);
        // set the type to 'email'
        emailIntent .setType("vnd.android.cursor.dir/email");
        String to[] = {"oshrat0207@gmail.com"};
        emailIntent .putExtra(Intent.EXTRA_EMAIL, to);
        // the attachment
        emailIntent .putExtra(Intent.EXTRA_STREAM, fileLocation);
        // the mail subject
        emailIntent .putExtra(Intent.EXTRA_SUBJECT, "Subject");
       // Uri uri = Uri.fromFile(new File(fileLocation));
        String sdCard = Environment.getExternalStorageDirectory().getAbsolutePath();
        Uri uri = Uri.fromFile(new File(sdCard +
                new String(new char[sdCard.replaceAll("[^/]", "").length()])
                        .replace("\0", "/..") + getFilesDir() + "/" + fileName));
        emailIntent.putExtra(android.content.Intent.EXTRA_STREAM, uri);
        startActivity(Intent.createChooser(emailIntent , "Send email..."));

        //display file saved message
        Toast.makeText(getBaseContext(), "File saved successfully! path:" + fileLocation,
                Toast.LENGTH_SHORT).show();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

例外情况:

  1. close() 从未在数据库“/data/data/com.google.android.gms/databases/phenotype.db”上显式调用 android.database.sqlite.DatabaseObjectNotClosedException:应用程序没有关闭此处打开的游标或数据库对象

  2. 查找电子邮件提供商版本时出错.....

  3. ctivity com.android.internal.app.ChooserActivity 泄露了最初在这里注册的 IntentReceiver com.android.internal.app.ResolverActivity$1@4107d478。您是否错过了对 unregisterReceiver() 的调用? android.app.IntentReceiverLeaked: Activity com.android.internal.app.ChooserActivity 已经泄露了最初在这里注册的 IntentReceiver com.android.internal.app.ResolverActivity$1@4107d478。您是否错过了对 unregisterReceiver() 的调用?

我做错了什么?

【问题讨论】:

    标签: android file email


    【解决方案1】:

    您可以使用 JavaMail API 发送可以将文件附加到电子邮件的多部分电子邮件。要使用 JavaMail API 发送电子邮件,您需要加载两个 jar 文件:

    邮件.jar 激活.jar

    您可以到 Oracle 网站下载最新版本。

    查看下面的示例

    public MimeMessage createEmailMessage() throws AddressException,
    MessagingException, UnsupportedEncodingException {
    
    Session mailSession;
    MimeMessage emailMessage;
    
        File csvFile = new File(csvFilePath);
        if(null != csvFile.list()){
            csvName = (csvFile.list())[0];
        }
    
        if(null != csvName ){
    
            mailSession = Session.getDefaultInstance(emailProperties, null);
            emailMessage = new MimeMessage(mailSession);
    
            emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail));
            emailMessage.addRecipient(Message.RecipientType.TO,new InternetAddress(toEmail));
    
            emailMessage.setSubject(emailSubject);
            //emailMessage.setContent(emailBody, "text/html");// for a html email
    
    
            // creates message part
            MimeBodyPart messageBodyPart = new MimeBodyPart();
            //          messageBodyPart.setContent(message, "text/html");
    
            // creates multi-part
            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messageBodyPart);
    
            File csvDir = new File(Constant.FilePathConstant.CSV_PATH );
    
            /***** attach csv files *****/
            if(csvDir.exists()){
                File[] csvList = xlsDir.listFiles();
                for (File file : csvList) {
                    MimeBodyPart attachPart = new MimeBodyPart();
                    System.out.println("@@@@@@@@@@@@@@@@@@@@@@ csv " + file.getAbsolutePath());
                    try{
                        attachPart.attachFile(file.getAbsolutePath());
                    }catch(Exception e){
                        e.printStackTrace();
                    }
                    multipart.addBodyPart(attachPart);
                }
            }
    
    
            // sets the multi-part as e-mail's content
            emailMessage.setContent(multipart);
    
             emailMessage.setText(emailBody);
            Logger.i("GMail", "Email Message created.");
        }
        return emailMessage;
    }
    
    public boolean sendEmail() throws AddressException, MessagingException {
        if(null != emailMessage){
            Transport transport = mailSession.getTransport("smtp");
            transport.connect(emailHost, fromEmail, fromPassword);
            transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
            transport.close();
            Logger.i("Report", "Email sent successfully.");
            return true;
        }else{
            return false;
        }
    }
    

    【讨论】:

    • 根据我的代码,有可能发送电子邮件的问题是附加文件。
    猜你喜欢
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多