Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Mail, sending multiple attachments not working

I looked at many entries on the internet without having luck.

Here is my code:

import java.io.IOException;
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.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class MailTest
{

    public static void main(String[] args) throws AddressException, MessagingException, IOException
    {
        String host = "***";
        String from = "b";
        String to = "***";

        // Get system properties
        Properties props = System.getProperties();

        // Setup mail server
        props.put("mail.smtp.host", host);

        // Get session
        Session session = Session.getDefaultInstance(props, null);

        // Define message
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        message.addRecipient(Message.RecipientType.TO, new InternetAddress(to));
        message.setSubject("Hello JavaMail");
        message.setText("Welcome to JavaMail");

        // Handle attachment 1
        MimeBodyPart messageBodyPart1 = new MimeBodyPart();
        messageBodyPart1.attachFile("c:/Temp/a.txt");

        // Handle attachment 2
        MimeBodyPart messageBodyPart2 = new MimeBodyPart();
        messageBodyPart2.attachFile("c:/Temp/b.txt");

        MimeMultipart multipart = new MimeMultipart("related");

        multipart.addBodyPart(messageBodyPart1);
        multipart.addBodyPart(messageBodyPart2);

        message.setContent(multipart);

        // Send message
        Transport.send(message);
    }
}

The result is that i only get the first file attached.

  1. I tried calling the attachFile method more than once but then it only applies the last attachment
  2. I tried playing with the indexes at addBodyPart: no help

I checked the plain message and i see the other file in it with the same identifier and it is not listed in the attachments for some reason.

Any help would be appreciated, Dave

like image 615
dbalakirev Avatar asked Jan 23 '12 10:01

dbalakirev


2 Answers

Multipart multipart = new MimeMultipart("mixed");
for (String str : attachment_PathList) {
    MimeBodyPart messageBodyPart = new MimeBodyPart();
    DataSource source = new FileDataSource(str);
    messageBodyPart.setDataHandler(new DataHandler(source));
    messageBodyPart.setFileName(source.getName());
    multipart.addBodyPart(messageBodyPart);
}
msg.setContent(multipart);
Transport.send(msg);
like image 67
Kushan Avatar answered Nov 14 '22 16:11

Kushan


    try
    {
        String host = "smtp.gmail.com";
        String from = "sender gmail id";
        String pass = "sender password";
        Properties props = System.getProperties();
        props.put("mail.smtp.starttls.enable", "true"); // added this line
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", from);
        props.put("mail.smtp.password", pass);
        props.put("mail.smtp.port", "587");
        props.put("mail.smtp.auth", "true");
        String[] to = {"receiver ids"}; // In this array you can add more ids
        Session session = Session.getDefaultInstance(props, null);
        MimeMessage message = new MimeMessage(session);
        message.setFrom(new InternetAddress(from));
        InternetAddress[] toAddress = new InternetAddress[to.length];
        // To get the array of addresses
        for( int i=0; i < to.length; i++ )
        { // changed from a while loop
            toAddress[i] = new InternetAddress(to[i]);
        }
        System.out.println(Message.RecipientType.TO);
        for( int i=0; i < toAddress.length; i++) 
        {
        // changed from a while loop
            message.addRecipient(Message.RecipientType.TO, toAddress[i]);
        }
        message.setSubject("sending in a group");
        message.setText("Welcome to JavaMail");
        // set ur text message
        BodyPart messageBodyPart1 = new MimeBodyPart();
        messageBodyPart1.setText("This is message body");
        //file path that you want to attatch
        // you are able to send multipule file simultaneously
        String filename[] ={"C:\\Documents and Settings\\admin\\Desktop\\imp data\\emil id.txt" ,"C:\\Documents and Settings\\admin\\Desktop\\imp data\\emil id.txt"};//change accordingly
        Multipart multipart = new MimeMultipart();
        multipart.addBodyPart(messageBodyPart1);
        for(int i=0 ; i<filename.length ; i++)
        {
            MimeBodyPart messageBodyPart2 = new MimeBodyPart();
            DataSource source = new FileDataSource(filename[i]);
            messageBodyPart2.setDataHandler(new DataHandler(source));
            messageBodyPart2.setFileName(filename[i]);
            multipart.addBodyPart(messageBodyPart2);
        }
        // both part add into maulti part 
        // set message content
        message.setContent(multipart);
        // Trans port the message 
        Transport transport = session.getTransport("smtp");
        transport.connect(host, from, pass);
        transport.sendMessage(message, message.getAllRecipients());
        transport.close();
    }
    catch(Exception ex)
    {
    ex.printStackTrace();
    }
like image 45
Prashant Tiwari Avatar answered Nov 14 '22 18:11

Prashant Tiwari