简体   繁体   中英

How to add attachment to my mail sender JavaMail?

i'm trying to add an attachment button to my mail sender. I'm using the libraries JavaMail Mail, activation and additionnal. My sender is splited into 3 files :

  • MainActivity which allow the user to set the content of the mail ith edit texts
  • SendMail which allow me to set the sender, and the content from edit texts to the mail and send it
  • Config which is storing informations like transmitter's address and password and the receiver's address Here is the code of my actual mail sender which send mail properly but without attachment.

SendMail.java

package com.myapp.attch_mail;

import android.annotation.SuppressLint;
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;
import java.util.Properties;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;


public class SendMail extends AsyncTask<Void,Void,Void> {

private Context context;

private String subject;
private String message;

private ProgressDialog progressDialog;


SendMail(Context context, String subject, String message){

    this.context = context;
    this.subject = subject;
    this.message = message;

}


@Override
protected void onPreExecute() {
    super.onPreExecute();

    progressDialog = ProgressDialog.show(context,"Envoi en cours","Veuillez patienter...",false,false);
}


@Override
protected void onPostExecute(Void aVoid) {
    super.onPostExecute(aVoid);

    progressDialog.dismiss();

    Toast.makeText(context,"Message sent",Toast.LENGTH_LONG).show();
}


@Override
protected Void doInBackground(Void... params) {

    Properties props = new Properties();


    props.put("mail.smtp.host", "smtp.gmail.com");
    props.put("mail.smtp.socketFactory.port", "465");
    props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
    props.put("mail.smtp.auth", "true");
    props.put("mail.smtp.port", "465");

    Session session = Session.getDefaultInstance(props,
            new javax.mail.Authenticator() {


                protected PasswordAuthentication getPasswordAuthentication() {
                    return new PasswordAuthentication(Config.EMAIL_SENDER, Config.PASSWORD);
                }
            });

    try {

        MimeMessage mm = new MimeMessage(session);

        mm.setFrom(new InternetAddress(Config.EMAIL_SENDER));

        mm.addRecipient(Message.RecipientType.TO, new InternetAddress(Config.EMAIL_RECEIVER));

        mm.setSubject(subject);

        mm.setText(message);

        Transport.send(mm);

    } catch (MessagingException e) {
        e.printStackTrace();
    }
    return null;
}
}

MainActivity.java


package  com.my_app.attach_mail;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;


public class L3C1 extends AppCompatActivity implements View.OnClickListener {


private EditText objet_siq;
private EditText corps_siq;
private EditText prenom_siq;
private EditText nom_siq;
private EditText telephone_siq;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_l3_c1);


        object = findViewById(R.id.objet_siq);
        body = findViewById(R.id.corps_siq);
        first_name= findViewById(R.id.prenom_siq);
        last_name= findViewById(R.id.nom_siq);
        phone= findViewById(R.id.telephone_siq);


        Button buttonSend = findViewById(R.id.send_mail_siq);
        Button buttonAttachment = findViewById(R.id.add_attachment_siq);


        buttonSend.setOnClickListener(this);
        buttonAttachment.setOnClickListener(this);

}


private void sendEmail() {

    String subject = objet_siq.getText().toString().trim();
    String message = "Nom / Prénom : " + prenom_siq.getText().toString().trim() + " " + nom_siq.getText().toString().trim() + "\n" +"Téléphone : " + telephone_siq.getText().toString().trim() + "\n" + "\n" + "Description du problème : " + "\n" + corps_siq.getText().toString().trim() + "\n" + "\n" + "Cordialement, " +  prenom_siq.getText().toString().trim() + " " +nom_siq.getText().toString().trim();


    SendMail sm_siq = new SendMail(this, subject, message);


    sm_siq.execute();
}


@Override
public void onClick(View view) {
    sendEmail();

    object.setText("");
    body.setText("");
    first_name.setText("");
    last_name.setText("");
    phone.setText("");

}

}

I got it ! I look at the MimeMessage documentation and found the solution, you just have to change the content inside of the try (in SendMail.java) to this :

        MimeMessage mimeMessage = new MimeMessage(session);

        MimeMultipart mimeMultipart = new MimeMultipart();


        MimeBodyPart messageBodyPart = new MimeBodyPart();

        messageBodyPart.setContent(message, "text/plain; charset=UTF-8");

        mimeMultipart.addBodyPart(messageBodyPart);



        MimeBodyPart attachmentBodyPart = new MimeBodyPart();

        String filename = "path to your file, exemple : /storage/path.txt" ;
        DataSource source = new FileDataSource(filename);
        attachmentBodyPart.setDataHandler(new DataHandler(source));
        attachmentBodyPart.setFileName(filename);

        mimeMultipart.addBodyPart(attachmentBodyPart);


        mimeMessage.setFrom(new InternetAddress(Config.MAIL_SENDER));

        mimeMessage.addRecipient(Message.RecipientType.TO, new 
        InternetAddress(Config.MAIL_RECEIVER));

        mimeMessage.setSubject(subject);

        mimeMessage.setContent(mimeMultipart);

        Transport.send(mimeMessage);

I also changed the names of instances I used.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM