Erro para enviar/receber e-mail em página jsf

12 respostas
K

Tenho um trabalho da escola que tenho que pesquisar sobre como enviar email em .jsf e criar um projeto...
Quando executo e preencho o formulário aparece a mensagem de erro da classe IndexController.java "Erro! Ocorreu um erro ao enviar a mensagem." e estou perdida sem saber como resolver.

Segue os códigos para análise:

index:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Enviando Email</title>
    </h:head>
    <h:body>
         <h:form>
            <h:panelGrid columns="3">
                               
                <h:outputLabel value="De: "/>
                <h:inputText id="de" value="#{MensagemBean.de}" required="true" requiredMessage="Seu email é obrigatório!"/>
                <h:message for="de"/> 
                
                <h:outputLabel value="Título: "/>
                <h:selectOneMenu id="titulo" value="#{MensagemBean.titulo}" rendered="true" requiredMessage="Selecione o Assunto!">
                    <f:selectItem itemValue="0" itemLabel="Selecione:"/>
                    <f:selectItem itemValue="1" itemLabel="Dúvidas"/>
                    <f:selectItem itemValue="2" itemLabel="Sugestões"/>
                    <f:selectItem itemValue="3" itemLabel="Reclamações"/>
                    <f:selectItem itemValue="4" itemLabel="Outro"/>
                </h:selectOneMenu> 
                <h:message for="titulo"/>
                
                <h:outputLabel value="Mensagem:"/>
                <h:inputTextarea id="mensagem" value="#{MensagemBean.mensagem}" rows="6" cols="50"/> <br/>
                <h:message for="mensagem"/>
                
                <h:commandButton value="Enviar"  action="#{EmailBean.enviaEmail()}"/>
            </h:panelGrid>
            
        </h:form>
    </h:body>
</html>
classe Mensagem.java:
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name="MensagemBean")
@RequestScoped

public class Mensagem {
 private static final String destino = "[email removido]"; //o destino tem o meu email para que eu receba
 //private String destino;
 private String titulo;
 private String mensagem;
 private String de; //a pessoa coloco o seu email que será enviado para mim
  
 public String getDestino() {
 return destino;
 }
 
 /*public void setDestino(String destino) {
 this.destino = destino;
 }*/
 
 public String getMensagem() {
 return mensagem;
 }
 
 public void setMensagem(String mensagem) {
 this.mensagem = mensagem;
 }
 
 public String getTitulo() {
 return titulo;
 }
 
 public void setTitulo(String titulo) {
 this.titulo = titulo;
 }

 public String getDe() {
 return de;
 }

 public void setDe(String de) {
 this.de = de;
 }
  
}
Classe EmailUtils.java:
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.apache.commons.mail.DefaultAuthenticator;
import org.apache.commons.mail.Email;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name="EmailUtilsBean")
@RequestScoped


public class EmailUtils {
 
 private static final String HOSTNAME = "smtp.gmail.com";
 private static final String USERNAME = "kbyte.tcc"; //nome do usuário
 private static final String PASSWORD = "**********"; //senha do email (tirei a senha para não ser hackeada rs)
 private static final String EMAILORIGEM = "[email removido]"; //email do gmail
 
 /*private SimpleEmail email;
 public EmailUtils() {
	this.email = new SimpleEmail();
 }*/
 
 public static Email conectaEmail() throws EmailException {
 Email email = new SimpleEmail();
 email.setHostName(HOSTNAME);
 email.setSmtpPort(587);
 email.setAuthenticator(new DefaultAuthenticator(USERNAME, PASSWORD));
 email.setTLS(true);
 email.setFrom(EMAILORIGEM);
 return email;
 }
 
 public static void enviaEmail(Mensagem mensagem) throws EmailException {
 Email email = new SimpleEmail();
 email = conectaEmail();
 email.setSubject(mensagem.getTitulo());
 email.setMsg(mensagem.getMensagem());
 email.addTo(mensagem.getDestino());
 String resposta = email.send();
 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "E-mail enviado com sucesso de: " + mensagem.getDe(), "Informação"));
 }
 
  /*public void enviaEmail(Mensagem mensagem) throws EmailException {
 
		email.setHostName(HOSTNAME);
		email.setAuthentication(USERNAME, PASSWORD);
		email.setSSL(true);
 
		email.setFrom(EMAILORIGEM);
		email.addTo(mensagem.getDestino());
		email.setSubject(mensagem.getTitulo());
		email.setMsg(mensagem.getMensagem());
 
		email.send();
  }*/
 
}
Classe IndexController.java:
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import org.apache.commons.mail.EmailException;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.swing.JOptionPane;

@ManagedBean(name="EmailBean")
@RequestScoped

public class IndexController {
 
 private Mensagem mensagem = new Mensagem();
 
 public Mensagem getMensagem() {
 return mensagem;
 }
 public void setMensagem(Mensagem mensagem) {
 this.mensagem = mensagem;
 }
 
 public void enviaEmail() {
 try {
 EmailUtils.enviaEmail(mensagem);
 } catch (EmailException ex) {
 FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro! Ocorreu um erro ao enviar a mensagem.", "Erro"));
 Logger.getLogger(IndexController.class.getName()).log(Level.SEVERE, null, ex);
 }
 }
 
 public void limpaCampos() {
 mensagem = new Mensagem();
 }
 
}

12 Respostas

L

Posta o log do erro

K

Não aparece o log do erro.

Aparece a embaixo do botão de enviar “Erro! Ocorreu um erro ao enviar a mensagem.” que foi gerado nesse trecho do código da classe IndexController.java

public void enviaEmail() { try { EmailUtils.enviaEmail(mensagem); } catch (EmailException ex) { FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro! Ocorreu um erro ao enviar a mensagem.", "Erro")); Logger.getLogger(IndexController.class.getName()).log(Level.SEVERE, null, ex); } }

L

Coloca isso [ex.printStackTrace();] e testa novamente

} catch (EmailException ex) { ex.printStackTrace(); FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro! Ocorreu um erro ao enviar a mensagem.", "Erro"));

K

O erro continua

L

Veja, preciso que envie o log desse erro. Leia este post --> http://www.guj.com.br/java/58349-o-que-significa-eprintstacktrace-

Só adiantando acho que a porta do gmail é a 465.

Espero ter ajudado.

K

Leandro M.:
Veja, preciso que envie o log desse erro. Leia este post --> http://www.guj.com.br/java/58349-o-que-significa-eprintstacktrace-

Só adiantando acho que a porta do gmail é a 465.

Espero ter ajudado.

No NetBeans dá warning no printStackTrace();

}catch (EmailException ex) { ex.printStackTrace(System.out); //coloquei o System.out e parou de dar warning FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro! Ocorreu um erro ao enviar a mensagem.", "Erro")); Logger.getLogger(IndexController.class.getName()).log(Level.SEVERE, null, ex); }
Executei e não apareceu nenhum log de erro na Saída. Mudei a porta como você falou e não mudou nada
Abri um monte de janelinha no netbeans para ver se aparecia e nada. Tá muito estranho isso, devia aparecer

L

Não precisa do System.out como parâmetro de entrada. Teste de novo sem o System… e envie o erro.

O que você precisa fazer é tratar corretamente as Exceptions para saber o que está acontecendo.

L

Por exemplo, fiz um teste com suas classes e recebi este erro. Teste com a porta 465 para ver se funciona.

org.apache.commons.mail.EmailException: Sending the email to the following server failed : smtp.gmail.com:587
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1242)
at org.apache.commons.mail.Email.send(Email.java:1267)
at br.com.escola.backbean.teste.EmailUtils.enviaEmail(EmailUtils.java:43)
at br.com.escola.backbean.teste.IndexController.enviaEmail(IndexController.java:33)
at br.com.escola.backbean.teste.IndexController.main(IndexController.java:41)
Caused by: javax.mail.AuthenticationFailedException: failed to connect
at javax.mail.Service.connect(Service.java:322)
at javax.mail.Service.connect(Service.java:172)
at javax.mail.Service.connect(Service.java:121)
at javax.mail.Transport.send0(Transport.java:190)
at javax.mail.Transport.send(Transport.java:120)
at org.apache.commons.mail.Email.sendMimeMessage(Email.java:1232)
... 4 more

public class IndexController {

    private Mensagem mensagem = new Mensagem();

    public IndexController(){
        mensagem.setDe("EU");
        mensagem.setMensagem("TESTE");
        mensagem.setTitulo("ABC");
    }
    
    public Mensagem getMensagem() {
        return mensagem;
    }

    public void setMensagem(Mensagem mensagem) {
        this.mensagem = mensagem;
    }

    public void enviaEmail() {
        try {
            EmailUtils.enviaEmail(mensagem);
        } catch (EmailException ex) {
            ex.printStackTrace();
            System.out.println("Erro! Ocorreu um erro ao enviar a mensagem.");
        }
    }
    
    public static void main (String [] args){
        new IndexController().enviaEmail();
    }
}
K

Fiz tudo de novo, não estava aparecendo o log de erro da forma que estava.
O novo jeito que fiz funciona no aplicativo desktop, já pra web dá o seguinte erro

javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: /email.xhtml @33,90 action="#{CarteiroBean.enviarMensagem}": Method not found: [email removido]()
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:92)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:101)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: javax.el.MethodNotFoundException: /email.xhtml @33,90 action="#{CarteiroBean.enviarMensagem}": Method not found: [email removido]()
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:109)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 27 more

Os códigos: página index:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form> 
            <h:commandLink value="Enviar Email" action="#{CarteiroBean.novo()}"/>
        </h:form>
    </h:body>
</html>
Página para enviar email email.xhtml:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core">
    <h:head>
        <title>Facelet Title</title>
    </h:head>
    <h:body>
        <h:form>
            <h:panelGrid columns="3">
                <h:outputLabel value="Nome: "/>
                <h:inputText id="nome" value="#{MensagemBean.nome}" required="true" requiredMessage="Digite seu nome!"/>
                <h:message for="nome"/>
                
                <h:outputLabel value="E-mail: "/>
                <h:inputText id="emailFulano" value="#{MensagemBean.emailFulano}" required="true" requiredMessage="Digite seu e-mail!"/>
                <h:message for="emailFulano"/>
                
                <h:outputLabel value="Assunto:"/>
                <h:selectOneMenu id="assunto" value="#{MensagemBean.assunto}" required="true" requiredMessage="Selecione seu cargo!">
                    <f:selectItem itemValue="0" itemLabel="Selecione"/>
                    <f:selectItem itemValue="1" itemLabel="Reclamações"/>
                    <f:selectItem itemValue="2" itemLabel="Dúvidas"/>
                    <f:selectItem itemValue="3" itemLabel="Críticas"/>
                    <f:selectItem itemValue="4" itemLabel="Outro"/>
                </h:selectOneMenu>
                <h:message for="assunto"/>
                
                <h:outputLabel value="Mensagem:"/>
                <h:inputTextarea id="mensagem" value="#{MensagemBean.mensagem}" cols="6" rows="50"/>
                
                <h:commandButton value="Enviar" action="#{CarteiroBean.enviarMensagem}"/>
                
            </h:panelGrid>
        </h:form>
    </h:body>
</html>
Mensagem.java:
package Email;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean (name="MensagemBean")
@RequestScoped

public class Mensagem {
	private static final String destinatario="[email removido]";
	private String assunto;
	private String mensagem;
        private String nome;
        private String emailFulano;
 
	public Mensagem() {
		super();
	}

    public String getEmailFulano() {
        return emailFulano;
    }

    public void setEmailFulano(String emailFulano) {
        this.emailFulano = emailFulano;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }
 
	public Mensagem(String destinatario, String assunto, String mensagem) {
		super();
		//this.destinatario = destinatario;
		this.assunto = assunto;
		this.mensagem = mensagem;
	}
 
	public String getDestinatario() {
		return destinatario;
	}
 
	/*public void setDestinatario(String destinatario) {
		this.destinatario = destinatario;
	}*/
 
	public String getAssunto() {
		return assunto;
	}
 
	public void setAssunto(String assunto) {
		this.assunto = assunto;
	}
 
	public String getMensagem() {
		return mensagem;
	}
 
	public void setMensagem(String mensagem) {
		mensagem = "De: " + nome + "\nEmail: " + emailFulano + "\nMensagem: " + mensagem;
		this.mensagem = mensagem;
	}
 
}
Classe que envia o email Carteiro.java
package Email;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import org.apache.commons.mail.EmailException;
import org.apache.commons.mail.SimpleEmail;
 
@ManagedBean (name="CarteiroBean")
@RequestScoped

public class Carteiro {
 
	private String hostName = "smtp.gmail.com";
	private String usuario = "eu"; // Seu login do Gmail
	private String senha = "minhasenha"; // Sua senha do Gmail
	private String email = "meuemail"; // Seu e-mail do Gmail
 
	private SimpleEmail simpleEmail;
 
	public Carteiro() {
		this.simpleEmail = new SimpleEmail();
	}
 public String novo(){
        return "email";
    }
	public void enviarMensagem(Mensagem mensagem) throws EmailException {
 
		simpleEmail.setHostName(hostName);
		simpleEmail.setAuthentication(usuario, senha);
		simpleEmail.setSSL(true);
 
		simpleEmail.setFrom(mensagem.getDestinatario());
		simpleEmail.addTo(mensagem.getDestinatario());
		simpleEmail.setSubject(mensagem.getAssunto());
		simpleEmail.setMsg(mensagem.getMensagem());
 
		simpleEmail.send();
 
	}
 
}
L

Pelo log, seu MB CarteiroBean não está encontrando o método enviarMensagem

Retire o input de seu método, crie um get/set para passar o objeto Mensagem
public void enviarMensagem() throws EmailException {  
  
        simpleEmail.setHostName(hostName);  
        simpleEmail.setAuthentication(usuario, senha);  
        simpleEmail.setSSL(true);  
  
        simpleEmail.setFrom(mensagem.getDestinatario());  
        simpleEmail.addTo(mensagem.getDestinatario());  
        simpleEmail.setSubject(mensagem.getAssunto());  
        simpleEmail.setMsg(mensagem.getMensagem());  
  
        simpleEmail.send();  
  
    }
Mensagem e Carteiro são MBs, os dois são chamados no em sua tela, porém não vi relacionamentos entre os dois nas classes.
K
Leandro M.:
Pelo log, seu MB CarteiroBean não está encontrando o método enviarMensagem Retire o input de seu método, crie um get/set para passar o objeto Mensagem
public void enviarMensagem() throws EmailException {  
  
        simpleEmail.setHostName(hostName);  
        simpleEmail.setAuthentication(usuario, senha);  
        simpleEmail.setSSL(true);  
  
        simpleEmail.setFrom(mensagem.getDestinatario());  
        simpleEmail.addTo(mensagem.getDestinatario());  
        simpleEmail.setSubject(mensagem.getAssunto());  
        simpleEmail.setMsg(mensagem.getMensagem());  
  
        simpleEmail.send();  
  
    }
Mensagem e Carteiro são MBs, os dois são chamados no em sua tela, porém não vi relacionamentos entre os dois nas classes.

Fiz a alteração e aparece:

Caused by: org.apache.commons.mail.EmailException: Invalid message supplied
at org.apache.commons.mail.SimpleEmail.setMsg(SimpleEmail.java:48)
at Email.Carteiro.enviarMensagem(Carteiro.java:55)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:278)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 27 more

public void enviarMensagem() throws EmailException {
 
		simpleEmail.setHostName(hostName);
		simpleEmail.setAuthentication(usuario, senha);
		simpleEmail.setSSL(true);
 
		simpleEmail.setFrom(mensagem.getDestinatario());
		simpleEmail.addTo(mensagem.getDestinatario());
		simpleEmail.setSubject(mensagem.getAssunto());
		simpleEmail.setMsg(mensagem.getMensagem()); //Linha 55
 
		simpleEmail.send();
 
	}
L

Aparentemente sua mensagem está vazia nesse ponto

Verificar como o getMensagem está chegando nesse ponto.

Antes de postar o erro, tenta debugá-lo ou colocar um System.out.println(); para imprimir seus objetos. Facilita para descobrir o erro e resolver seu problema rápido. :slight_smile:

Abs

Criado 23 de maio de 2013
Ultima resposta 26 de mai. de 2013
Respostas 12
Participantes 2