18

如何在我的应用程序中将 pdf 文件从资产附加到电子邮件?我正在使用以下代码附加图像,但我不知道如何附加 pdf。

电子邮件.java 文件

包 com.drc.email;

导入android.app.Activity;
导入android.content.Intent;
导入android.database.Cursor;
导入android.net.Uri;
导入android.os.Bundle;
导入android.provider.MediaStore;
导入android.util.Log;
导入android.view.View;
导入 android.view.View.OnClickListener;
导入android.widget.Button;
导入 android.widget.EditText;
导入 android.widget.Toast;

公共类电子邮件扩展活动{
    按钮发送,附加;
    EditText 用户名、密码、从、到、主题、正文;

    私有静态最终 int SELECT_PICTURE = 1;
    私有字符串 selectedImagePath=null;

    /** 在第一次创建活动时调用。*/
    @覆盖
    公共无效 onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        设置内容视图(R.layout.main);

        发送 = (按钮) this.findViewById(R.id.btnsend);
        attach = (Button) this.findViewById(R.id.btnattach);
        userid = (EditText) this.findViewById(R.id.userid);
        密码 = (EditText) this.findViewById(R.id.password);
        from = (EditText) this.findViewById(R.id.from);
        to = (EditText) this.findViewById(R.id.to);
        主题 = (EditText) this.findViewById(R.id.subject);
        body = (EditText) this.findViewById(R.id.body);
        attach.setOnClickListener(new OnClickListener() {

            @覆盖
            公共无效 onClick(查看 v){
                // TODO 自动生成的方法存根
                  // 选择一个文件
                selectedImagePath=null;
                意图意图 = new Intent();
                intent.setType("图片/*");
                意图.setAction(意图.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"选择图片"), SELECT_PICTURE);
            }
        });
        send.setOnClickListener(new View.OnClickListener() {

            public void onClick(查看视图){
                MailSender 发件人 = new MailSender(userid.getText().toString(), password.getText().toString());
                尝试 {
                    if(selectedImagePath==null)
                    {
                         sender.sendMail(subject.getText().toString(), body.getText().toString(), from.getText().toString(),to.getText().toString());
                         Toast.makeText(getBaseContext(), "发送邮件成功", Toast.LENGTH_LONG).show();
                    }
                    别的
                    {
                     sender.sendMailAttach(subject.getText().toString(), body.getText().toString(), from.getText().toString(),to.getText().toString(),selectedImagePath.toString(), String.format("image%d.jpeg", System.currentTimeMillis()));
                     Toast.makeText(getBaseContext(), "发送附加邮件成功", Toast.LENGTH_LONG).show();
                    }
                } 捕捉(异常 e){
                    Log.e("SendMail", e.getMessage(), e);

                }
                发件人=空;

            }

        });

    }
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (requestCode == SELECT_PICTURE) {
                Uri selectedImageUri = data.getData();
                selectedImagePath = getPath(selectedImageUri);
                //disimage.setImageURI(Uri.parse(selectedImagePath));
            }
        }
    }
    公共字符串getPath(Uri uri){
        字符串 [] 投影 = { MediaStore.Images.Media.DATA };
        光标 cursor = managedQuery(uri, projection, null, null, null);
        int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        cursor.moveToFirst();
     // Toast.makeText(this,cursor.getString(column_index).toString(), Toast.LENGTH_LONG);
        返回 cursor.getString(column_index);
    }
}

MailSender.java 文件

包 com.drc.email;

导入 javax.activation.DataHandler;
导入 javax.activation.DataSource;
导入 javax.activation.FileDataSource;
导入 javax.mail.Message;
导入 javax.mail.Multipart;
导入 javax.mail.PasswordAuthentication;
导入 javax.mail.Session;
导入 javax.mail.Transport;
导入 javax.mail.internet.Internet 地址;
导入 javax.mail.internet.MimeBodyPart;
导入 javax.mail.internet.MimeMessage;
导入 javax.mail.internet.MimeMultipart;

导入 java.io.ByteArrayInputStream;
导入 java.io.IOException;
导入 java.io.InputStream;
导入 java.io.OutputStream;
导入 java.util.Properties;

公共类 MailSender 扩展 javax.mail.Authenticator {

    私人字符串 mailhost = "smtp.gmail.com";
    私有字符串用户;
    私人字符串密码;
    私人会话会话;

    静止的 {
        // Security.addProvider(new
        // org.apache.harmony.xnet.provider.jsse.JSSEProvider());
    }

    public MailSender(字符串用户,字符串密码){
        this.user = 用户;
        this.password = 密码;
        System.out.println("你好");
        属性 props = new Properties();
        props.setProperty("mail.transport.protocol", "smtp");
        props.setProperty("mail.host", mailhost);
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.port", "465");
        props.put("mail.smtp.socketFactory.port", "465");
        props.put("mail.smtp.socketFactory.class","javax.net.ssl.SSLSocketFactory");
        props.put("mail.smtp.socketFactory.fallback", "false");
        props.setProperty("mail.smtp.quitwait", "false");

        session = Session.getDefaultInstance(props, this);
    }

    受保护的 PasswordAuthentication getPasswordAuthentication() {
        返回新的PasswordAuthentication(用户,密码);
    }

    公共同步无效发送邮件(字符串主题,字符串正文,字符串发件人,字符串收件人)抛出异常{
        MimeMessage 消息 = 新的 MimeMessage(会话);
        DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain"));
        message.setSender(新 InternetAddress(sender));
        message.setSubject(主题);
        message.setDataHandler(处理程序);
        if (recipients.indexOf(',') > 0)
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
        别的
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));

        Transport.send(消息);
    }
    公共同步无效 sendMailAttach(字符串主题,字符串正文,字符串发件人,字符串收件人,字符串 selectedImagePath,字符串文件名)抛出异常 {
        MimeMessage 消息 = 新的 MimeMessage(会话);
        message.setSender(新 InternetAddress(sender));
        message.setSubject(主题);
            // 设置电子邮件消息文本。
            //
            MimeBodyPart messagePart = new MimeBodyPart();
            messagePart.setText(body);
            //
            // 设置邮件附件文件
            //
            MimeBodyPart attachmentPart = new MimeBodyPart();
            FileDataSource fileDataSource = new FileDataSource(selectedImagePath) {
                @覆盖
                公共字符串 getContentType() {
                返回“应用程序/八位字节流”;
                }
            };
            attachmentPart.setDataHandler(new DataHandler(fileDataSource));
            attachmentPart.setFileName(文件名);

            Multipart multipart = new MimeMultipart();
            multipart.addBodyPart(messagePart);
            multipart.addBodyPart(attachmentPart);

            message.setContent(multipart);

        if (recipients.indexOf(',') > 0)
            {message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));}
        别的
            {message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));}

        Transport.send(消息);
    }
    公共类 ByteArrayDataSource 实现 DataSource {
        私有字节[] 数据;
        私有字符串类型;

        公共 ByteArrayDataSource(byte[] 数据,字符串类型) {
            极好的();
            this.data = 数据;
            this.type = 类型;
        }

        公共 ByteArrayDataSource(byte[] 数据) {
            极好的();
            this.data = 数据;
        }

        公共无效 setType(字符串类型){
            this.type = 类型;
        }

        公共字符串 getContentType() {
            如果(类型 == 空)
                返回“应用程序/八位字节流”;
            别的
                返回类型;
        }

        公共输入流 getInputStream() 抛出 IOException {
            返回新的字节数组输入流(数据);
        }

        公共字符串 getName() {
            返回“字节数组数据源”;
        }

        公共输出流 getOutputStream() 抛出 IOException {
            throw new IOException("不支持");
        }
    }
}

我正在使用 3 个外部 jar 文件。

  1. 激活.jar
  2. 附加.jar
  3. 邮件.jar
4

2 回答 2

3

您应该使用 URI 引用资产目录中的 PDF 文件 myfile.pdf,例如:

Uri uri=Uri.parse("file:///android_asset/myfile.pdf"); 
于 2011-05-16T14:50:39.307 回答
0
i've done for send any file from SD card with mail attachment..

Intent sendEmail= new Intent(Intent.ACTION_SEND);
       sendEmail.setType("rar/image");
       sendEmail.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(new        
         File("/mnt/sdcard/download/abc.rar")));
         startActivity(Intent.createChooser(sendEmail, "Email:"));
于 2013-04-01T13:47:14.617 回答