1

I'm working on an Android PhoneGap project using EmailComposer. Everything is working except the attachments part. I don't see any errors in the LogCat in eclipse. Been surfing around for solutions on web to find out why the file is not being attached to the email. My 2.2.2 and 4.0.4 android devices work fine but again no emails are being attached. I'm Using cordova.2.9.0.jar. Can someone shed some light?


Here is the .js email composer that triggers the EmailComposerWithAttachment plugin.

    function composeText(){
     window.plugins.emailComposer.showEmailComposerWithCallback(
          null,
          "Look at this photo","Take a look at <b>this<b/>:",
           ["example@email.com", "johndoe@email.org"],
           [],
           [],
           true,
           ["file:///mnt/sdcard/Android/data/com.thing.thing/cache/thing/file.wav"]
                );
     }

This is the EmailComposer.java file

import java.io.File;
import java.util.ArrayList;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.Intent;
import android.net.Uri;
import android.text.Html;

import org.apache.cordova.api.CallbackContext;
import org.apache.cordova.api.CordovaPlugin;
import org.apache.cordova.api.LOG;

public class EmailComposer extends CordovaPlugin {

    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if ("showEmailComposer".equals(action)) {

            try {
                JSONObject parameters = args.getJSONObject(0);
                if (parameters != null) {
                    sendEmail(parameters);
                }
            } catch (Exception e) {

            }
            callbackContext.success();
            return true;
        }
        return false;  // Returning false results in a "MethodNotFound" error.
    }

    private void sendEmail(JSONObject parameters) {

        final Intent emailIntent = new Intent(android.content.Intent.ACTION_SEND_MULTIPLE);

        //String callback = parameters.getString("callback");

        boolean isHTML = false;
        try {
            isHTML = parameters.getBoolean("bIsHTML");
        } catch (Exception e) {
            LOG.e("EmailComposer", "Error handling isHTML param: " + e.toString());
        }

        if (isHTML) {
            emailIntent.setType("text/html");
        } else {
            emailIntent.setType("text/plain");
        }

        // setting subject
        try {
            String subject = parameters.getString("subject");
            if (subject != null && subject.length() > 0) {
                emailIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
            }
        } catch (Exception e) {
            LOG.e("EmailComposer", "Error handling subject param: " + e.toString());
        }

        // setting body
        try {
            String body = parameters.getString("body");
            if (body != null && body.length() > 0) {
                if (isHTML) {
                    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, Html.fromHtml(body));
                } else {
                    emailIntent.putExtra(android.content.Intent.EXTRA_TEXT, body);
                }
            }
        } catch (Exception e) {
            LOG.e("EmailComposer", "Error handling body param: " + e.toString());
        }

        // setting TO recipients
        try {
            JSONArray toRecipients = parameters.getJSONArray("toRecipients");
            if (toRecipients != null && toRecipients.length() > 0) {
                String[] to = new String[toRecipients.length()];
                for (int i=0; i<toRecipients.length(); i++) {
                    to[i] = toRecipients.getString(i);
                }
                emailIntent.putExtra(android.content.Intent.EXTRA_EMAIL, to);
            }
        } catch (Exception e) {
            LOG.e("EmailComposer", "Error handling toRecipients param: " + e.toString());
        }

        // setting CC recipients
        try {
            JSONArray ccRecipients = parameters.getJSONArray("ccRecipients");
            if (ccRecipients != null && ccRecipients.length() > 0) {
                String[] cc = new String[ccRecipients.length()];
                for (int i=0; i<ccRecipients.length(); i++) {
                    cc[i] = ccRecipients.getString(i);
                }
                emailIntent.putExtra(android.content.Intent.EXTRA_CC, cc);
            }
        } catch (Exception e) {
            LOG.e("EmailComposer", "Error handling ccRecipients param: " + e.toString());
        }

        // setting BCC recipients
        try {
            JSONArray bccRecipients = parameters.getJSONArray("bccRecipients");
            if (bccRecipients != null && bccRecipients.length() > 0) {
                String[] bcc = new String[bccRecipients.length()];
                for (int i=0; i<bccRecipients.length(); i++) {
                    bcc[i] = bccRecipients.getString(i);
                }
                emailIntent.putExtra(android.content.Intent.EXTRA_BCC, bcc);
            }
        } catch (Exception e) {
            LOG.e("EmailComposer", "Error handling bccRecipients param: " + e.toString());
        }

        // setting attachments
        try {
            JSONArray attachments = parameters.getJSONArray("attachments");
            if (attachments != null && attachments.length() > 0) {
                ArrayList<Uri> uris = new ArrayList<Uri>();

                //convert from paths to Android friendly Parcelable Uri's
                for (int i=0; i<attachments.length(); i++) {
                    try {
                        File file = new File(attachments.getString(i));
                        if (file.exists()) {
                            Uri uri = Uri.fromFile(file);
                            uris.add(uri);
                        }
                    } catch (Exception e) {
                        LOG.e("EmailComposer", "Error adding an attachment: " + e.toString());
                    }
                }
                if (uris.size() > 0) {
                    emailIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris);
                }
            }
        } catch (Exception e) {
            LOG.e("EmailComposer", "Error handling attachments param: " + e.toString());
        }

        this.cordova.startActivityForResult(this, emailIntent, 0);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        // todo handle callback
        super.onActivityResult(requestCode, resultCode, intent);
        LOG.e("EmailComposer", "ResultCode: " + resultCode);
        // IT DOESN'T SEEM TO HANDLE RESULT CODES
    }

}

And last but not least the EmailComposer.js file

    // window.plugins.emailComposer

function EmailComposer() {
    this.resultCallback = null; // Function
}

EmailComposer.ComposeResultType = {
    Cancelled:0,
    Saved:1,
    Sent:2,
    Failed:3,
    NotSent:4
}



// showEmailComposer : all args optional

EmailComposer.prototype.showEmailComposer = function(subject,body,toRecipients,ccRecipients,bccRecipients,bIsHTML,attachments) {
    console.log("****************************AVVIATO");
    var args = {};
    if(toRecipients)
        args.toRecipients = toRecipients;
    if(ccRecipients)
        args.ccRecipients = ccRecipients;
    if(bccRecipients)
        args.bccRecipients = bccRecipients;
    if(subject)
        args.subject = subject;
    if(body)
        args.body = body;
    if(bIsHTML)
        args.bIsHTML = bIsHTML;
    if(attachments)
        args.attachments = attachments;

    cordova.exec(null, null, "EmailComposer", "showEmailComposer", [args]);
}

EmailComposer.prototype.showEmailComposerWithCallback = function(callback, subject, body, toRecipients, ccRecipients, bccRecipients, isHTML, attachments) {
    this.resultCallback = callback;
    this.showEmailComposer.apply(this,[subject,body,toRecipients,ccRecipients,bccRecipients,isHTML,attachments]);
}

EmailComposer.prototype._didFinishWithResult = function(res) {
    this.resultCallback(res);
}

cordova.addConstructor(function()  {
    console.log("****************************");
                       if(!window.plugins)
                       {
                       window.plugins = {};
                       }

                       // shim to work in 1.5 and 1.6
                       if (!window.Cordova) {
                       window.Cordova = cordova;
                       };

                       window.plugins.emailComposer = new EmailComposer();
                       });

Note that I have been to the original EmailComposer github repo bit did not find any answers there. Stackoverflow provided some insights but it didn't nail it on the head for attachments specifically. Any help is greatly appreciated.

Josue
  • 9
  • 4

2 Answers2

0

I have also faced same issue in my project. What ever i have seen, the problem lies with the path of the file. Attachments are shown when we go for the compose, but the receiver never gets the attached file.

I changed my code to store the file on sdcard, then send that path to composer and it worked fine for me.

So give it a try like "file:///sdcard/file.wav". This will work if you can get to store that file to this location.

Ashis Kumar
  • 6,494
  • 2
  • 21
  • 36
  • I tried android_asset/www/file and this did not work. I tried creating and writing to the file system and that didnt work either. So Im super stumped. I also tried grabing an image from my gallery image on my phone to attach but that also failed to attach. Really stumped here. Is there a working phongap android emailcomposer app that actually sends an attachment out there on the web? – Josue Jul 28 '13 at 05:20
  • Hi, i have done as you have mentioned here can you please help me. i am having probelm with attachment http://stackoverflow.com/questions/19111638/multiple-mail-attachment-phonegap – surhidamatya Oct 01 '13 at 08:50
0

For Android, You just need to remove "file:///" from your file path.

function composeText(){
var filePath = "file:///mnt/sdcard/Android/data/com.thing.thing/cache/thing/file.wav";
filePath = filePath.replace(/file:\/\/\//g, '');
 window.plugins.emailComposer.showEmailComposerWithCallback(
      null,
      "Look at this photo","Take a look at <b>this<b/>:",
       ["example@email.com", "johndoe@email.org"],
       [],
       [],
       true,
       [filePath]
            );
 }
Sana
  • 319
  • 1
  • 3
  • 18