Envio de email com servlet

13 respostas
S

eae,

Eu preciso colocar, no site que estou fazendo, um lugar para o usuário me mandar um email...igual alguns sites tem por ae....aquele negocio que poe o email do usuario , a menssagem dele e depois clica em enviar....preciso que essa mensagem chegue ateh o meu email

eu jah fiz minha classe para enviar o email....:

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.mail.*;
import javax.mail.internet.*;
import java.util.Properties;


public class email extends HttpServlet {

  protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException
    {

        String msg = request.getParameter("msg");
 
        enviaEmail ( "[email removido]", "[email removido]", "teste", "msg");
}

 public static void enviaEmail (String remetente, String receptor, String assunto, String mensagem )
    {
            Properties p = new Properties();
            p.put("mail.host", "smtp2.yahoo.com.br");
            Session session = Session.getInstance(p, null);
            MimeMessage msg = new MimeMessage(session);

             try
            {
                    
                    msg.setFrom(new InternetAddress(remetente));
                    msg.setRecipient(Message.RecipientType.TO, new InternetAddress(receptor));

               
                    msg.setSentDate(new Date());

                    msg.setSubject(assunto);

                    msg.setText(mensagem);
                 
                    Transport.send(msg);

                    
            }
              catch (AddressException e)
            {
                    
            }
              catch (MessagingException e)
            {
                      // erro nesse exception...
            }

    }

}

a sintaxe tah beleza...mas ele não consegue enviar o email....da erro de exessão no MessagingException....Eu li os topicos sobre enviar email, mas mesmo assim e não estou entendendo...

porfavor me ajudem ae....

flw

13 Respostas

M

Achei esse código há muito tempo atrás, para o que eu precisava funcionou bem.

package enviaemail;

import java.util.Properties;  
import javax.mail.Message;  
import javax.mail.Session;  
import javax.mail.Transport;  
import javax.mail.internet.InternetAddress;  
import javax.mail.internet.MimeMessage;   
import javax.mail.Authenticator;  
import javax.mail.PasswordAuthentication;   
   
 public class SendEmail{  
       
     private String mailSMTPServer;  
     private String mailSMTPServerPort;  
       
     /* 
      * quando instanciar um Objeto ja sera atribuido o servidor SMTP do GMAIL  
      * e a porta usada por ele 
      */  
     public SendEmail() { //Para o GMAIL   
         mailSMTPServer = "smtp.gmail.com";  
         mailSMTPServerPort = "465";  
     }  
     /* 
      * caso queira mudar o servidor e a porta, so enviar para o contrutor 
      * os valor como string 
      */  
     public SendEmail(String mailSMTPServer, String mailSMTPServerPort) { //Para outro Servidor  
         this.mailSMTPServer = mailSMTPServer;  
         this.mailSMTPServerPort = mailSMTPServerPort;  
     }  
       
     public void Mail(String from, String to, String subject, String message, String login, String senha) {  
           
         Properties props = new Properties();  
   
         props.put("mail.transport.protocol", "smtp"); //define protocolo de envio como SMTP  
         props.put("mail.smtp.starttls.enable","true");   
         props.put("mail.smtp.host", mailSMTPServer); //server SMTP do GMAIL  
         props.put("mail.smtp.auth", "true"); //ativa autenticacao  
         props.put("mail.smtp.user", from); //usuario ou seja, a conta que esta enviando o email (tem que ser do GMAIL)  
         props.put("mail.debug", "true");  
         props.put("mail.smtp.port", mailSMTPServerPort); //porta  
         props.put("mail.smtp.socketFactory.port", mailSMTPServerPort); //mesma porta para o socket  
         props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");  
         props.put("mail.smtp.socketFactory.fallback", "false");  
           
         //Cria um autenticador que sera usado a seguir  
         SimpleAuth auth = null;  
         auth = new SimpleAuth (login, senha);  
           
         //Session - objeto que ira realizar a conexão com o servidor  
         /*Como há necessidade de autenticação é criada uma autenticacao que 
          * é responsavel por solicitar e retornar o usuário e senha para  
          * autenticação */ 
         
         Session session = Session.getDefaultInstance(props, auth);  
         session.setDebug(true); //Habilita o LOG das ações executadas durante o envio do email  
   
         //Objeto que contém a mensagem  
         Message msg = new MimeMessage(session);  
   
         try {  
             //Setando o destinatário  
             msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));  
             //Setando a origem do email  
             msg.setFrom(new InternetAddress(from));  
             //Setando o assunto  
             msg.setSubject(subject);  
             //Setando o conteúdo/corpo do email  
             msg.setContent(message,"text/plain");  
   
         } catch (Exception e) {  
             System.out.println(">> Erro: Completar Mensagem");  
             e.printStackTrace();  
         }  
           
         //Objeto encarregado de enviar os dados para o email  
         Transport tr;  
         try {  
             tr = session.getTransport("smtp"); //define smtp para transporte  
             /* 
              *  1 - define o servidor smtp 
              *  2 - seu nome de usuario do gmail 
              *  3 - sua senha do gmail 
              */  
             tr.connect(mailSMTPServer, login, senha);  
             msg.saveChanges(); // don't forget this  
             //envio da mensagem  
             tr.sendMessage(msg, msg.getAllRecipients());  
             tr.close();  
         } catch (Exception e) {  
             // TODO Auto-generated catch block  
             System.out.println(">> Erro: Envio Mensagem");  
             e.printStackTrace();  
         }  
     }  
 
 public class SimpleAuth extends Authenticator {  
     public String username = null;  
     public String password = null;  
   
   
     public SimpleAuth(String user, String pwd) {  
         username = user;  
         password = pwd;  
     }  
 
     public PasswordAuthentication getPasswordAuthentication() {  
         return new PasswordAuthentication(this.username, this.password);  
     }  
    }//fim da classe SimpleAuth
}//fim da classe principal
S

ow vlw pela ajuda kra....mas ainda não consegui....pelo que eu vi o usuario precisaria passar o login e a senha para me mandar a mensagem...isso n seria legal e pratico...entao eu resolvi colocar o meu email enviando mensagem para ele mesmo...mas o meu email é do yahoo e eu não sei direito qual é a porta utilizada pelo yahoo...dei uma pesquisada e achei uma porta 587...tentei assim mas não deu certo....

// FAZENDO CHAMADA DA classe sendEmail
SendEmail email = new SendEmail();
String status = email.Mail("[email removido]", "[email removido]", "teste email", "deu certo", "[email removido]", "123");
import java.util.Properties;
 import javax.mail.Message;
 import javax.mail.Session;
 import javax.mail.Transport;
 import javax.mail.internet.InternetAddress;
 import javax.mail.internet.MimeMessage;
 import javax.mail.Authenticator;
 import javax.mail.PasswordAuthentication;

 public class SendEmail{

      private String mailSMTPServer;
      private String mailSMTPServerPort;

      /*
#       * quando instanciar um Objeto ja sera atribuido o servidor SMTP do GMAIL
#       * e a porta usada por ele
#       */
      public SendEmail() { //Para o yahoo
          mailSMTPServer = "smtp.yahoo.com.br";
          mailSMTPServerPort = "587";
      }
      /*
#       * caso queira mudar o servidor e a porta, so enviar para o contrutor
#       * os valor como string
#       */
      public SendEmail(String mailSMTPServer, String mailSMTPServerPort) { //Para outro Servidor
          this.mailSMTPServer = mailSMTPServer;
          this.mailSMTPServerPort = mailSMTPServerPort;
      }

      public String Mail(String from, String to, String subject, String message, String login, String senha) {

          Properties props = new Properties();

          props.put("mail.transport.protocol", "smtp"); //define protocolo de envio como SMTP
          props.put("mail.smtp.starttls.enable","true");
          props.put("mail.smtp.host", mailSMTPServer); //server SMTP do GMAIL
          props.put("mail.smtp.auth", "true"); //ativa autenticacao
          props.put("mail.smtp.user", from); //usuario ou seja, a conta que esta enviando o email (tem que ser do GMAIL)
          props.put("mail.debug", "true");
          props.put("mail.smtp.port", mailSMTPServerPort); //porta
          props.put("mail.smtp.socketFactory.port", mailSMTPServerPort); //mesma porta para o socket
          props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
          props.put("mail.smtp.socketFactory.fallback", "false");

          //Cria um autenticador que sera usado a seguir
          SimpleAuth auth = null;
          auth = new SimpleAuth (login, senha);

          //Session - objeto que ira realizar a conexão com o servidor
          /*Como há necessidade de autenticação é criada uma autenticacao que
#           * é responsavel por solicitar e retornar o usuário e senha para
#           * autenticação */

          Session session = Session.getDefaultInstance(props, auth);
          session.setDebug(true); //Habilita o LOG das ações executadas durante o envio do email

          //Objeto que contém a mensagem
          Message msg = new MimeMessage(session);

          try {
              //Setando o destinatário
              msg.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
              //Setando a origem do email
              msg.setFrom(new InternetAddress(from));
              //Setando o assunto
              msg.setSubject(subject);
              //Setando o conteúdo/corpo do email
              msg.setContent(message,"text/plain");

         } catch (Exception e) {
              return ("erro ao completar mensagem!");
          }

          //Objeto encarregado de enviar os dados para o email
          Transport tr;
          try {
              tr = session.getTransport("smtp"); //define smtp para transporte
              /*
#               *  1 - define o servidor smtp
#               *  2 - seu nome de usuario do gmail
#               *  3 - sua senha do gmail
#               */
              tr.connect(mailSMTPServer, login, senha);
              msg.saveChanges(); // don't forget this
              //envio da mensagem
              tr.sendMessage(msg, msg.getAllRecipients());
              tr.close();
              return("mensagem enviada com sucesso");
          } catch (Exception e) {
              
             return ("erro ao enviar");              }
      }

 public class SimpleAuth extends Authenticator {
      public String username = null;
      public String password = null;


      public SimpleAuth(String user, String pwd) {
          username = user;
          password = pwd;
      }

        @Override
      public PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication(this.username, this.password);
      }
     }//fim da classe SimpleAuth
 }//fim da classe principal

eae...alguem sabe pq n envia o email?

F

Manda mostrar o stacktrace e posta pra gente.
Se saber a mensagem de erro fica dificil de ajudar.

S
kra...utilizei o metodo e.getMessage() para imprimir o erro.... o erro foi:
Unknown SMTP host: smtp.yahoo.com.br
depois eu mudei meu smtp para: smtp.mail.yahoo.com.br e deu esse erro:
Exception reading response
utilizando o metodo .printStackTrace() deu o erro:
javax.mail.MessagingException: Exception reading response; nested exception is: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1764) at com.sun.mail.smtp.SMTPTransport.openServer(SMTPTransport.java:1523) at com.sun.mail.smtp.SMTPTransport.protocolConnect(SMTPTransport.java:453) at javax.mail.Service.connect(Service.java:291) at javax.mail.Service.connect(Service.java:172) at SendEmail.Mail(SendEmail.java:86) at email.doGet(email.java:36) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Unknown Source) Caused by: javax.net.ssl.SSLException: Unrecognized SSL message, plaintext connection? at sun.security.ssl.InputRecord.handleUnknownRecord(Unknown Source) at sun.security.ssl.InputRecord.read(Unknown Source) at sun.security.ssl.SSLSocketImpl.readRecord(Unknown Source) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source) at sun.security.ssl.SSLSocketImpl.readDataRecord(Unknown Source) at sun.security.ssl.AppInputStream.read(Unknown Source) at com.sun.mail.util.TraceInputStream.read(TraceInputStream.java:106) at java.io.BufferedInputStream.fill(Unknown Source) at java.io.BufferedInputStream.read(Unknown Source) at com.sun.mail.util.LineInputStream.readLine(LineInputStream.java:84) at com.sun.mail.smtp.SMTPTransport.readServerResponse(SMTPTransport.java:1742) ... 20 more

...eu não entendi esses erros.....se esse não foi o jeito certo de mostrar os erros foi mal ae...

quem souber o problema me da uma ajuda ae porfavor...

flw

S

alguem pode me ajudar???

A

Brother, pelo visto ta faltando vc ativar a conexão SSL que é de criptografia que esse servidor precisa pra se conectar.
Aparentemente é isso. Não testei seu código não, mas eu estava com um problema semelhante onde tive que ativar a conexão SSL.

M

A porta padrão do servidor de e-mail é 110, porém alguns servidores podem utilizar uma porta diferente desta. :wink:

S

pessoal, soh pra não deixar este tópico sem resolução…

Eu resolvi meu problema criando uma conta no GMAIL e utilizando este mesmo código hauHSAUhauHAUHauHUAHhauHUAHuaHu

soh tive um probleminha…meus emails chegam sempre como spans…alguem sabe fazer o email chegar como email normal?

M

Usando smtp e portas de conta de Gmail não tem erro

E

eu sei q o tópico ja esta finalizado a muito tempo porem estava testando o código e não consegui achar o pacote javax.mail será que é a versão do JDK que estou usando ou tem alguma lib pra baixar? valew

E

Ok resolvido só procurar a lib no google

E

achei a lib só que agora está dando o seguinte erro:

HTTP Status 500 -


type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/activation/DataSource

org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:541)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:417)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

javax.servlet.ServletException: java.lang.NoClassDefFoundError: javax/activation/DataSource

org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:850)

org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:779)

org.apache.jsp.jsp.musico.enviaEmailSimples_jsp._jspService(enviaEmailSimples_jsp.java:125)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

root cause

java.lang.NoClassDefFoundError: javax/activation/DataSource

email.SendEmail.Mail(SendEmail.java:71)

org.apache.jsp.jsp.musico.enviaEmailSimples_jsp._jspService(enviaEmailSimples_jsp.java:84)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:393)

org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)

javax.servlet.http.HttpServlet.service(HttpServlet.java:803)

org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.14 logs.


Apache Tomcat/6.0.14

I

Boa Noite,

Desculpa reabrir o tópico mas gostaria de saber onde eu posso consultar os parametros da classe java.util.Properties para utilizar com Java.mail?

Segue um exemplo abaixo.

Criado 26 de julho de 2009
Ultima resposta 12 de dez. de 2010
Respostas 13
Participantes 8