Enviando e-mail a partir de uma aplicação Swing

Boa tarde colegas !

Depois de várias consultas e dicas dos colegas cheguei ao seguinte código:


/*
 * SendMail.java
 *
 * Created on 14 de Agosto de 2007, 10:04
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.atm.util;

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; 
import javax.swing.JOptionPane;

/**
 *
 * @author r100320
 */
public class SendMail {

    private static final String SMTP_HOST_NAME = "smtp.gmail.com";     
    private static final String SMTP_PORT = "465";     
    private static final String emailMsgTxt = "Teste";     
    private static final String emailSubjectTxt = "Testando o Gemail!";     
    private static final String emailFromAddress = "joseedmilson@gmail.com";     
    private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
    private static final String sendTo = "joseedmilson@gmail.com" ;     
    
    public void SendMessage(){
        JOptionPane.showMessageDialog(null,"Iniciando envio de email");
        Properties props = new Properties();         
        props.put ("mail.smtp.host", SMTP_HOST_NAME); 
        props.put("mail.smtp.auth", "true"); 
        props.put("mail.debug", "true");         
        props.put("mail.smtp.port", SMTP_PORT);         
        props.put("mail.smtp.socketFactory.port", SMTP_PORT); 
        props.put("mail.smtp.socketFactory.class", SSL_FACTORY); 
        props.put ("mail.smtp.starttls.enable", "true"); 
        props.put("mail.smtp.socketFactory.fallback", "false"); 
              
        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {             
            protected PasswordAuthentication getPasswordAuthentication() { 
                return new PasswordAuthentication("user", "password"); 
            } 
        }); 
        
        
        session.setDebug(true); 
        Message msg = new MimeMessage(session); 

        try { 
            msg.setFrom(new InternetAddress(emailFromAddress)); 
            msg.setRecipient(Message.RecipientType.TO, new InternetAddress(sendTo));
            
            msg.setSubject(emailSubjectTxt); 
            msg.setContent(emailMsgTxt, "text/plain"); 
            Transport.send(msg); 
            JOptionPane.showMessageDialog(null,"Email enviado");
            
        } catch (MessagingException e) { 
            System.out.println("ERRO =" + e.getMessage()); 
        }                 
    }
    
    public static void main(String[] args) { 
        SendMail sd = new SendMail();
        sd.SendMessage();
    } 
}

Essa classe é só para teste, por isso estou usando os parametros fixos…

Mas o que esta acontecendo é o seguinte: o e-mail esta sendo enviado, no entanto esta dando um exception e eu não sei porque, segue todas as mensagens de saida que recebo na execução:


init:
deps-jar:
compile-single:
run-single:
DEBUG: JavaMail version 1.4ea
DEBUG: java.io.FileNotFoundException: D:\Arquivos de programas\Java\jdk1.5.0_12\jre\lib\javamail.providers (O sistema não pode encontrar o arquivo especificado)
DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.providers
DEBUG: successfully loaded resource: /META-INF/javamail.default.providers
DEBUG: Tables of loaded providers
DEBUG: Providers Listed By Class Name: {com.sun.mail.smtp.SMTPSSLTransport=javax.mail.Provider[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun 
Microsystems, Inc], com.sun.mail.smtp.SMTPTransport=javax.mail.Provider[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, 
Inc], com.sun.mail.imap.IMAPSSLStore=javax.mail.Provider
[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], 
com.sun.mail.pop3.POP3SSLStore=javax.mail.Provider
[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], 
com.sun.mail.imap.IMAPStore=javax.mail.Provider
[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], 
com.sun.mail.pop3.POP3Store=javax.mail.Provider
[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc]}

DEBUG: Providers Listed By Protocol: {imaps=javax.mail.Provider
[STORE,imaps,com.sun.mail.imap.IMAPSSLStore,Sun Microsystems, Inc], 
imap=javax.mail.Provider
[STORE,imap,com.sun.mail.imap.IMAPStore,Sun Microsystems, Inc], 
smtps=javax.mail.Provider
[TRANSPORT,smtps,com.sun.mail.smtp.SMTPSSLTransport,Sun 
Microsystems, Inc], pop3=javax.mail.Provider
[STORE,pop3,com.sun.mail.pop3.POP3Store,Sun Microsystems, Inc], 
pop3s=javax.mail.Provider
[STORE,pop3s,com.sun.mail.pop3.POP3SSLStore,Sun Microsystems, Inc], 
smtp=javax.mail.Provider
[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, 
Inc]}
DEBUG: successfully loaded resource: /META-
INF/javamail.default.address.map

DEBUG: !anyLoaded
DEBUG: not loading resource: /META-INF/javamail.address.map
DEBUG: java.io.FileNotFoundException: D:\Arquivos de 
programas\Java\jdk1.5.0_12\jre\lib\javamail.address.map (O sistema 
não pode encontrar o arquivo especificado)
DEBUG: setDebug: JavaMail version 1.4ea

DEBUG: getProvider() returning javax.mail.Provider
[TRANSPORT,smtp,com.sun.mail.smtp.SMTPTransport,Sun Microsystems, 
Inc]

DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: useEhlo true, useAuth true
DEBUG SMTP: trying to connect to host "smtp.gmail.com", port 465, isSSL false
220 mx.google.com ESMTP q15sm4318253qbq
DEBUG SMTP: connected to host "smtp.gmail.com", port: 465

EHLO wsabril042867
250-mx.google.com at your service, [200.205.95.10]
250-SIZE 28311552
250-8BITMIME
250-AUTH LOGIN PLAIN
250 ENHANCEDSTATUSCODES
DEBUG SMTP: Found extension "SIZE", arg "28311552"
DEBUG SMTP: Found extension "8BITMIME", arg ""
DEBUG SMTP: Found extension "AUTH", arg "LOGIN PLAIN"
DEBUG SMTP: Found extension "ENHANCEDSTATUSCODES", arg ""
DEBUG SMTP: Attempt to authenticate
AUTH LOGIN
334 VXNlcm5hbWU6
am9zZWVkbWlsc29u
334 UGFzc3dvcmQ6
YXBtMjk3
235 2.7.0 Accepted
DEBUG SMTP: use8bit false
MAIL FROM:<joseedmilson@gmail.com>
250 2.1.0 OK
RCPT TO:<joseedmilson@gmail.com>
250 2.1.5 OK
DEBUG SMTP: Verified Addresses
DEBUG SMTP:   joseedmilson@gmail.com
DATA
354 Go ahead
From: joseedmilson@gmail.com
To: joseedmilson@gmail.com
Message-ID: <25516789.01187191884922.JavaMail.r100320@wsabril042867>
Subject: Testando o Gemail!
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: 7bit

Teste
.
250 2.0.0 OK 1187192078 q15sm4318253qbq
QUIT
DEBUG SMTP: exception reading response: javax.net.ssl.SSLException: 
Unsupported record version Unknown-50.49
ERRO =Exception reading response
EXECUTADO COM SUCESSO (tempo total: 13 segundos)

Conforme disse, o e-mail é enviado com sucesso, mas não aparece na tela a mensagem “Email enviado”, que deveria ser gerada pela linha:
[code
JOptionPane.showMessageDialog(null,“Email enviado”);
[/code]

Se alguém puder me ajudar ficarei muito agradecido.

Abraços a todos !

Vi num tópico de um grupo do google, um pouco abaixo de um arranca-rabo, um caso semelhante, que foi resolvido simplesmente mudando

props.put("mail.smtp.auth", "true");

para

props.put("mail.smtp.auth", "false");

Não entendi o porquê… se você testar e der certo, avisa prá gente. O tópico é o seguinte:
Tópico google

Bom dia colegas !

hadilson

Também não entendi o porque da sugestão de alterar o auth para false.
Testei e o que aconteceu foi que não consigo mandar o e-mail, antes dava a exception mas o e-mail era enviado.

Mas através daquele cheguei a esse outro: http://forum.java.sun.com/thread.jspa?threadID=5196042&tstart=0

e nele achei a seguinte sugestão:
colocar props.put(“mail.smtp.quitwait”, “false”);

pelo que entendi, o default é true, e com isso o sistema fica aguardando um retorno que nunca vem… dai o Excpetion.

setando para false ele deixa de esperar por esse retorno.

Testei aqui e passou a funcionar legal… sem Exception.
Então o código final ficou assim:

/*
 * SendMail.java
 *
 * Created on 14 de Agosto de 2007, 10:04
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package com.atm.util;

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; 
import javax.swing.JOptionPane;

/**
 *
 * @author r100320
 */
public class SendMail {

    private static final String SMTP_HOST_NAME = "smtp.gmail.com";     
    private static final String SMTP_PORT = "465";     
    private static final String emailMsgTxt = "Teste de envio de e-mail via aplicação Java Swing";     
    private static final String emailSubjectTxt = "Testando o email!";     
    private static final String emailFromAddress = "eMailOrigem@gmail.com";     
    private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
    private static final String[] sendTo = { "eMailDestino1@gmail.com", "eMailDestino2ttttt.com.br", "eMailDestino3@zzzz.com" }; 
    
    public void SendMessage(){
        JOptionPane.showMessageDialog(null,"Iniciando envio de email");
        Properties props = new Properties();         
        props.put ("mail.smtp.host", SMTP_HOST_NAME); 
        props.put("mail.smtp.auth", "true"); 
        props.put("mail.smtp.quitwait", "false");
        props.put("mail.debug", "true");         
        props.put("mail.smtp.port", SMTP_PORT);         
        props.put("mail.smtp.socketFactory.port", SMTP_PORT); 
        props.put("mail.smtp.socketFactory.class", SSL_FACTORY); 
        props.put ("mail.smtp.starttls.enable", "true"); 
        props.put("mail.smtp.socketFactory.fallback", "false"); 
              
        Session session = Session.getDefaultInstance(props, new javax.mail.Authenticator() {             
            protected PasswordAuthentication getPasswordAuthentication() { 
                return new PasswordAuthentication("seuUsuario", "suaSenha"); 
            } 
        }); 
        
        
        session.setDebug(true); 
        Message msg = new MimeMessage(session); 

        try { 
            msg.setFrom(new InternetAddress(emailFromAddress)); 
            
            InternetAddress[] addressTo = new InternetAddress[sendTo.length]; 
            for (int i = 0; i < sendTo.length; i++) { 
                addressTo[i] = new InternetAddress(sendTo[i]); 
            }             
            
            
            msg.setRecipients(Message.RecipientType.TO, addressTo);
            
            msg.setSubject(emailSubjectTxt); 
            msg.setContent(emailMsgTxt, "text/plain"); 
            Transport.send(msg); 
            JOptionPane.showMessageDialog(null,"Email enviado");
            
        } catch (MessagingException e) { 
            JOptionPane.showMessageDialog(null,"Erro:" + e.getMessage());
            System.out.println("ERRO =" + e.getMessage()); 
            
        }                 
    }
    
    public static void main(String[] args) { 
        SendMail sd = new SendMail();
        sd.SendMessage();
    } 
}

Será que podemos considerar como resolvido ?
Quem e como se coloca [Resolvido] no título ?

Abraços e muito obrigado a todos que mais uma vez colaboraram !

Curso de Java é bom… ser usuário do GUJ não tem preço !

:lol: