关于android:如何从电子邮件中的资产附加pdf文件?

How to attach pdf file from assets in email?

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

EMail.java文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package com.drc.email;

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

public class Email extends Activity {
    Button send,attach;
    EditText userid,password,from,to,subject,body;

    private static final int SELECT_PICTURE = 1;
    private String selectedImagePath=null;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        send = (Button) this.findViewById(R.id.btnsend);
        attach = (Button) this.findViewById(R.id.btnattach);
        userid = (EditText) this.findViewById(R.id.userid);
        password = (EditText) this.findViewById(R.id.password);
        from = (EditText) this.findViewById(R.id.from);
        to = (EditText) this.findViewById(R.id.to);
        subject = (EditText) this.findViewById(R.id.subject);
        body = (EditText) this.findViewById(R.id.body);
        attach.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                  // select a file
                selectedImagePath=null;
                Intent intent = new Intent();
                intent.setType("image/*");
                intent.setAction(Intent.ACTION_GET_CONTENT);
                startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
            }
        });
        send.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                MailSender sender = new MailSender(userid.getText().toString(), password.getText().toString());
                try {
                    if(selectedImagePath==null)
                    {
                         sender.sendMail(subject.getText().toString(), body.getText().toString(), from.getText().toString(),to.getText().toString());
                         Toast.makeText(getBaseContext(),"Send Mail Sucess", Toast.LENGTH_LONG).show();
                    }
                    else
                    {
                     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(), "Send Attach Mail Sucess", Toast.LENGTH_LONG).show();
                    }
                } catch (Exception e) {
                    Log.e("SendMail", e.getMessage(), e);

                }
                sender=null;

            }

        });

    }
    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));
            }
        }
    }
    public String getPath(Uri uri) {
        String[] projection = { MediaStore.Images.Media.DATA };
        Cursor 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);
        return cursor.getString(column_index);
    }
}

MailSender.java文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package com.drc.email;

import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Properties;

public class MailSender extends javax.mail.Authenticator {

    private String mailhost ="smtp.gmail.com";
    private String user;
    private String password;
    private Session session;

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

    public MailSender(String user, String password) {
        this.user = user;
        this.password = password;
        System.out.println("Hello");
        Properties 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);
    }

    protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(user, password);
    }

    public synchronized void sendMail(String subject, String body,String sender, String recipients) throws Exception {
        MimeMessage message = new MimeMessage(session);
        DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(),"text/plain"));
        message.setSender(new InternetAddress(sender));
        message.setSubject(subject);
        message.setDataHandler(handler);
        if (recipients.indexOf(',') > 0)
            message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients));
        else
            message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));

        Transport.send(message);
    }
    public synchronized void sendMailAttach(String subject, String body,String sender, String recipients, String selectedImagePath,String filename) throws Exception {
        MimeMessage message = new MimeMessage(session);
        message.setSender(new InternetAddress(sender));
        message.setSubject(subject);
            // Set the email message text.
            //
            MimeBodyPart messagePart = new MimeBodyPart();
            messagePart.setText(body);
            //
            // Set the email attachment file
            //
            MimeBodyPart attachmentPart = new MimeBodyPart();
            FileDataSource fileDataSource = new FileDataSource(selectedImagePath) {
                @Override
                public String getContentType() {
                return"application/octet-stream";
                }
            };
            attachmentPart.setDataHandler(new DataHandler(fileDataSource));
            attachmentPart.setFileName(filename);

            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));}
        else
            {message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients));}

        Transport.send(message);
    }
    public class ByteArrayDataSource implements DataSource {
        private byte[] data;
        private String type;

        public ByteArrayDataSource(byte[] data, String type) {
            super();
            this.data = data;
            this.type = type;
        }

        public ByteArrayDataSource(byte[] data) {
            super();
            this.data = data;
        }

        public void setType(String type) {
            this.type = type;
        }

        public String getContentType() {
            if (type == null)
                return"application/octet-stream";
            else
                return type;
        }

        public InputStream getInputStream() throws IOException {
            return new ByteArrayInputStream(data);
        }

        public String getName() {
            return"ByteArrayDataSource";
        }

        public OutputStream getOutputStream() throws IOException {
            throw new IOException("Not Supported");
        }
    }
}

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

  • 的activation.jar
  • additional.jar
  • 的mail.jar

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

    1
    Uri uri=Uri.parse("file:///android_asset/myfile.pdf");


    1
    2
    3
    4
    5
    6
    7
    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:"));