LIFERAY FORMACION, Desarrollo de portlets: API de envío de mails

05-05-2011
 

Una de las funcionalidades que mas se piden últimamente en el desarrollo de portlets es el envío de mails. Es normal, se utiliza para avisar a los usuarios de un portal de eventos ocurridos, validación de correos, etc. Cada vez se busca mas que el usuario no tenga que entrar en el portal para enterarse si pasa algo, el portal lo avisa (Normalmente por mail, aunque se puede hacer también por SMS, Tweets, etc.).

El API de Liferay hace muy fácil el envío de mails desde el portal y además funciona muy bien. Para el desarrollo de portlets tenemos la clase com.liferay.util.mail.MailEngine que nos permite enviar un mail así de fácil:

com.liferay.util.mail.MailEngine.send( from, to, subject, body );

Lo utilizo a menudo en mis desarrollos como freelance y no da los típicos problemas: Ir directo al spam, necesitar configurar algún software extra, etc. La configuración del mail(SMTP, users, etc.) se hace desde el fichero de configuración portal-ext.properties .

Felices envíos de mails 😉

Comments

15 Responses to “LIFERAY FORMACION, Desarrollo de portlets: API de envío de mails”
  1. Óscar says:

    Hola Albert,
    Estoy desarrollando un portlet en Liferay y me gustaría que cuando añado un campo a la base de datos, se envíe un correo electrónico a una persona. ¿Es esto posible? ¿Dónde puedo encontrar información sobre ello?
    Un saludo y muchas Gracias!!

  2. Hola Oscar,

    Perdona por tardar en contestar, he estado de vacaciones. Se me ocurre que quizá la forma más fácil de hacer eso sea con un trigger en la BBDD. Sinó a través de un hook o directamente con el entorno de extensión de liferay.

    Saludos,

  3. Gregory says:

    Hola Albert,
    Estoy desarrollando una intranet desde java en liferay, y necesito realizar un mantenimiento de contenidos web desde java, se que esto se puede hacer con la misma herramienta de liferay pero lo que pasa es que los usuario de esta intranet no son de sistemas y necesitan una interfez mas amigable, ya que ingresar por el dockbar al panel de control y escoger la estructura y todo eso, es muy tedioso para ellos, me podrias mostrar un ejemplo practico de como agregar, actualizar y eliminar contenidos desde java.? Ante todo muchas gracias!!

  4. Hola Gregory,

    Perdona por la tardanza en contestar, estuve de vacaciones y voy un poco estresado estos días. Para trabajar con contenidos mirate la classe: JournalArticleLocalServiceUtil http://docs.liferay.com/portal/6.0/javadocs/com/liferay/portlet/journal/service/JournalArticleLocalServiceUtil.html

    Saludos,

  5. Gregory says:

    Gracias Albert,

    Ya he podido realizar el mantimiento, pero me he encontrado con un problema, necesito obtener el ultimo journalArticle agregado, existe un metodo para traerlo? sin conocer su articleID ? espero puedas ayudarme.Gracias de antemano.

  6. Hola Gregory,

    Mil disculpas otra vez por la tardanza, no se que passa que me van muchos mensajes al SPAM, yo lo hago así:

    JournalArticle ja=JournalArticleLocalServiceUtil.getLatestArticle( asset.getClassPK() );

    Espero que te sirva.

  7. Gregory says:

    Gracias Albert,

    Ahora me he presentado con otro problema, tengo una estructura que tiene un campo de tipo “Image”, y revisando el xml del content lo que me genera es un path como esto: “/image/journal/article?img_id=37097&t=1304009841615”, liferay tiene alguna funcion que te genera este path? y donde setea los bytes del upload de la foto? no lo tengo muy claro como sube las fotos liferay podrias darme una mano? Gracias de antemano.

  8. Hola Gregory,

    Fíjate que en la URL tienes un parámetro que se llama img_id. Mírate la clase ‘IGImageLocalServiceUtil’ que es la clase de servicio para el portlet galería de imágenes y la clase ‘IGImage’.

    Saludos,

  9. Óscar says:

    Hola Albert,
    ¿Sabes cómo se podría crear una nueva entrada en el foro desde el código Java? Estoy atascado y no sé dónde encontrar esa información.
    Muchas gracias 😀

  10. Óscar says:

    Lo conseguí! Jejeje, pero ahora, no sé cómo obtener el id del Thread que he creado… 🙁

  11. Hola Óscar,

    Si utilizas la classe ‘MBThreadLocalServiceUtil’, método ‘addMBThread(MBThread mbThread)’ te devuelve un objeto del tipo ‘MBThread’ del que puedes sacar el Id con el método ‘getThreadId’.

    Saludos,

  12. Óscar says:

    Muchas Gracias Albert!!! 😀

  13. Lina Orjuela says:

    Hola Alberto,
    espero que encuentres bien, soy novata en java y liferay
    vi tu comentario sobre envió de correo con MailEngine
    Estoy haciendo lo mismo en liferay y configurando el archivo ROOT.xml
    eN JAVA hago lo siguiente:
    String from = “[email protected]”;
    String to = “[email protected], [email protected]“;
    String subject=”prueba”;
    String body=”prueba333″;
    com.liferay.util.mail.MailEngine.send( from, to, subject, body );
    Tengo un error con el paquete q declaro
    package mapfre.portlet.services; cuando escribo la linea de código com.liferay.util.mail.MailEngine.send( from, to, subject, body ); si pongo el cursor en el paquete me sale lo siguiente:

    Multiples Markets at this line
    -the declare “”does not match the expected package”mapfre.portles.services”.
    -the type org.apache.commons.lang.exception.NestableException cannot be resolved. It is indirectlt referenced from requerid .class files
    No se porque no me deja usar MailEngine.

    Gracias por tu colobaración

  14. Hola Lina,

    Casi que os recomendaría el curso de J2EE. Asegurate que existe el package “mapfre.portles.services” y que tienes en el proyecto las librerías necesarias para acceder a “org.apache.commons.lang.exception.NestableException”.

    Recuerda que el package que declaras debe estar en la misma estructura de carpetas que defines y que necesitas tener el JAR ‘commons-lang.jar’ para solventar el segundo error.

    Saludos,

  15. Lina says:

    Hola Alberto, gracias por tu información y por responder rapido, el package existe es en el tengo la clase que hago el envio de corrreo, y las librerias ya estan, ahora el problema es otro tengo

    te voy a pegar el codigo

    tengo un archivo service.jsp que es donde llamo a save q se encuentra en el java, pero en el java en save no se como llamar sendMail para que se ejecute.

    JSP
    ———————————————————————————————————————-

    ————————————————————————————————————————

    SaveRegister.java
    ——————————————————————————————————————
    package mapfre.portlet.services;

    import java.io.IOException;
    import java.io.PrintStream;
    import java.rmi.RemoteException;
    import java.util.List;

    import sun.net.smtp.SmtpClient;

    import com.liferay.portal.kernel.exception.SystemException;
    import com.liferay.portal.model.Country;
    import com.liferay.portal.service.CountryServiceUtil;
    import com.liferay.util.mail.MailEngine;

    import mapfre.model.impl.ContactenosImpl;
    import mapfre.service.ContactenosLocalServiceUtil;
    import java.util.List;

    import sun.net.smtp.SmtpClient;
    import javax.activation.*;
    import javax.mail.*;
    import javax.mail.internet.*;
    import java.util.Properties;
    import javax.mail.internet.InternetAddress;
    import javax.portlet.RenderRequest;

    import org.apache.log4j.Logger;

    import com.liferay.portal.kernel.mail.SMTPAccount;
    import com.liferay.util.mail.MailEngine;
    import com.liferay.util.mail.MailEngineException;
    import com.liferay.util.mail.MailEngine;
    public class SaveRegister {

    public SaveRegister(){

    }

    public String getCountries() throws RemoteException {
    String xml = “”;

    try{
    List models = CountryServiceUtil.getCountries();
    for (Country row : models) {
    xml = xml +””;
    }

    } catch (Exception e) {
    throw new RemoteException(e.getMessage());
    }
    xml = xml + “”;
    return xml;
    }

    public String save(String email,
    String nombres,
    String direccion,
    String apellidos,
    String ciudad,
    String tel,
    String comment,
    String pais,
    String fax) throws IOException{
    String message = “init”;
    ContactenosImpl forma = new ContactenosImpl();
    forma.setEmail(email);

    try {
    forma.setApellidos(apellidos);
    forma.setCiudad(ciudad);
    forma.setComentario(comment);
    forma.setDireccion(direccion);
    forma.setEmail(email);
    forma.setFax(fax);
    forma.setNombres(nombres);
    forma.setPais(pais);
    forma.setTelefono(tel);

    ContactenosLocalServiceUtil.addContactenos(forma);
    //this.sendMail(“hola”);
    message = “Gracias por su mensaje”;

    } catch (SystemException e) {
    message = “error ” + e.getMessage();
    }

    /*try{
    this.sendMail(“null”);
    } catch (IOException e){
    message = “error ” + e.getMessage();
    }*/

    return message;

    }

    private void sendMail(String msn) throws IOException, MailEngineException{
    String from = “[email protected]”;
    String to = “[email protected]”;
    String subject=”prueba”;
    String body=”prueba333″;

    // MailEngine.send(from, to, subject, body);
    //String from=”[email protected]”;
    //String to=”[email protected], [email protected]“;

    MailEngine.send( from, to, subject, body );

    }

    }

    De igual forma muchas gracias por tu colaboracion

Leave a Reply

© Albert Coronado Calzada