2017-10-14 6 views
0

Cette question concerne la gestion des bibliothèques dans NetBeans, lors de la programmation en Java. J'ai un projet Java, appelons-le ABC. J'ai un projet Java. Une de ses activités consiste à envoyer un message électronique. Certains de mes autres projets Java envoient également des messages électroniques, j'ai donc décidé de créer un projet Java distinct pour l'envoi de messages. Ce projet s'appelle SendEmail. SendEmail utilise des fichiers jar externes (javax.mail. *). Ceux-ci sont inclus en accédant au projet Propriétés de SendEmail -> Bibliothèques -> Ajouter un fichier JAR. Test SendEmail fonctionne correctement: lorsque j'appelle sa méthode sendMail (titre, contenu), puis-je recevoir l'e-mail envoyé? Le projet ABC utilise SendEmail. J'ai donc ajouté ceci à la bibliothèque d'ABC: Propriétés du projet -> Bibliothèques -> Ajouter un projet. ABC compile et fonctionne bien jusqu'à ce qu'il atteigne le point où il veut envoyer un email: il se bloque.Comment utiliser les bibliothèques correctement dans Netbeans (Java)?

private void informUser(){ 
//create message title 
//create message contents 
SendEmail email = new SendEmail(); 
email.sendMail(title, contents); // <- it crashes here 
} 

L'information d'erreur indique qu'elle ne peut pas trouver la classe Authenticator. Cette classe se trouve dans le fichier JAR externe inclus dans la bibliothèque de SendEmail. Je peux seulement éviter ce plantage en incluant les fichiers JAR externes à la bibliothèque d'ABC. C'est ce que je ne pensais pas être nécessaire. ABC n'utilise pas ces fichiers jar externes, seul SendEmail le fait.

Ma question: est-ce que je fais quelque chose de mal? J'ai supposé qu'ABC n'utilisait pas ces bocaux externes, ils n'ont donc pas besoin d'être dans la bibliothèque d'ABC.

Répondre

0

Dans votre code ne possédez pas la partie authentifiant. Ce code ne peut utiliser que l'e-mail gmail, vous pouvez modifier les options du serveur SMTP. Mon code:

import java.io.ByteArrayInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.security.Security; 
import java.util.Properties; 

import javax.activation.DataHandler; 
import javax.activation.DataSource; 
import javax.mail.Message; 
import javax.mail.PasswordAuthentication; 
import javax.mail.Session; 
import javax.mail.Transport; 
import javax.mail.internet.InternetAddress; 
import javax.mail.internet.MimeMessage; 


public class GmailSender extends javax.mail.Authenticator { 

    private String user; 
    private String password; 
    private Session session; 

    static { 
     Security.addProvider(new JSSEProvider()); 
    } 

    public GmailSender(String user, String password) { 
     this.user = user; 
     this.password = password; 

     Properties props = new Properties(); 
     props.setProperty("mail.transport.protocol", "smtp"); 
     props.setProperty("mail.smtp.host", "smtp.gmail.com"); 
     props.put("mail.smtp.starttls.enable", "true"); 
     props.put("mail.smtp.auth", "true"); 
     props.put("mail.smtp.port", "465"); 
     props.put("mail.smtp.socketFactory.port", "465"); 
     props.put("mail.smtp.socketFactory.class", 
       "javax.net.ssl.SSLSocketFactory"); 
     props.put("mail.smtp.socketFactory.fallback", "false"); 
     props.setProperty("mail.smtp.quitwait", "false"); 

     session = Session.getDefaultInstance(props, this); 
    } 

    protected PasswordAuthentication getPasswordAuthentication() { 
     return new PasswordAuthentication(user, password); 
    } 

    public synchronized void sendMail(String subject, String body, String sender, String recipients) throws Exception { 
     try { 
      MimeMessage message = new MimeMessage(session); 
      DataHandler handler = new DataHandler(new ByteArrayDataSource(body.getBytes(), "text/plain")); 
      message.setSender(new InternetAddress(sender)); 
      message.setSubject(subject); 
      message.setDataHandler(handler); 
      if (recipients.indexOf(',') > 0) 
       message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(recipients)); 
      else 
       message.setRecipient(Message.RecipientType.TO, new InternetAddress(recipients)); 
      Transport.send(message); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public class ByteArrayDataSource implements DataSource { 
     private byte[] data; 
     private String type; 

     public ByteArrayDataSource(byte[] data, String type) { 
      super(); 
      this.data = data; 
      this.type = type; 
     } 

     public ByteArrayDataSource(byte[] data) { 
      super(); 
      this.data = data; 
     } 

     public void setType(String type) { 
      this.type = type; 
     } 

     public String getContentType() { 
      if (type == null) 
       return "application/octet-stream"; 
      else 
       return type; 
     } 

     public InputStream getInputStream() throws IOException { 
      return new ByteArrayInputStream(data); 
     } 

     public String getName() { 
      return "ByteArrayDataSource"; 
     } 

     public OutputStream getOutputStream() throws IOException { 
      throw new IOException("Not Supported"); 
     } 
    } 


} 

Et avez-vous besoin de cette classe:

import java.security.AccessController; 
import java.security.Provider; 

public class JSSEProvider extends Provider { 
    public JSSEProvider() { 
     super("HarmonyJSSE", 1.0, "Harmony JSSE Provider"); 
     AccessController.doPrivileged(new java.security.PrivilegedAction<Void>() { 
      public Void run() { 
       put("SSLContext.TLS", 
         "org.apache.harmony.xnet.provider.jsse.SSLContextImpl"); 
       put("Alg.Alias.SSLContext.TLSv1", "TLS"); 
       put("KeyManagerFactory.X509", 
         "org.apache.harmony.xnet.provider.jsse.KeyManagerFactoryImpl"); 
       put("TrustManagerFactory.X509", 
         "org.apache.harmony.xnet.provider.jsse.TrustManagerFactoryImpl"); 
       return null; 
      } 
     }); 
    } 
} 

Pour utiliser ce code:

class SendEmailTask extends AsyncTask<Void, Void, Void> { 

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

     @Override 
     protected Void doInBackground(Void... params) { 
      try { 
       GmailSender sender = new GmailSender("from email", "from email password"); 
       //subject, body, sender, to 
       StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); 
       StrictMode.setThreadPolicy(policy); 
       sender.sendMail("your title", 
         "your content", 
         "from email", 
         "to email"); 
      } catch (Exception e) {    
       e.printStackTrace(); 
      } 
      return null; 
     } 

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

     } 
    } 

et exécuter

SendEmailTask sendEmailTask = new SendEmailTask(); 
sendEmailTask.execute(); 

UPD1: Libs: 1. javax.activation 2. javax.mail

+0

Désolé, mais je ne pense pas que cela répond à ma question. J'ai un programme qui peut envoyer des courriels, comme je l'ai expliqué dans la question. Ma question concerne l'utilisation de ce programme d'envoi d'e-mails dans un autre projet Netbeans et les paramètres de bibliothèque requis dans cet autre projet. – Joe