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

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:

[code]<?xml version='1.0' encoding='UTF-8' ?>

Enviando Email
            <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>
[/code]

classe Mensagem.java:

[code]import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;

@ManagedBean(name=“MensagemBean”)
@RequestScoped

public class Mensagem {
private static final String destino = "kbyte.tcc@gmail.com"; //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;
}

}[/code]

Classe EmailUtils.java:

[code]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 = "kbyte.tcc@gmail.com"; //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();

}*/

}
[/code]

Classe IndexController.java:

[code]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();
}

}[/code]

Posta o log do erro

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); } }

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"));

O erro continua

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.

[quote=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.[/quote]

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

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.

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

[quote]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[/quote]

[code]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();
}

}[/code]

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

[quote]javax.faces.el.MethodNotFoundException: javax.el.MethodNotFoundException: /email.xhtml @33,90 action="#{CarteiroBean.enviarMensagem}": Method not found: Email.Carteiro@af5778.enviarMensagem()
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.Carteiro@af5778.enviarMensagem()
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:109)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
… 27 more[/quote]

Os códigos:
página index:

[code]<?xml version='1.0' encoding='UTF-8' ?>

Facelet Title [/code] Página para enviar email email.xhtml: [code]<?xml version='1.0' encoding='UTF-8' ?> Facelet Title
            <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>
[/code]

Mensagem.java:

[code]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@email.com";
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;
}

}[/code]

Classe que envia o email Carteiro.java[code]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();

}

}[/code]

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

[code] 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();  

}[/code]

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.

[quote=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

[code] 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();  

}[/code]

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.
[/quote]

Fiz a alteração e aparece:

[quote]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[/quote]

[code]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();

}[/code]

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