can not send mail with attachment in Android
Asked Answered
V

2

2

i have a problem to send mail with attachment. I'm using Javamail libraries (mail.jar, activitation.jar and additional.jar ). I can send mail accurately. But i can not send mail with an attachment is image to mail. I choose an image from gallery, and it is addded as my filename

 File f = new File("file://" + uri.getPath());

I think i have a problem when datasource took the my file's path. Whatever you can see much more thing in my code:(i've solved this problem and it is the last situation of my code)

first of all i add to view of my attachment :

Button Add = (Button) findViewById(R.id.btnAdd);

    Add.setOnClickListener(new Button.OnClickListener() {
        public void onClick(View view) {
            onAddAttachment2("image/*");

        }
    });

here is my onAddAttachment2 and onActivityResult code

 private void onAddAttachment2(final String mime_type) {



            Intent i = new Intent(Intent.ACTION_GET_CONTENT);
            i.addCategory(Intent.CATEGORY_OPENABLE);
            i.setType(mime_type);
            startActivityForResult(Intent.createChooser(i, null),
                    ACTIVITY_REQUEST_PICK_ATTACHMENT);
        }

    protected void onActivityResult(int requestCode, int resultCode,
        Intent imageReturnedIntent) {

    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    mAttachments = (LinearLayout) findViewById(R.id.attachments);

    switch (requestCode) {
    case ACTIVITY_REQUEST_PICK_ATTACHMENT:

        Uri _uri = imageReturnedIntent.getData();

        addAttachment(_uri);

        Cursor cursor = getContentResolver()
                .query(_uri,
                        new String[] { android.provider.MediaStore.Images.ImageColumns.DATA },
                        null, null, null);
        cursor.moveToFirst();
        String imageFilePath = cursor.getString(0);

            uris.add(imageFilePath);



        Log.v("imageFilePath", imageFilePath);
        break;
    }
}

As u see there is i have an AddAttachment method. Here is the code:

private void addAttachment(Uri uri) {
        addAttachment(uri, null);
    }

    private void addAttachment(Uri uri, String contentType) {
        long size = -1;
        String name = null;

        ContentResolver contentResolver = getContentResolver();

        Cursor metadataCursor = contentResolver.query(uri, new String[] {
                OpenableColumns.DISPLAY_NAME, OpenableColumns.SIZE }, null,
                null, null);

        if (metadataCursor != null) {
            try {
                if (metadataCursor.moveToFirst()) {
                    name = metadataCursor.getString(0);
                    size = metadataCursor.getInt(1);
                }
            } finally {
                metadataCursor.close();
            }
        }

        if (name == null) {
            name = uri.getLastPathSegment();
        }

        String usableContentType = contentType;
        if ((usableContentType == null)
                || (usableContentType.indexOf('*') != -1)) {
            usableContentType = contentResolver.getType(uri);
        }
        if (usableContentType == null) {
            usableContentType = getMimeTypeByExtension(name);
        }

        if (size <= 0) {
            String uriString = uri.toString();
            if (uriString.startsWith("file://")) {
                Log.v(LOG_TAG, uriString.substring("file://".length()));
                File f = new File(uriString.substring("file://".length()));
                size = f.length();
            } else {
                Log.v(LOG_TAG, "Not a file: " + uriString);
            }
        } else {
            Log.v(LOG_TAG, "old attachment.size: " + size);
        }
        Log.v(LOG_TAG, "new attachment.size: " + size);

        Attachment attachment = new Attachment();
        attachment.uri = uri;
        attachment.contentType = usableContentType;
        attachment.name = name;
        attachment.size = size;

        View view = getLayoutInflater().inflate(
                R.layout.message_compose_attachment, mAttachments, false);
        TextView nameView = (TextView) view.findViewById(R.id.attachment_name);
        ImageButton delete = (ImageButton) view
                .findViewById(R.id.attachment_delete);
        nameView.setText(attachment.name);
        delete.setTag(view);
        view.setTag(attachment);
        mAttachments.addView(view);


        delete.setOnClickListener(new Button.OnClickListener() {
            public void onClick(View view) {

                uris.remove(view.getTag());
                mAttachments.removeView((View) view.getTag());


            }
        });
    }

and Attachment class that has properties

static class Attachment implements Serializable {
        private static final long serialVersionUID = 3642382876618963734L;
        public String name;
        public String contentType;
        public long size;
        public Uri uri;
    }

finally in my Mail.java class i have AddAttachment method:

public void addAttachment(String file) throws Exception {
    BodyPart messageBodyPart = new MimeBodyPart();

        FileDataSource source =  new FileDataSource(file);
        messageBodyPart.setDataHandler(new DataHandler(source));
        messageBodyPart.setFileName(file);

    _multipart.addBodyPart(messageBodyPart);
}

When i clicked to send button, it have been sending to adress is written. But my attachment can not be shown. I have no error when i sent mail. I hope you had a solution for these problem...

Edit: OK finally i've solved the problem!.. first i've defined ArrayList<String> uris = new ArrayList<String>();

Then i've used it in my onActivityResult method like that uris.add(imageFilePath);

lastly, before m.send code block i've add the images:

for (int i = 0; i<uris.size(); i++)
                    {
                    m.addAttachment(uris.get(i).toString());
                    }

in my Mail.java class, the changes shown like that :

public void addAttachment(String file) throws Exception {
        BodyPart messageBodyPart = new MimeBodyPart();

            FileDataSource source =  new FileDataSource(file);
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(file);

        _multipart.addBodyPart(messageBodyPart);
    }
Vacancy answered 1/5, 2012 at 10:6 Comment(0)
G
1

There definitely the problem of MIME Type. If you want to image attached with email you can send this with simply using

private void sendEmail(String[] to,String[] cc,String subject, String message)
    {

        ArrayList<Uri> uris = new ArrayList<Uri>();


        Uri u = Uri.fromFile(new File(front_image));
        Uri u1 = Uri.fromFile(new File(side_image));
        uris.add(u);
        uris.add(u1);



        Intent emailIntent = new Intent(Intent.ACTION_SEND_MULTIPLE);
        emailIntent.setData(Uri.parse("mailto:"));
        emailIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        emailIntent.setType("image/jpg");
        emailIntent.putExtra(Intent.EXTRA_EMAIL, to);
        emailIntent.putExtra(Intent.EXTRA_CC, cc);
        emailIntent.putExtra(Intent.EXTRA_SUBJECT, subject);
        emailIntent.putExtra(Intent.EXTRA_TEXT, message);
        emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
        /*emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_right_latest_path));
        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_right_prev_path));
        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_front_latest_path));
        emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("file://" + show_front_prev_path));*/
        startActivity(Intent.createChooser(emailIntent, "Email"));


    }  
Georganngeorge answered 1/5, 2012 at 10:11 Comment(1)
thanks for reply. With intent usage, when adding attachment it asks me for choose an application. but i'm trying to develop a new application for send mail with attachment. So i'm developing my application's ui too. so that i try to send mail with attachment without intents.Vacancy
T
0

I hope the string you're passing to the addAttachment method is a file name, not a URL (i.e., doesn't start with "file:").

To debug your problem, add code to the addAttachment method that uses a FileInputStream and see if you can read the data in the file. If you can't, JavaMail won't be able to either.

Also, turn on Session debugging and examine the protocol trace to see what JavaMail is actually sending. That might provide more clues. Or, in your code that actually sends the message, add msg.writeTo(new FileOutputStream("msg.txt")) and see what's written to the file.

Trudy answered 1/5, 2012 at 18:26 Comment(1)
thanks for reply Bill Shannon. I edited the post yesterday and i solved the problem. But i edited my code after the solution,addAttachment method in Mail.java, i changed the file variable 'String' to 'File'. With the result that, when my mail with attachment achieved to the 'to' adresses, its' name will have been clearly the same of file's name.Vacancy

© 2022 - 2024 — McMap. All rights reserved.