001package net.sf.logdistiller.publishers;
002
003/*
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 *     http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017import java.io.*;
018import java.util.Properties;
019import javax.activation.DataHandler;
020import javax.activation.DataSource;
021import javax.activation.FileDataSource;
022import javax.mail.*;
023import javax.mail.internet.*;
024
025import net.sf.logdistiller.*;
026
027/**
028 * Send mail report of a LogDistillation. When the report is a group report, a file containing logevents (if saved) is
029 * added as attachment. Global output parameters are used as JavaMail session properties: the most important property is
030 * <code>mail.smtp.host</code>, but see JavaMail documentation to find all available properties.
031 * <p>
032 * Parameters:
033 * <ul>
034 * <li><code>to</code>, <code>cc</code> (at least one): recipients of the mail, comma separated values if multiple
035 * recipients
036 * <li><code>from</code> (default: <code>smtp.from</code> global output parameter, or
037 * <code>logdistiller@sourceforge.net</code>
038 * <li><code>attachLogs</code> (default: <code>true</code>): add corresponding logevents as attachment
039 * </ul>
040 */
041public class MailPublisher
042    extends Publisher
043{
044    public String getId()
045    {
046        return "mail";
047    }
048
049    public void publish( LogDistillation logdistillation, LogDistiller.Report report )
050        throws IOException, PublishException
051    {
052        String content = logdistillation.getContent();
053        String subject =
054            "[logdistiller:" + logdistillation.getDefinition().getOutput().getId() + "]"
055                + ( ( content == null ) ? "" : ( " " + content ) ) + " global report: "
056                + logdistillation.getEventCount() + " logevents";
057        ReportFormat format = ReportFormats.getReportFormat( report.getFormat() );
058        StringWriter sw = new StringWriter();
059        format.report( logdistillation, sw );
060        String body = sw.toString();
061        try
062        {
063            sendMail( logdistillation, report, subject, body, format.getContentType(), null );
064        }
065        catch ( MessagingException me )
066        {
067            throw new PublishException( "error while sending global report by mail: " + me.getMessage(), me );
068        }
069    }
070
071    public void publish( LogDistillation.Group group, LogDistiller.Report report )
072        throws IOException, PublishException
073    {
074        LogDistillation logdistillation = group.getLogdistillation();
075        String content = logdistillation.getContent();
076        String subject =
077            "[logdistiller:" + logdistillation.getDefinition().getOutput().getId() + "]"
078                + ( ( content == null ) ? "" : ( " " + content ) ) + " report for group "
079                + group.getDefinition().getId() + ": " + group.getEventCount() + " logevents";
080        ReportFormat format = ReportFormats.getReportFormat( report.getFormat() );
081        StringWriter sw = new StringWriter();
082        format.report( group, sw );
083        String body = sw.toString();
084        try
085        {
086            sendMail( logdistillation, report, subject, body, format.getContentType(), group.getLogFile() );
087        }
088        catch ( MessagingException me )
089        {
090            throw new PublishException( "error while sending group report by mail: " + me.getMessage(), me );
091        }
092    }
093
094    protected void sendMail( LogDistillation logdistillation, LogDistiller.Report report, String subject,
095                             String content, String mimetype, File attach )
096        throws MessagingException
097    {
098        LogDistiller ld = logdistillation.getDefinition();
099        String to = report.getParam( "to" );
100        String cc = report.getParam( "cc" );
101        if ( ( to == null ) && ( cc == null ) )
102        {
103            // nobody to send to: TODO add warning
104            return;
105        }
106        Properties props = new Properties();
107        props.putAll( ld.getOutput().getParams() );
108        Session session = Session.getDefaultInstance( props, null );
109        MimeMessage msg = new MimeMessage( session );
110
111        msg.setSubject( subject );
112        Multipart mp = new MimeMultipart();
113        BodyPart body = new MimeBodyPart();
114        body.setContent( content, mimetype );
115        mp.addBodyPart( body );
116        msg.setContent( mp );
117        if ( to != null )
118        {
119            msg.setRecipients( Message.RecipientType.TO, InternetAddress.parse( to ) );
120        }
121        if ( cc != null )
122        {
123            msg.setRecipients( Message.RecipientType.CC, InternetAddress.parse( cc ) );
124        }
125        String from = report.getParam( "from", "logdistiller@sourceforge.net" );
126        msg.setFrom( new InternetAddress( from ) );
127
128        String attachLogs = report.getParam( "attachLogs", "true" );
129        if ( ( attach != null ) && ( attach.exists() ) && ( "true".equals( attachLogs ) ) )
130        {
131            BodyPart attachment = new MimeBodyPart();
132            DataSource ds = new FileDataSource( attach );
133            attachment.setDataHandler( new DataHandler( ds ) );
134            attachment.setFileName( attach.getName() );
135            mp.addBodyPart( attachment );
136        }
137
138        sendMail( msg );
139    }
140
141    protected void sendMail( Message msg )
142        throws MessagingException
143    {
144        Transport.send( msg );
145    }
146}