package javacodebook.misc.mail_attach;

import javax.mail.*;
import javax.mail.internet.*;
import javax.activation.*;
import java.util.Date;
import java.util.Properties;
import java.io.*;

/**
 * Diese Klasse dient zum Versenden einer einfachen Mail. Die Mail hat ein 
 * Attachment, kann aber nicht an Personen im CC oder BCC versendet werden.
 * @author  Mark Donnermeyer
 */
public class AttachmentMailSender {
    
    // Die Daten, die zum Versand eine Mail benötigt werden.
    String recipient  = null;
    String sender     = null;
    String subject    = null;
    String text       = null;
    String host       = null;
    File   attachment = null;
    
    public AttachmentMailSender() {
    }
    
    public void setHost(String host) {
        this.host = host;
    }
    
    public void setRecipient(String recipient) {
        this.recipient = recipient;
    }
    
    public void setSender(String sender) {
        this.sender = sender;
    }
    
    public void setSubject(String subject) {
        this.subject = subject;
    }
    
    public void setText(String text) {
        this.text = text;
    }
    
    public void setAttachment(File attachment) {
        this.attachment = attachment;
    }

    /**
     * Versendet die Nachricht. Treten dabei Probleme auf, werden diese in Form
     * einer Exception an die aufrufende Instanz weitergeleitet.
     */
    public void sendMessage() throws AddressException, MessagingException {
        
        // Der SMTP-Host, über den die Mails gesendet werden, wird in der Liste
        // der Porperties angegeben.
        Properties props = new Properties();
        props.put("mail.smtp.host", host);

        // Es wird eine Mail-Session angelegt. Über diese Session erfolgt der
        // Versand.
        Session session = Session.getDefaultInstance(props, null);

        // Nachricht erzeugen, Adressat, Absender und Betreff angeben.
        MimeMessage msg = new MimeMessage(session);
        msg.setFrom(new InternetAddress(sender));
        InternetAddress[] address = {new InternetAddress(recipient)};
        msg.setRecipients(Message.RecipientType.TO, address);
        msg.setSubject(subject);
        msg.setSentDate(new Date());

        if (attachment != null)
        {
            // Der Text als erster Part 
            MimeBodyPart mbp1 = new MimeBodyPart();
            mbp1.setText(text);

            // Das Attachment als zweiter Part
            MimeBodyPart mbp2 = new MimeBodyPart();
            FileDataSource fds = new FileDataSource(attachment);
            mbp2.setDataHandler(new DataHandler(fds));
            mbp2.setFileName(fds.getName());

            // Die beiden Teile als Multipart zusammenfügen
            Multipart mp = new MimeMultipart();
            mp.addBodyPart(mbp1);
            mp.addBodyPart(mbp2);

            // Den Multipart an die Nachricht hängen
            msg.setContent(mp);
        }
        else
            msg.setText(text);
        
        // Die Nachricht versenden.
        Transport.send(msg);
    }
}