blob: 9c72b68631870df4975654c23c1bdf82f251027f [file] [log] [blame]
package org.apache.maven.plugin.announcement.mailsender;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.security.Security;
import java.util.Date;
import java.util.Iterator;
import java.util.Properties;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import org.codehaus.plexus.mailsender.AbstractMailSender;
import org.codehaus.plexus.mailsender.MailMessage;
import org.codehaus.plexus.mailsender.MailSenderException;
import org.codehaus.plexus.mailsender.util.DateFormatUtils;
import org.codehaus.plexus.util.StringUtils;
/**
* Helper class for sending email.
*/
public class ProjectJavamailMailSender
extends AbstractMailSender
{
private static final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// ----------------------------------------------------------------------
//
// ----------------------------------------------------------------------
private Properties userProperties;
private Properties props;
// ----------------------------------------------------------------------
// Component Lifecycle
// ----------------------------------------------------------------------
public void initialize()
{
if ( StringUtils.isEmpty( getSmtpHost() ) )
{
System.out.println( "Error in configuration: Missing smtpHost." );
}
if ( getSmtpPort() == 0 )
{
setSmtpPort( DEFAULT_SMTP_PORT );
}
props = new Properties();
props.put( "mail.smtp.host", getSmtpHost() );
props.put( "mail.smtp.port", String.valueOf( getSmtpPort() ) );
if ( getUsername() != null )
{
props.put( "mail.smtp.auth", "true" );
}
props.put( "mail.debug", String.valueOf( getLogger().isDebugEnabled() ) );
if ( isSslMode() )
{
try
{
// Try to load the SSL Provider class before we use it, it isn't present in non-Sun JVMs
this.getClass().getClassLoader().loadClass( "com.sun.net.ssl.internal.ssl.Provider" );
Security.addProvider( new com.sun.net.ssl.internal.ssl.Provider() );
props.put( "mail.smtp.socketFactory.port", String.valueOf( getSmtpPort() ) );
props.put( "mail.smtp.socketFactory.class", SSL_FACTORY );
props.put( "mail.smtp.socketFactory.fallback", "false" );
}
catch ( ClassNotFoundException e )
{
getLogger().error( "You can't use sslMode because your system is missing an SSL Provider.", e );
}
}
if ( userProperties != null )
{
for (Object o : userProperties.keySet()) {
String key = (String) o;
String value = userProperties.getProperty(key);
props.put(key, value);
}
}
}
// ----------------------------------------------------------------------
// MailSender Implementation
// ----------------------------------------------------------------------
public void send( MailMessage mail )
throws MailSenderException
{
verify( mail );
try
{
Authenticator auth = null;
if ( getUsername() != null )
{
auth = new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication( getUsername(), getPassword() );
}
};
}
Session session = Session.getDefaultInstance( props, auth );
session.setDebug( getLogger().isDebugEnabled() );
Message msg = new MimeMessage( session );
InternetAddress addressFrom = new InternetAddress( mail.getFrom().getRfc2822Address() );
msg.setFrom( addressFrom );
if ( mail.getToAddresses().size() > 0 )
{
InternetAddress[] addressTo = new InternetAddress[mail.getToAddresses().size()];
int count = 0;
for (Object o : mail.getToAddresses()) {
String address = ((MailMessage.Address) o).getRfc2822Address();
addressTo[count++] = new InternetAddress(address);
}
msg.setRecipients( Message.RecipientType.TO, addressTo );
}
if ( mail.getCcAddresses().size() > 0 )
{
InternetAddress[] addressCc = new InternetAddress[mail.getCcAddresses().size()];
int count = 0;
for (Object o : mail.getCcAddresses()) {
String address = ((MailMessage.Address) o).getRfc2822Address();
addressCc[count++] = new InternetAddress(address);
}
msg.setRecipients( Message.RecipientType.CC, addressCc );
}
if ( mail.getBccAddresses().size() > 0 )
{
InternetAddress[] addressBcc = new InternetAddress[mail.getBccAddresses().size()];
int count = 0;
for (Object o : mail.getBccAddresses()) {
String address = ((MailMessage.Address) o).getRfc2822Address();
addressBcc[count++] = new InternetAddress(address);
}
msg.setRecipients( Message.RecipientType.BCC, addressBcc );
}
// Setting the Subject and Content Type
msg.setSubject( mail.getSubject() );
msg.setContent( mail.getContent(), mail.getContentType() == null ? "text/plain" : mail.getContentType() );
if ( mail.getSendDate() != null )
{
msg.setHeader( "Date", DateFormatUtils.getDateHeader( mail.getSendDate() ) );
}
else
{
msg.setHeader( "Date", DateFormatUtils.getDateHeader( new Date() ) );
}
// Send the message
Transport.send( msg );
}
catch ( MessagingException e )
{
throw new MailSenderException( "Error while sending mail.", e );
}
}
}