2015-07-19 178 views
0

我尝试将文件附加到电子邮件。 用户写入文件。 完成后,文件保存在内部存储器上,应通过电子邮件发送。如何将文件附加到电子邮件? - android

下面是代码:

// 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[] = {"[email protected]"}; 
     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. 接近()从未被明确要求在数据库“/data/data/com.google.android.gms/databases /phenotype.db' android.database.sqlite.DatabaseObjectNotClosedException:应用程序未关闭此处打开的游标或数据库对象

  2. Erro r找到电子邮件提供商的版本.....

  3. ctivity com.android.internal.app.ChooserActivity泄漏了最初在此注册的IntentReceiver [email protected]。你是否错过了对unregisterReceiver()的调用? android.app.IntentReceiverLeaked:Activity com.android.internal.app.ChooserActivity泄漏了最初在这里注册的IntentReceiver [email protected]。你是否错过了对unregisterReceiver()的调用?

我在做什么错?

回答

1

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

的mail.jar 的activation.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; 
    } 
} 
+0

的例子。根据我的代码,也可以发送电子邮件的问题是要附加文件。 –