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}