es.ucm.fdi.tutorias.business.boundary.Emails.java Source code

Java tutorial

Introduction

Here is the source code for es.ucm.fdi.tutorias.business.boundary.Emails.java

Source

/**
 * This file is part of Portal Web de la FDI.
 *
 * Portal Web de la FDI is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Portal Web de la FDI is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with Portal Web de la FDI.  If not, see <http://www.gnu.org/licenses/>.
 */
package es.ucm.fdi.tutorias.business.boundary;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.net.URISyntaxException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

import net.fortuna.ical4j.data.CalendarOutputter;
import net.fortuna.ical4j.model.Dur;
import net.fortuna.ical4j.model.Property;
import net.fortuna.ical4j.model.ValidationException;
import net.fortuna.ical4j.model.component.VEvent;
import net.fortuna.ical4j.model.property.CalScale;
import net.fortuna.ical4j.model.property.Description;
import net.fortuna.ical4j.model.property.Location;
import net.fortuna.ical4j.model.property.Organizer;
import net.fortuna.ical4j.model.property.ProdId;
import net.fortuna.ical4j.model.property.Version;

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.MessageSource;
import org.springframework.stereotype.Service;

import es.ucm.fdi.tutorias.business.entity.Tutoria;
import es.ucm.fdi.util.Constants;

@Service
public class Emails {

    @Value("#{gmailData[username]}")
    private String username;

    @Value("#{gmailData[password]}")
    private String password;

    @Value("#{gmailData[port]}")
    private String port;

    @Value("#{gmailData[host]}")
    private String host;

    @Value("#{gmailData[starttls]}")
    private String starttls;

    @Value("#{gmailData[auth]}")
    private String auth;

    @Autowired
    private MessageSource messageSource;

    private static final Logger logger = LoggerFactory.getLogger("Emails");

    private String generarMensajeConfirmacionTutoria(Tutoria tutoria) {
        String mensaje = "<p><b>" + tutoria.getDestinatario().getUserGivenName()
                + tutoria.getDestinatario().getUserSurname() + "</b>";
        mensaje += " ha confirmado la tutora con usted, ";
        mensaje += tutoria.getEmisor().getUserGivenName() + " " + tutoria.getEmisor().getUserSurname();
        DateTimeFormatter dtfOut = DateTimeFormat.forPattern("MM/dd/yyyy hh:mm");
        mensaje += " sobre su asignatura <b>" + tutoria.getAsignatura() + "</b></p> de " + "<b>"
                + dtfOut.print(tutoria.getComienzoTutoria()) + "</b>";
        mensaje += " hasta " + "<b>" + dtfOut.print(tutoria.getFinTutoria()) + "</b></p>";
        return mensaje;
    }

    private String generarAsuntoConfirmacionTutoria(Tutoria tutoria) {
        String asunto = "Confirmada tutora para la asignatura: " + tutoria.getAsignatura();
        return asunto;
    }

    private String generarMensajeSolicitudTutoria(Tutoria tutoria, String contextPath) {
        String mensaje = "<p> <b>" + tutoria.getEmisor().getUserGivenName() + " "
                + tutoria.getEmisor().getUserSurname() + "</b>";
        mensaje += " ha solicitado una tutora con usted, ";
        mensaje += tutoria.getDestinatario().getUserGivenName() + " " + tutoria.getDestinatario().getUserSurname();
        DateTimeFormatter dtfOut = DateTimeFormat.forPattern("MM/dd/yyyy hh:mm");
        mensaje += ", sobre su asignatura: <b>" + tutoria.getAsignatura() + "</b>, de " + "<b>"
                + dtfOut.print(tutoria.getComienzoTutoria()) + "</b>";
        mensaje += " hasta " + "<b>" + dtfOut.print(tutoria.getFinTutoria()) + "</b></p>";
        mensaje += "El motivo por el que se solicita la tutora es: <p><i>" + tutoria.getResumenDudas()
                + "</i></p>";
        mensaje += "<a bgcolor='#70bbd9' color='green' href='http://localhost:8088" + contextPath
                + Constants.URL_CONFIRMAR_TUTORIA + "?id=" + tutoria.getId() + "'>Confirmar tutora</a>";
        return mensaje;
    }

    private String generarAsuntoSolicitudTutoria(Tutoria tutoria) {
        String asunto = "Solicitud de tutora para la asignatura: " + tutoria.getAsignatura();
        return asunto;
    }

    public void enviarEmailSolicitudTutoria(Tutoria tutoria, String contextPath) {
        String mensaje = generarMensajeSolicitudTutoria(tutoria, contextPath);
        String asunto = generarAsuntoSolicitudTutoria(tutoria);
        String nombreArchivo = tutoria.getEmisor().getUsername() + tutoria.getId();
        if (crearArchivoCSV(nombreArchivo + ".csv", tutoria) && crearArchivoCal(nombreArchivo + ".ics", tutoria)) {
            //      if (crearArchivoCSV( nombreArchivo + ".csv",tutoria) ){
            enviarEmail(tutoria.getDestinatario().getEmail(), tutoria, mensaje, asunto, nombreArchivo + ".csv",
                    nombreArchivo + ".ics", true);
        }

    }

    public void enviarEmailConfirmacionTutoria(Tutoria tutoria) {
        String mensaje = generarMensajeConfirmacionTutoria(tutoria);
        String asunto = generarAsuntoConfirmacionTutoria(tutoria);
        enviarEmail(tutoria.getDestinatario().getEmail(), tutoria, mensaje, asunto, "", "", false);
    }

    private boolean crearArchivoCSV(String nombreArchivo, Tutoria tutoria) {
        PrintWriter writer;
        try {
            writer = new PrintWriter(nombreArchivo, "UTF-8");
            String contenidoCSV = "Subject,Start Date,Start Time,End Date,End Time,All Day Event,Description,Location,Private\n";
            contenidoCSV += "Tutoria," + tutoria.getComienzoTutoria();
            contenidoCSV += "," + tutoria.getFinTutoria();
            contenidoCSV += ",False";
            contenidoCSV += "," + tutoria.getResumenDudas();
            contenidoCSV += ",\"Facultad de Informtica - UCM\"";
            contenidoCSV += ",True";
            writer.print(contenidoCSV);
            writer.close();
            return true;
        } catch (FileNotFoundException e) {
            logger.error("NO se ha podido crear archivo CSV" + e);
            e.printStackTrace();
            return false;
        } catch (UnsupportedEncodingException e) {
            logger.error("NO se ha podido crear archivo CSV" + e);
            e.printStackTrace();
            return false;
        }

    }

    private boolean crearArchivoCal(String nombreCalendario, Tutoria tutoria) {
        String hostEmail = username;

        //Initialize values
        String calFile = nombreCalendario;
        ;

        //start time
        DateTime comienzo = tutoria.getComienzoTutoria();
        java.util.Calendar startCal = java.util.Calendar.getInstance();
        startCal.set(comienzo.getYear(), comienzo.getMonthOfYear(), comienzo.getDayOfMonth(),
                comienzo.getHourOfDay(), comienzo.getMinuteOfHour());

        //end time
        java.util.Calendar endCal = java.util.Calendar.getInstance();
        DateTime fin = tutoria.getFinTutoria();
        endCal.set(fin.getYear(), fin.getMonthOfYear(), fin.getDayOfMonth(), fin.getHourOfDay(),
                fin.getMinuteOfHour());

        String subject = "Tutora";
        String location = "Location - \"Facultad de Informtica-UCM\"";
        String description = tutoria.getResumenDudas();

        net.fortuna.ical4j.model.Calendar calendar = new net.fortuna.ical4j.model.Calendar();
        calendar.getProperties().add(new ProdId("-//ProyectoSI-FdiUcm//iCal4j 1.0//EN"));
        calendar.getProperties().add(Version.VERSION_2_0);
        calendar.getProperties().add(CalScale.GREGORIAN);

        SimpleDateFormat sdFormat = new SimpleDateFormat("yyyyMMdd'T'hhmmss'Z'");
        String strDate = sdFormat.format(startCal.getTime());

        net.fortuna.ical4j.model.Date startDt = null;
        try {
            startDt = new net.fortuna.ical4j.model.Date(strDate, "yyyyMMdd'T'hhmmss'Z'");
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }

        long diff = endCal.getTimeInMillis() - startCal.getTimeInMillis();
        int min = (int) (diff / (1000 * 60));

        Dur dur = new Dur(0, 0, min, 0);

        //Creating a meeting event
        VEvent meeting = new VEvent(startDt, dur, subject);

        meeting.getProperties().add(new Location(location));
        meeting.getProperties().add(new Description());

        try {
            meeting.getProperties().getProperty(Property.DESCRIPTION).setValue(description);
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return false;
        } catch (ParseException e) {
            e.printStackTrace();
            return false;
        }

        try {
            meeting.getProperties().add(new Organizer("MAILTO:" + hostEmail));
        } catch (URISyntaxException e) {
            e.printStackTrace();
            return false;
        }

        calendar.getComponents().add(meeting);

        FileOutputStream fout = null;

        try {
            fout = new FileOutputStream(calFile);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        }

        CalendarOutputter outputter = new CalendarOutputter();
        outputter.setValidating(false);

        try {
            outputter.output(calendar, fout);
            return true;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        } catch (ValidationException e) {
            e.printStackTrace();
            return false;
        }
    }

    private void enviarEmail(String to, Tutoria tutoria, String mensaje, String asunto, String nombreCSV,
            String nombreCal, boolean solicitudTutoria) {
        Properties props = new Properties();

        Session session = Session.getDefaultInstance(props);
        MimeMessage message = new MimeMessage(session);

        props.put("mail.smtp.starttls.enable", starttls);
        props.put("mail.smtp.host", host);
        props.put("mail.smtp.user", username);
        props.put("mail.smtp.password", password);
        props.put("mail.smtp.port", port);
        props.put("mail.smtp.auth", auth);

        try {
            message.setFrom(new InternetAddress(username));
            InternetAddress[] toAddress = new InternetAddress[1];
            toAddress[0] = new InternetAddress(to);
            message.addRecipient(Message.RecipientType.TO, toAddress[0]);
            message.setContent(mensaje, "text/calendar");

            // Se rellena el texto de la primera parte del email
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(mensaje);
            mbp1.setContent(mensaje, "text/html");

            if (solicitudTutoria) {
                // Creacin de segunda parte 
                MimeBodyPart mbp2 = new MimeBodyPart();
                // Se adjunta el archivo csv
                FileDataSource fds = new FileDataSource(nombreCSV);
                mbp2.setDataHandler(new DataHandler(fds));
                mbp2.setFileName(fds.getName());

                // Creacin de tercera parte 
                MimeBodyPart mbp3 = new MimeBodyPart();
                // Se adjunta el archivo ical
                FileDataSource fds2 = new FileDataSource(nombreCal);
                mbp3.setDataHandler(new DataHandler(fds2));
                mbp3.setFileName(fds2.getName());

                // Se crea el Multipart y se aaden sus partes
                Multipart mp = new MimeMultipart();
                mp.addBodyPart(mbp1);
                mp.addBodyPart(mbp2);
                mp.addBodyPart(mbp3);

                // Se aade el Multipart to the message
                message.setContent(mp);
            }

            message.setSentDate(new Date());

            message.setSubject(asunto);
            Transport transport = session.getTransport("smtp");
            transport.connect(host, username, password);
            transport.sendMessage(message, message.getAllRecipients());
            transport.close();
        } catch (AddressException ae) {
            ae.printStackTrace();
        } catch (MessagingException me) {
            me.printStackTrace();
        }
    }
}