Search code examples
androidemail-attachments

Adding txt file attachment to outgoing email in an Android project


I have these two files which enable the sending an email in the background of an Android app. How can I modify the existing code to add and send an attachment? The attachment would be just a regular .txt file.

import android.util.Log;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;



public class GMail {

final String emailPort = "587";// gmail's smtp port
final String smtpAuth = "true";
final String starttls = "true";
final String emailHost = "smtp.gmail.com";


String fromEmail;
String fromPassword;
List<String> toEmailList;
String emailSubject;
String emailBody;

Properties emailProperties;
Session mailSession;
MimeMessage emailMessage;

public GMail() {

}

public GMail(String fromEmail, String fromPassword,
             List<String> toEmailList, String emailSubject, String 
emailBody) {
    this.fromEmail = fromEmail;
    this.fromPassword = fromPassword;
    this.toEmailList = toEmailList;
    this.emailSubject = emailSubject;
    this.emailBody = emailBody;

    emailProperties = System.getProperties();
    emailProperties.put("mail.smtp.port", emailPort);
    emailProperties.put("mail.smtp.auth", smtpAuth);
    emailProperties.put("mail.smtp.starttls.enable", starttls);
    Log.i("GMail", "Mail server properties set.");
}

public MimeMessage createEmailMessage() throws AddressException,
        MessagingException, UnsupportedEncodingException {

    mailSession = Session.getDefaultInstance(emailProperties, null);
    emailMessage = new MimeMessage(mailSession);

    emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail));
    for (String toEmail : toEmailList) {
        Log.i("GMail", "toEmail: " + toEmail);
        emailMessage.addRecipient(Message.RecipientType.TO,
                new InternetAddress(toEmail));
    }

    emailMessage.setSubject(emailSubject);
    emailMessage.setContent(emailBody, "text/html");// for a html email
    // emailMessage.setText(emailBody);// for a text email
    Log.i("GMail", "Email Message created.");
    return emailMessage;
}

public void sendEmail() throws AddressException, MessagingException {

    Transport transport = mailSession.getTransport("smtp");
    transport.connect(emailHost, fromEmail, fromPassword);
    Log.i("GMail", "allrecipients: " + emailMessage.getAllRecipients());
    transport.sendMessage(emailMessage, emailMessage.getAllRecipients());
    transport.close();
    Log.i("GMail", "Email sent successfully.");
}

}

And

import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.util.Log;
import java.util.ArrayList; 
import java.util.List;


public class SendMailTask extends AsyncTask {

private ProgressDialog statusDialog;
private Activity sendMailActivity;

public SendMailTask(Activity activity) {
    sendMailActivity = activity;

}


protected void onPreExecute() {
    statusDialog = new ProgressDialog(sendMailActivity);
    statusDialog.setMessage("Getting ready...");
    statusDialog.setIndeterminate(false);
    statusDialog.setCancelable(false);
    statusDialog.show();
}

@Override
protected Object doInBackground(Object... args) {
    String senderEmail = "XXXXX@gmail.com"; // XXXXXXXXXX
    String senderPassword = "XXXXXX"; // XXXXXXXXX
    String subject = args[0].toString();
    String body = args[1].toString();
    List emailRecipients = new ArrayList();
    emailRecipients.add("XXXXXXX@hotmail.com");

    try {
        Log.i("SendMailTask", "About to instantiate GMail...");
        publishProgress("Processing input....");

        GMail gMail = new GMail(
                senderEmail,
                senderPassword,
                emailRecipients,
                subject,
                body);

        publishProgress("Preparing mail message....");
        gMail.createEmailMessage();
        publishProgress("Sending email....");
        gMail.sendEmail();
        publishProgress("Email Sent.");
        Log.i("SendMailTask", "Mail Sent.");
    } catch (Exception e) {
        publishProgress(e.getMessage());
        Log.e("SendMailTask", e.getMessage(), e);
    }
    return null;
}

@Override
public void onProgressUpdate(Object... values) {
    statusDialog.setMessage(values[0].toString());

}

@Override
public void onPostExecute(Object result) {
    statusDialog.dismiss();
}

}

Solution

  • I figured it out, see the modified method below. Cheers!

    public GMail(String fromEmail, String fromPassword,
                 List<String> toEmailList, String emailSubject, String emailBody, List<String> attachmentFileNames) throws MessagingException {
        this.fromEmail = fromEmail;
        this.fromPassword = fromPassword;
        this.toEmailList = toEmailList;
        this.emailSubject = emailSubject;
        this.emailBody = emailBody;
    
        emailProperties = System.getProperties();
        emailProperties.put("mail.smtp.port", emailPort);
        emailProperties.put("mail.smtp.auth", smtpAuth);
        emailProperties.put("mail.smtp.starttls.enable", starttls);
        Log.i("GMail", "Mail server properties set.");
    
        if (attachmentFileNames != null && !attachmentFileNames.isEmpty()) {
            for (String filename : attachmentFileNames) {
                MimeBodyPart messageBodyPart = new MimeBodyPart();
                DataSource source = new FileDataSource(filename);
                messageBodyPart.setDataHandler(new DataHandler(source));
                messageBodyPart.setFileName(filename);
    
                attachments.add(messageBodyPart);
            }
        }
    }
    
    public MimeMessage createEmailMessage() throws AddressException,
            MessagingException, UnsupportedEncodingException {
    
        mailSession = Session.getDefaultInstance(emailProperties, null);
        emailMessage = new MimeMessage(mailSession);
    
        emailMessage.setFrom(new InternetAddress(fromEmail, fromEmail));
        for (String toEmail : toEmailList) {
            Log.i("GMail", "toEmail: " + toEmail);
            emailMessage.addRecipient(Message.RecipientType.TO,
                    new InternetAddress(toEmail));
        }
    
        emailMessage.setSubject(emailSubject);
    
        if (attachments.size() > 0) {
            // Create the message part
            BodyPart messageBodyPart = new MimeBodyPart();
    
            // Now set the actual message
            messageBodyPart.setContent(emailBody, "text/html");
    
            // Create a multipart message
            Multipart multipart = new MimeMultipart();
    
            // Set text message part
            multipart.addBodyPart(messageBodyPart);
    
            // attachments
            for (MimeBodyPart att : attachments) {
                multipart.addBodyPart(att);
            }
    
            // Send the complete message parts
            emailMessage.setContent(multipart);
        } else {
            emailMessage.setContent(emailBody, "text/html");// for a html email
        }
    
        // emailMessage.setText(emailBody);// for a text email
        Log.i("GMail", "Email Message created.");
        return emailMessage;
    }