Enviar e-mail de alerta estilo Fórum GUJ

8 respostas
jMarcel

Pessoal,

quero adicionar um novo recurso na minha webApp (java/postgres) a o seguinte:

aqui mesmo no fórum, por exemplo, quando alguém responde/comenta nosso post, recebemos um e-mail alertando sobre tal resposta/comentário.

Alguém já implementou isso ? Qual API devo pesquisar ?

Obrigado.

8 Respostas

Bruno_Cunha

Olá.

Dê uma olhada nesse artigo: http://www.guj.com.br/articles/21

marcelo.borba

Fala jMarcel, blz?

Cara quando precisei de algo parecido fiz da seguinte forma:
Criei uma classe EmailController que contem apenas um metodopara envio de e-mails e sempre que precisava chamava esse metodo para enviar o e-mail.

Classe EmailController.java
package sistema.controller;

import java.util.Date;
import java.util.Properties;

import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

public class EmailController {

	public void enviarEmail(String de, String para, String assunto,
			String corpoEmail) {
		// importante: Setando o host smtp
		Properties p = new Properties();
		p.put("mail.transport.protocol", "smtp");
		p.put("mail.smtp.host", "servidorsaida");
		p.put("mail.smtp.auth", "true");

		Authenticator auth = new Authenticator() {

			public PasswordAuthentication getPasswordAuthentication() {
				return new PasswordAuthentication("email",
						"senha");
			}
		};

		Session session = Session.getInstance(p, auth);
		MimeMessage msg = new MimeMessage(session);
		try {
			// "de" e "para"!!
			msg.setFrom(new InternetAddress(de));
			msg.setRecipient(Message.RecipientType.TO,
					new InternetAddress(para));

			// nao esqueca da data!
			// ou ira 31/12/1969 !!!
			msg.setSentDate(new Date());

			msg.setSubject(assunto);
			msg.setContent(corpoEmail, "text/html");
			//msg.setText(corpoEmail);

			// evniando mensagem (tentando)
			Transport.send(msg);
		} catch (AddressException e) {
			// nunca deixe catches vazios!
		} catch (MessagingException e) {
			// nunca deixe catches vazios!
		}
	}
}
Nos momentos que precisei chamava da seguinte forma:
// Monta a string html do corpo do e-mail
String msg = "<html><h1>Recuperação de Senha</h1><br><p>Sua nova senha é: <strong>"
      + String.valueOf(i)
      + "</strong></p><br><p>Para maior segurança altere sua senha com frequência.</p></html>";

// envia o e-mail informando a nova senha
EmailController email = new EmailController();
email.enviarEmail("emailRemetente", "EmailDestinatario",
      "Recuperação de Senha", msg);
samirrolemberg

eu utilizo a commons email (que tem dependencia da segunda)

http://commons.apache.org/email/

com a API Java Mail

http://www.oracle.com/technetwork/java/javamail/index.html

para enviar um e-mail com um html formatado com o tutorial da propria pagina ele descreve isso:

HtmlEmail email = new HtmlEmail();
  email.setHostName("mail.myserver.com");
  email.addTo("[email removido]", "John Doe");
  email.setFrom("[email removido]", "Me");
  email.setSubject("Test email with inline image");
  
  // embed the image and get the content id
  URL url = new URL("http://www.apache.org/images/asf_logo_wide.gif");
  String cid = email.embed(url, "Apache logo");
  
  // set the html message
  email.setHtmlMsg("<html>The apache logo - <img src=\"cid:"+cid+"\"></html>");

  // set the alternative message
  email.setTextMsg("Your email client does not support HTML messages");

  // send the email
  email.send();

e mais nada.

romarcio

Você vai precisar cirar um tipo de gatilho, um procedimento para quando a nova mensagem for salva esse procedimento chame o método que envia a mensagem de email. Esse método deve enviar para todos os usuários que comentaram, menos o que fez o comentário atual.
Isso não é complicado, desde de que você tenha uma maneira fácil de saber quem comentou ou está inscrito nessa discussão.
Um exemplo de código para enviar email em HTML, com JavaMail: http://wp.me/p1iE6J-2x

elanod

Boa tarde Marcel.
eu tenho um exemplo de enviar email em um fale conosco com jsf.
apanhei muito pra fazer ele.
Se te interessar posso disponibilizar os fontes aqui mais
precisaria do teu email pra enviar 2 jars necessários.
ai vc pode precisaria adpatar pra tua necessitade, e criar o gatilho que o romarcio falo.
té+

jMarcel

elanod:
Boa tarde Marcel.
eu tenho um exemplo de enviar email em um fale conosco com jsf.
apanhei muito pra fazer ele.
Se te interessar posso disponibilizar os fontes aqui mais
precisaria do teu email pra enviar 2 jars necessários.
ai vc pode precisaria adpatar pra tua necessitade, e criar o gatilho que o romarcio falo.
té+

Tenho interesse sim.
Meu e-mail é: [email removido]
Obrigado !

jMarcel

Pessoal,

agradeço a todos que colaboraram !

elanod

para enviar email voce precisa:

  • das 3 classe listadas abaixo

  • configura Bean indexControle no faces Config

  • inserir no diretorio lib da aplicacao os 2 jar q vou enviar pro teu email. mail_1.4.1.jar e
    activation_1.1.jar

  • criar uma pagina como a abaixo para incluir dados da mensagem e rodar a aplicao
    alimentar os campos e enviar mensagem

obs que na classe emailUtils voce vai ter q colocar os dados de seu email para poder enviar.

para saber: fiz com eclipse+jsf1.2+richfaces servidor tomcat 6.0 mais.
mais nao precisa do rich faces para fazer é so pegar a logica ta tudo ai.
depois voce vair ter q adaptar a tua necessidade
qualquer duvida pergunta de enviar email


codigo da pagina.
observe as linhas onde tem indexControle que voce vai pegar a logica apartir dela.


<ui:composition xmlns=“http://www.w3.org/1999/xhtml
xmlns:ui=“http://java.sun.com/jsf/facelets
xmlns:h=“http://java.sun.com/jsf/html
xmlns:f=“http://java.sun.com/jsf/core
xmlns:a4j=“http://richfaces.org/a4j
xmlns:rich=“http://richfaces.org/rich
template=“template/template.xhtml”>

&lt;ui:define name="pag"&gt;			

&lt;div id="pagina"&gt;
&lt;div class="contentleft"&gt;
	&lt;h2&gt;Fale Conosco&lt;/h2&gt;
	<br/>
	&lt;div class="contentleftbox"&gt;
	
		&lt;rich:panel id="outputPanelMail" style="width: 500px"&gt;   
			&lt;f:facet name="header"&gt;Enviar Mensagem para WSOMUS&lt;/f:facet&gt;
			&lt;h:form&gt;
				&lt;!-- inserir campos Nome* Email* Telefone para enviar mensagem--&gt;   		   
				&lt;h:messages/&gt;   
				&lt;h:panelGrid columns="2"&gt;   
					&lt;h:outputText value="Para: "/&gt;   
					&lt;h:inputText value="#{indexControle.mensagem.destino}" size="66"/&gt;   
					&lt;h:outputText value="T&#237;tulo: "/&gt;   
					&lt;h:inputText value="#{indexControle.mensagem.titulo}" size="66"/&gt;   
					&lt;h:outputText value="Mensagem: "/&gt;   
					&lt;h:inputTextarea value="#{indexControle.mensagem.mensagem}"  cols="63" style="width:352px" rows="10" /&gt;   
				&lt;/h:panelGrid&gt;   					  					
	
	            &lt;h:commandButton 
	            	value="Enviar e-mail"             	 
	            	type="submit" 
	            	action="#{indexControle.enviaEmail}" id="enviar"  /&gt;
	            &lt;h:commandButton 
	            	value="Limpar campos"
	            	type="submit"  
	            	action="#{indexControle.limpaCampos}" /&gt;			   			
			&lt;/h:form&gt;   
		&lt;/rich:panel&gt;           
																																																		
	&lt;/div&gt; 
&lt;/div&gt;
&lt;/div&gt;
				  
&lt;/ui:define&gt;

</ui:composition>


faces-config


<!-- Gerencia o Contato -->

<managed-bean>

<managed-bean-name>indexControle</managed-bean-name>

<managed-bean-class>br.com.wsomus.controle.IndexControle</managed-bean-class>

<managed-bean-scope>request</managed-bean-scope>

</managed-bean>

Classe IndexControle para enviar email


/*

  • Para verificar erros no envio da mensagem dizemos
    que o método poderá lançar uma exceção EmailException
    e que o método que utilizá-lo deverá trata-lo, no nosso caso trataremos no controller.
    Veja na classe IndexController.java

    Através do método enviaEmail() nós chamamos o método
    enviaEmail(Mensagem mensagem) da classe EmailUtils.java e tratamos a Exceção lançada

  • */
    package br.com.wsomus.controle;

import java.util.logging.Level;
import java.util.logging.Logger;

import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;

import org.apache.commons.mail.EmailException;

import br.com.wsomus.model.Mensagem;

import br.com.wsomus.util.EmailUtils;

public class IndexControle {

private Mensagem mensagem = new Mensagem();   

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

public void enviaEmail() {   
try {   

} catch (EmailException ex) {   
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Erro! Occoreu um erro ao enviar a mensagem.", "Erro"));   
Logger.getLogger(IndexControle.class.getName()).log(Level.SEVERE, null, ex);   
}   
}   

public void limpaCampos() {   
mensagem = new Mensagem();   
}

}


classe Mensagem usada na classe indexControle


package br.com.wsomus.model;

//para enviar email título, a mensagem e o e-mail do destinatário

public class Mensagem {
private String destino;
private String titulo;
private String mensagem;

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

}


classe email EmailUtils usada na classe indexControle


//import br.edu.ifrr.cob.email.bean.EmailBean;
/*

  • Como vocês observam, acima coloquei quatro constantes,
  • uma para usuario, outra senha, outra endereço do servidor smtp,
  • outra onde você indicará o seu e-mail.
    Criamos também dois métodos estáticos, para
    acessarmos sem precisar instanciar a classe.
    O método conectaEmail() conecta-se ao servidor
    de e-mail e retorna um objeto do tipo Email.
    No método enviaEmail() preenchemos o objeto Email
    com os dados do objeto Mensagem, que são passados como parâmetro,
    e depois chamamos o método email.send() para enviar o e-mail.
  • */
    package br.com.wsomus.util;

import br.com.wsomus.model.Mensagem;

import javax.faces.context.FacesContext;
import javax.faces.application.FacesMessage;

import org.apache.commons.mail.DefaultAuthenticator;

import org.apache.commons.mail.Email;

import org.apache.commons.mail.EmailException;

import org.apache.commons.mail.SimpleEmail;

public class EmailUtils {

//neste caso usei  a conta do meu gmail para enviar
private static final String HOSTNAME = "smtp.gmail.com";  
//nome do usuario do meu email do gmail
private static final String USERNAME = "elanodahora";

//minha senha q nao e essa por isso voce tem q definir a da sua conta
private static final String PASSWORD = "senha";   

//email de origem q no caso é o meu email
private static final String EMAILORIGEM = "[email removido]";   


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 para: " + mensagem.getDestino(), "Informação"));   
}

}

Criado 15 de fevereiro de 2012
Ultima resposta 15 de fev. de 2012
Respostas 8
Participantes 6