Skip to content

Commit

Permalink
Fix JENKINS-6703
Browse files Browse the repository at this point in the history
- Email addresses can now be prepended with cc: to denote that the email should be sent to them as a CC
- Also fixed spelling of files and classes
  • Loading branch information
slide committed Jul 19, 2012
1 parent d072f82 commit 4e7e05a
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 73 deletions.
49 changes: 0 additions & 49 deletions src/main/java/hudson/plugins/emailext/EmailRecepientUtils.java

This file was deleted.

66 changes: 66 additions & 0 deletions src/main/java/hudson/plugins/emailext/EmailRecipientUtils.java
@@ -0,0 +1,66 @@
package hudson.plugins.emailext;

import hudson.EnvVars;
import hudson.tasks.Mailer;
import hudson.util.FormValidation;
import org.apache.commons.lang.StringUtils;

import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import java.util.LinkedHashSet;
import java.util.Set;

public class EmailRecipientUtils {

public static final String COMMA_SEPARATED_SPLIT_REGEXP = "[,\\s]+";

public static final int TO = 0;
public static final int CC = 1;

public Set<InternetAddress> convertRecipientString(String recipientList, EnvVars envVars)
throws AddressException {
return convertRecipientString(recipientList, envVars, TO);
}

public Set<InternetAddress> convertRecipientString(String recipientList, EnvVars envVars, int type)
throws AddressException{
final Set<InternetAddress> internetAddresses = new LinkedHashSet<InternetAddress>();
if (!StringUtils.isBlank(recipientList)) {
final String expandedRecipientList = envVars.expand(recipientList);
final String[] addresses = StringUtils.trim(expandedRecipientList).split(COMMA_SEPARATED_SPLIT_REGEXP);
final String defaultSuffix = Mailer.descriptor().getDefaultSuffix();
for (String address : addresses) {
if(!StringUtils.isBlank(address)) {
boolean isCc = false;
address = address.trim();

isCc = address.startsWith("cc:");
// if not a valid address, check if there is a default suffix (@something.com) provided
if (!address.contains("@") && defaultSuffix != null && defaultSuffix.contains("@")) {
address += defaultSuffix;
}

if(isCc) {
address = address.substring(3);
}

if((type == TO && !isCc) || (type == CC && isCc)) {
internetAddresses.add(new InternetAddress(address));
}
}
}
}
return internetAddresses;
}

public FormValidation validateFormRecipientList(String recipientList) {
// Try and convert the recipient string to a list of InternetAddress. If this fails then the validation fails.
try {
convertRecipientString(recipientList, new EnvVars(), TO);
convertRecipientString(recipientList, new EnvVars(), CC);
return FormValidation.ok();
} catch (AddressException e) {
return FormValidation.error(e.getMessage() + ": \"" + e.getRef() + "\"");
}
}
}
24 changes: 15 additions & 9 deletions src/main/java/hudson/plugins/emailext/ExtendedEmailPublisher.java
Expand Up @@ -375,8 +375,9 @@ private MimeMessage createMail(EmailType type, AbstractBuild<?, ?> build, BuildL

// Get the recipients from the global list of addresses
Set<InternetAddress> recipientAddresses = new LinkedHashSet<InternetAddress>();
Set<InternetAddress> ccAddresses = new LinkedHashSet<InternetAddress>();
if (type.getSendToRecipientList()) {
addAddressesFromRecipientList(recipientAddresses, getRecipientList(type, build, recipientList, listener, charset), env, listener);
addAddressesFromRecipientList(recipientAddresses, ccAddresses, getRecipientList(type, build, recipientList, listener, charset), env, listener);
}
// Get the list of developers who made changes between this build and the last
// if this mail type is configured that way
Expand All @@ -395,7 +396,7 @@ private MimeMessage createMail(EmailType type, AbstractBuild<?, ?> build, BuildL
try {
String adrs = user.getProperty(Mailer.UserProperty.class).getAddress();
if (adrs != null) {
addAddressesFromRecipientList(recipientAddresses, adrs, env, listener);
addAddressesFromRecipientList(recipientAddresses, ccAddresses, adrs, env, listener);
} else {
listener.getLogger().println("Failed to send e-mail to " + user.getFullName() + " because no e-mail address is known, and no default e-mail domain is configured");
}
Expand All @@ -415,24 +416,27 @@ private MimeMessage createMail(EmailType type, AbstractBuild<?, ?> build, BuildL
cur = p.getBuildByNumber(upc.getUpstreamBuild());
upc = cur.getCause(Cause.UpstreamCause.class);
}
addUserTriggeringTheBuild(cur, recipientAddresses, env, listener);
addUserTriggeringTheBuild(cur, recipientAddresses, ccAddresses, env, listener);
}

//Get the list of recipients that are uniquely specified for this type of email
if (!StringUtils.isBlank(type.getRecipientList())) {
addAddressesFromRecipientList(recipientAddresses, getRecipientList(type, build, type.getRecipientList(), listener, charset), env, listener);
addAddressesFromRecipientList(recipientAddresses, ccAddresses, getRecipientList(type, build, type.getRecipientList(), listener, charset), env, listener);
}

String emergencyReroute = ExtendedEmailPublisher.DESCRIPTOR.getEmergencyReroute();
boolean isEmergencyReroute = !StringUtils.isBlank(emergencyReroute);

if (isEmergencyReroute) {
recipientAddresses.clear();
addAddressesFromRecipientList(recipientAddresses, emergencyReroute, env, listener);
addAddressesFromRecipientList(recipientAddresses, ccAddresses, emergencyReroute, env, listener);
listener.getLogger().println("Emergency reroute is set to: " + emergencyReroute);
}

msg.setRecipients(Message.RecipientType.TO, recipientAddresses.toArray(new InternetAddress[recipientAddresses.size()]));
if(ccAddresses.size() > 0) {
msg.setRecipients(Message.RecipientType.CC, ccAddresses.toArray(new InternetAddress[ccAddresses.size()]));
}

AbstractBuild<?, ?> pb = build.getPreviousBuild();
if (pb != null) {
Expand Down Expand Up @@ -460,7 +464,7 @@ private MimeMessage createMail(EmailType type, AbstractBuild<?, ?> build, BuildL
return msg;
}

private void addUserTriggeringTheBuild(AbstractBuild<?, ?> build, Set<InternetAddress> recipientAddresses,
private void addUserTriggeringTheBuild(AbstractBuild<?, ?> build, Set<InternetAddress> recipientAddresses, Set<InternetAddress> ccAddresses,
EnvVars env, BuildListener listener) {
User user = getByUserIdCause(build);
if (user == null) {
Expand All @@ -470,7 +474,7 @@ private void addUserTriggeringTheBuild(AbstractBuild<?, ?> build, Set<InternetAd
if (user != null) {
String adrs = user.getProperty(Mailer.UserProperty.class).getAddress();
if (adrs != null) {
addAddressesFromRecipientList(recipientAddresses, adrs, env, listener);
addAddressesFromRecipientList(recipientAddresses, ccAddresses, adrs, env, listener);
} else {
listener.getLogger().println("Failed to send e-mail to " + user.getFullName() + " because no e-mail address is known, and no default e-mail domain is configured");
}
Expand Down Expand Up @@ -554,11 +558,13 @@ private MimeBodyPart getContent(final EmailType type, final AbstractBuild<?, ?>
return msgPart;
}

private static void addAddressesFromRecipientList(Set<InternetAddress> addresses, String recipientList,
private static void addAddressesFromRecipientList(Set<InternetAddress> addresses, Set<InternetAddress> ccAddresses, String recipientList,
EnvVars envVars, BuildListener listener) {
try {
Set<InternetAddress> internetAddresses = new EmailRecepientUtils().convertRecipientString(recipientList, envVars);
Set<InternetAddress> internetAddresses = new EmailRecipientUtils().convertRecipientString(recipientList, envVars, EmailRecipientUtils.TO);
addresses.addAll(internetAddresses);
Set<InternetAddress> ccInternetAddresses = new EmailRecipientUtils().convertRecipientString(recipientList, envVars, EmailRecipientUtils.CC);
ccAddresses.addAll(ccInternetAddresses);
} catch (AddressException ae) {
LOGGER.log(Level.WARNING, "Could not create email address.", ae);
listener.getLogger().println("Failed to create e-mail address for " + ae.getRef());
Expand Down
Expand Up @@ -399,7 +399,7 @@ public FormValidation doAddressCheck(@QueryParameter final String value)

public FormValidation doRecipientListRecipientsCheck(@QueryParameter final String value)
throws IOException, ServletException {
return new EmailRecepientUtils().validateFormRecipientList(value);
return new EmailRecipientUtils().validateFormRecipientList(value);
}

public FormValidation doMaxAttachmentSizeCheck(@QueryParameter final String value)
Expand Down
Expand Up @@ -13,9 +13,9 @@

import org.jvnet.hudson.test.HudsonTestCase;

public class EmailRecepientUtilsTest extends HudsonTestCase
public class EmailRecipientUtilsTest extends HudsonTestCase
{
private EmailRecepientUtils emailRecepientUtils;
private EmailRecipientUtils emailRecipientUtils;

private EnvVars envVars;

Expand All @@ -24,22 +24,22 @@ public void setUp()
throws Exception
{
super.setUp();
emailRecepientUtils = new EmailRecepientUtils();
emailRecipientUtils = new EmailRecipientUtils();
envVars = new EnvVars();
}

public void testConvertRecipientList_emptyRecipientStringShouldResultInEmptyEmailList()
throws AddressException
{
Set<InternetAddress> internetAddresses = emailRecepientUtils.convertRecipientString( "", envVars );
Set<InternetAddress> internetAddresses = emailRecipientUtils.convertRecipientString( "", envVars );

assertTrue( internetAddresses.isEmpty() );
}

public void testConvertRecipientList_emptyRecipientStringWithWhitespaceShouldResultInEmptyEmailList()
throws AddressException
{
Set<InternetAddress> internetAddresses = emailRecepientUtils.convertRecipientString( " ", envVars );
Set<InternetAddress> internetAddresses = emailRecipientUtils.convertRecipientString( " ", envVars );

assertTrue( internetAddresses.isEmpty() );
}
Expand All @@ -48,7 +48,7 @@ public void testConvertRecipientList_singleRecipientShouldResultInOneEmailAddres
throws AddressException
{
Set<InternetAddress> internetAddresses =
emailRecepientUtils.convertRecipientString( "ashlux@gmail.com", envVars );
emailRecipientUtils.convertRecipientString( "ashlux@gmail.com", envVars );

assertEquals( 1, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
Expand All @@ -58,7 +58,7 @@ public void testConvertRecipientList_singleRecipientWithWhitespaceShouldResultIn
throws AddressException
{
Set<InternetAddress> internetAddresses =
emailRecepientUtils.convertRecipientString( " ashlux@gmail.com ", envVars );
emailRecipientUtils.convertRecipientString( " ashlux@gmail.com ", envVars );

assertEquals( 1, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
Expand All @@ -68,7 +68,7 @@ public void testConvertRecipientList_commaSeparatedRecipientStringShouldResultIn
throws AddressException
{
Set<InternetAddress> internetAddresses =
emailRecepientUtils.convertRecipientString( "ashlux@gmail.com, mickeymouse@disney.com", envVars );
emailRecipientUtils.convertRecipientString( "ashlux@gmail.com, mickeymouse@disney.com", envVars );

assertEquals( 2, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
Expand All @@ -79,7 +79,7 @@ public void testConvertRecipientList_spaceSeparatedRecipientStringShouldResultIn
throws AddressException
{
Set<InternetAddress> internetAddresses =
emailRecepientUtils.convertRecipientString( "ashlux@gmail.com mickeymouse@disney.com", envVars );
emailRecipientUtils.convertRecipientString( "ashlux@gmail.com mickeymouse@disney.com", envVars );

assertEquals( 2, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
Expand All @@ -90,7 +90,7 @@ public void testConvertRecipientList_emailAddressesShouldBeUnique()
throws AddressException
{
Set<InternetAddress> internetAddresses =
emailRecepientUtils.convertRecipientString( "ashlux@gmail.com, mickeymouse@disney.com, ashlux@gmail.com", envVars );
emailRecipientUtils.convertRecipientString( "ashlux@gmail.com, mickeymouse@disney.com, ashlux@gmail.com", envVars );

assertEquals( 2, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
Expand All @@ -102,7 +102,7 @@ public void testConvertRecipientList_recipientStringShouldBeExpanded()
{
envVars.put( "EMAIL_LIST", "ashlux@gmail.com" );

Set<InternetAddress> internetAddresses = emailRecepientUtils.convertRecipientString( "$EMAIL_LIST", envVars );
Set<InternetAddress> internetAddresses = emailRecipientUtils.convertRecipientString( "$EMAIL_LIST", envVars );

assertEquals( 1, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
Expand All @@ -111,15 +111,15 @@ public void testConvertRecipientList_recipientStringShouldBeExpanded()
public void testValidateFormRecipientList_validationShouldPassAListOfGoodEmailAddresses()
{
FormValidation formValidation =
emailRecepientUtils.validateFormRecipientList( "ashlux@gmail.com internal somewhere@domain" );
emailRecipientUtils.validateFormRecipientList( "ashlux@gmail.com internal somewhere@domain" );

assertEquals( FormValidation.Kind.OK, formValidation.kind );
}

public void testValidateFormRecipientList_validationShouldFailWithBadEmailAddress()
{
FormValidation formValidation =
emailRecepientUtils.validateFormRecipientList( "@@@" );
emailRecipientUtils.validateFormRecipientList( "@@@" );

assertEquals( FormValidation.Kind.ERROR, formValidation.kind );
}
Expand All @@ -128,9 +128,26 @@ public void testConvertRecipientList_defaultSuffix()
throws AddressException
{
Mailer.descriptor().setDefaultSuffix("@gmail.com");
Set<InternetAddress> internetAddresses = emailRecepientUtils.convertRecipientString( "ashlux", envVars );
Set<InternetAddress> internetAddresses = emailRecipientUtils.convertRecipientString( "ashlux", envVars );

assertEquals( 1, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
}

public void testCC()
throws Exception
{
envVars.put( "EMAIL_LIST", "ashlux@gmail.com, cc:slide.o.mix@gmail.com, another@gmail.com" );

Set<InternetAddress> internetAddresses = emailRecipientUtils.convertRecipientString( "$EMAIL_LIST", envVars );

assertEquals( 2, internetAddresses.size() );
assertTrue( internetAddresses.contains( new InternetAddress( "ashlux@gmail.com" ) ) );
assertTrue( internetAddresses.contains( new InternetAddress( "another@gmail.com" ) ) );

internetAddresses = emailRecipientUtils.convertRecipientString( "$EMAIL_LIST", envVars, EmailRecipientUtils.CC);

assertEquals( 1, internetAddresses.size() );
assertTrue ( internetAddresses.contains( new InternetAddress( "slide.o.mix@gmail.com" ) ) );
}
}

0 comments on commit 4e7e05a

Please sign in to comment.