web-dev-qa-db-fra.com

Envoi d'un courrier électronique avec une pièce jointe à l'aide de l'API javamail

J'essaie d'envoyer un courrier électronique avec une pièce jointe en Java.

Lorsque j'envoie un e-mail sans pièce jointe, je le reçois, mais lorsque j'ajoute une pièce jointe, je ne reçois rien et je ne reçois aucun message d'erreur.

C'est le code que j'utilise:

public void send () throws AddressException, MessagingException{
    //system properties

Properties  props = new Properties();
props.put("mail.smtp.localhost", "localhost"); 
props.put("mail.smtp.Host",Configurations.getInstance().email_serverIp); 


/*
 *  create some properties and get the default Session
 */
session = Session.getDefaultInstance(props, null);

//session
Session session = Session.getInstance(props, null);

Message message = new MimeMessage(session);
message.setFrom(new InternetAddress("[email protected]"));
message.setRecipients(Message.RecipientType.TO,
        InternetAddress.parse("[email protected]"));
message.setSubject("Testing Subject");
message.setText("PFA");

MimeBodyPart messageBodyPart = new MimeBodyPart();

Multipart multipart = new MimeMultipart();
   generateCsvFile("/tmp/test.csv"); 
messageBodyPart = new MimeBodyPart();
String file = "/tmp/test.csv";
String fileName = "test.csv"; 
DataSource source = new FileDataSource(file);
messageBodyPart.setDataHandler(new DataHandler(source));
messageBodyPart.setFileName(fileName);
multipart.addBodyPart(messageBodyPart);

message.setContent(multipart);

System.out.println("Sending");

Transport.send(message);

System.out.println("Done");

}

private static void generateCsvFile(String sFileName)
{
    try
    {

    FileWriter writer = new FileWriter(sFileName);

    writer.append("DisplayName");
    writer.append(',');
    writer.append("Age");
    writer.append(',');
    writer.append("YOUR NAME");
    writer.append(',');

    writer.append('\n');
    writer.append("Zou");
    writer.append(',');
    writer.append("26");
    writer.append(',');
    writer.append("zouhaier");


    //generate whatever data you want

    writer.flush();
    writer.close();
    }
    catch(IOException e)
    {
         e.printStackTrace();
    } 
 }

Comment puis-je corriger cela?

7
mhamdizo
  1. Désactiver votre anti-virus 

parce que vous avez un avertissement comme celui-ci

warning message form antivirus

Essayez ce code ... ça vous aide ....

public class SendMail {
    public SendMail() throws MessagingException {
        String Host = "smtp.gmail.com";
        String Password = "............";
        String from = "[email protected]";
        String toAddress = "[email protected]";
        String filename = "C:/SendAttachment.Java";
        // Get system properties
        Properties props = System.getProperties();
        props.put("mail.smtp.Host", Host);
        props.put("mail.smtps.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        Session session = Session.getInstance(props, null);

        MimeMessage message = new MimeMessage(session);

        message.setFrom(new InternetAddress(from));

        message.setRecipients(Message.RecipientType.TO, toAddress);

        message.setSubject("JavaMail Attachment");

        BodyPart messageBodyPart = new MimeBodyPart();

        messageBodyPart.setText("Here's the file");

        Multipart multipart = new MimeMultipart();

        multipart.addBodyPart(messageBodyPart);

        messageBodyPart = new MimeBodyPart();

        DataSource source = new FileDataSource(filename);

        messageBodyPart.setDataHandler(new DataHandler(source));

        messageBodyPart.setFileName(filename);

        multipart.addBodyPart(messageBodyPart);

        message.setContent(multipart);

        try {
            Transport tr = session.getTransport("smtps");
            tr.connect(Host, from, Password);
            tr.sendMessage(message, message.getAllRecipients());
            System.out.println("Mail Sent Successfully");
            tr.close();

        } catch (SendFailedException sfe) {

            System.out.println(sfe);
        }
    }
    public static void main(String args[]){
        try {
            SendMail sm = new SendMail();
        } catch (MessagingException ex) {
            Logger.getLogger(SendMail.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}
14
sathya

Voir le JavaMail FAQ pour des conseils de débogage . En particulier, la trace du protocole vous en dira plus sur ce qui se passe dans chaque cas. Pendant que vous y êtes, vous trouverez également des conseils pour utiliser GMail.

Si la seule différence est simplement l'ajout d'une pièce jointe, il semble peu probable qu'il s'agisse d'un problème d'authentification. Il se peut que vous receviez une exception que vous ne remarquerez pas puisque votre méthode d'envoi est déclarée pour lancer une exception MessagingException.

1
Bill Shannon

Vous pouvez essayer quelque chose comme:

File f = new File(file);
MimeBodyPart attachmentPart = new MimeBodyPart();
attachmentPart.attachFile(f);
multipart.addBodyPart(attachmentPart);

Voir plus de détails sur: Envoyer un courriel via SMTP avec pièce jointe, texte brut/texte et texte/hml

1
Rafa

Vous pouvez accéder à Gmail en utilisant le nom d'utilisateur et le mot de passe. Mais l'accès sera refusé par le compte gmail. 

Vous devez donc modifier le niveau de sécurité en accédant aux paramètres du compte, à la section mot de passe, puis annuler les paramètres de sécurité du code de vérification ou réduire votre niveau de sécurité en fonction de l’ancienne ou de la dernière application Gmail.

Si vous souhaitez envoyer la pièce jointe via gmail en accédant au répertoire local, vous devez utiliser l'objet File pour qu'il soit défini sur la classe de constructeur DataSource, comme indiqué dans le programme ci-dessous. Cela évitera l'exception "Accès refusé".

import Java.io.File;    
import Java.io.IOException;    
import Java.util.Properties;   
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class EmailApp {
    public static void main(String[] args)throws IOException {
        final String username = "[email protected]";
        final String password = "mypassword";

        Properties props = new Properties();
        props.put("mail.smtp.auth", "true");
        props.put("mail.smtp.starttls.enable", "true");
        props.put("mail.smtp.Host", "smtp.gmail.com");
        props.put("mail.smtp.port", "587");

        Session session = Session.getInstance(props, new javax.mail.Authenticator() {
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication(username, password);
            }
        });

        try {
            Message message = new MimeMessage(session);
            message.setFrom(new InternetAddress("[email protected]"));
            message.setRecipients(Message.RecipientType.TO,
            InternetAddress.parse("[email protected]"));
            message.setSubject("Testing Subject");
            message.setText("Dear Mail Crawler," + "\n\n No spam to my email, please!");
            message.setSubject("Testing Subject");
            message.setText("PFA");

            MimeBodyPart messageBodyPart = new MimeBodyPart();
            Multipart multipart = new MimeMultipart();
            messageBodyPart = new MimeBodyPart();

            String attachmentPath = "C:/TLS/logs/26-Mar-2015";
            String attachmentName = "LogResults.txt";

            File att = new File(new File(attachmentPath), attachmentName);
            messageBodyPart.attachFile(att);

            DataSource source = new FileDataSource(att);
            messageBodyPart.setDataHandler(new DataHandler(source));
            messageBodyPart.setFileName(attachmentName);
            multipart.addBodyPart(messageBodyPart);
            message.setContent(multipart);

            System.out.println("Sending");
            Transport.send(message);
            Transport.send(message);
            System.out.println("Done");
        } catch (MessagingException e) {
            throw new RuntimeException(e);
        }
    }
}
1

Un message électronique se compose d'un en-tête et d'un segment de corps. 

La partie en-tête contiendra de, à et sujet.

Le corps contient les pièces jointes. Pour prendre en charge le transport des pièces jointes dans le corps, tapez Multipart devrait exister. 

L'objet Multipart contient plusieurs parties dans lesquelles chaque partie est représentée sous la forme d'un type de BodyPart dont la sous-classe, MimeBodyPart - peut prendre un fichier comme contenu.

Pour ajouter des pièces jointes à la classe de corps de courrier MimeBodyPart, vous disposez de méthodes pratiques.

// JavaMail 1.3
MimeBodyPart attachPart = new MimeBodyPart();
String attachFile = "D:/test.pdf";

DataSource source = new FileDataSource(attachFile);
attachPart.setDataHandler(new DataHandler(source));
attachPart.setFileName(new File(attachFile).getName());

multipart.addBodyPart(attachPart);


// JavaMail 1.4
MimeBodyPart attachPart = new MimeBodyPart();
String attachFile = "D:/test.pdf";
attachPart.attachFile(attachFile);
multipart.addBodyPart(attachPart);

Pour plus d'informations, consultez ce lien.

https://www.tutorialspoint.com/javamail_api/javamail_api_send_email_with_attachment.htm

0
Dulith De Costa