Skip to content

Commit

Permalink
Default email sender is not working
Browse files Browse the repository at this point in the history
  • Loading branch information
anatol-sialitski committed Mar 13, 2024
1 parent e40dc34 commit 664d826
Show file tree
Hide file tree
Showing 10 changed files with 782 additions and 260 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,12 @@

import javax.mail.internet.MimeMessage;

import com.enonic.xp.annotation.PublicApi;

@PublicApi
public interface MailMessage
{
@Deprecated
void compose( MimeMessage message )
throws Exception;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,188 @@
package com.enonic.xp.mail;

import java.util.List;
import java.util.Map;
import java.util.Objects;

import com.enonic.xp.annotation.PublicApi;

@PublicApi
public class MailMessageParams
{
private final String[] to;

private final String[] from;

private final String[] cc;

private final String[] bcc;

private final String[] replyTo;

private final String subject;

private final String contentType;

private final String body;

private final Map<String, String> headers;

private final List<Map<String, Object>> attachments;

private MailMessageParams( Builder builder )
{
this.to = Objects.requireNonNullElse( builder.to, new String[]{} );
this.from = Objects.requireNonNullElse( builder.from, new String[]{} );
this.cc = Objects.requireNonNullElse( builder.cc, new String[]{} );
this.bcc = Objects.requireNonNullElse( builder.bcc, new String[]{} );
this.replyTo = Objects.requireNonNullElse( builder.replyTo, new String[]{} );
this.subject = builder.subject;
this.contentType = builder.contentType;
this.body = builder.body;
this.headers = builder.headers;
this.attachments = builder.attachments;
}

public static Builder create()
{
return new Builder();
}

public String[] getTo()
{
return to;
}

public String[] getFrom()
{
return from;
}

public String[] getCc()
{
return cc;
}

public String[] getBcc()
{
return bcc;
}

public String[] getReplyTo()
{
return replyTo;
}

public String getSubject()
{
return subject;
}

public String getContentType()
{
return contentType;
}

public String getBody()
{
return body;
}

public Map<String, String> getHeaders()
{
return headers;
}

public List<Map<String, Object>> getAttachments()
{
return attachments;
}

public static class Builder
{
private String[] to;

private String[] from;

private String[] cc;

private String[] bcc;

private String[] replyTo;

private String subject;

private String contentType;

private String body;

private Map<String, String> headers;

private List<Map<String, Object>> attachments;

public Builder setTo( final String[] to )
{
this.to = to;
return this;
}

public Builder setFrom( final String[] from )
{
this.from = from;
return this;
}

public Builder setCc( final String[] cc )
{
this.cc = cc;
return this;
}

public Builder setBcc( final String[] bcc )
{
this.bcc = bcc;
return this;
}

public Builder setReplyTo( final String[] replyTo )
{
this.replyTo = replyTo;
return this;
}

public Builder setSubject( final String subject )
{
this.subject = subject;
return this;
}

public Builder setContentType( final String contentType )
{
this.contentType = contentType;
return this;
}

public Builder setBody( final String body )
{
this.body = body;
return this;
}

public Builder setHeaders( final Map<String, String> headers )
{
this.headers = headers;
return this;
}

public Builder setAttachments( final List<Map<String, Object>> attachments )
{
this.attachments = attachments;
return this;
}

public MailMessageParams build()
{
return new MailMessageParams( this );
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package com.enonic.xp.mail;

import com.enonic.xp.annotation.PublicApi;

@PublicApi
public interface MailService
{
@Deprecated
void send( MailMessage message );

void send( MailMessageParams message );
}
1 change: 1 addition & 0 deletions modules/core/core-mail/build.gradle
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
dependencies {
implementation project( ':core:core-api' )
implementation project( ':core:core-internal' )

testImplementation ( libs.mockjavamail ) {
exclude group: 'javax.mail'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package com.enonic.xp.mail.impl;

import java.time.Duration;
import java.util.Properties;
import java.util.concurrent.Executors;

import javax.mail.Address;
import javax.mail.Authenticator;
Expand All @@ -11,18 +13,35 @@

import org.osgi.service.component.annotations.Activate;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Deactivate;
import org.osgi.service.component.annotations.Modified;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.enonic.xp.core.internal.concurrent.SimpleExecutor;
import com.enonic.xp.mail.MailException;
import com.enonic.xp.mail.MailMessage;
import com.enonic.xp.mail.MailMessageParams;
import com.enonic.xp.mail.MailService;

@Component(immediate = true, configurationPid = "com.enonic.xp.mail")
public final class MailServiceImpl
implements MailService
{
private static final Logger LOG = LoggerFactory.getLogger( MailServiceImpl.class );

private final SimpleExecutor simpleExecutor;

private Session session;

public MailServiceImpl()
{
this.simpleExecutor = new SimpleExecutor( Executors::newCachedThreadPool, "mail-service-executor-thread-%d",
e -> LOG.error( "Message sending failed", e ) );

Check warning on line 40 in modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java#L40

Added line #L40 was not covered by tests
}

@Activate
@Modified
public void activate( final MailConfig config )
{
final Properties properties = new Properties();
Expand All @@ -47,6 +66,12 @@ public void activate( final MailConfig config )
}
}

@Deactivate
public void deactivate()
{
simpleExecutor.shutdownAndAwaitTermination( Duration.ofSeconds( 5 ), neverCommenced -> LOG.warn( "Not all messages were sent" ) );
}

Check warning on line 73 in modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java#L72-L73

Added lines #L72 - L73 were not covered by tests

@Override
public void send( final MailMessage message )
{
Expand All @@ -62,6 +87,29 @@ public void send( final MailMessage message )
}
}

@Override
public void send( final MailMessageParams params )
{
try
{
MimeMessage message = MimeMessageConverter.convert( session, params );
simpleExecutor.execute( () -> {
try
{
doSend( message );
}
catch ( Exception e )

Check warning on line 101 in modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java#L101

Added line #L101 was not covered by tests
{
throw new RuntimeException( e );

Check warning on line 103 in modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java#L103

Added line #L103 was not covered by tests
}
} );
}
catch ( final Exception e )

Check warning on line 107 in modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java#L107

Added line #L107 was not covered by tests
{
throw handleException( e );

Check warning on line 109 in modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java

View check run for this annotation

Codecov / codecov/patch

modules/core/core-mail/src/main/java/com/enonic/xp/mail/impl/MailServiceImpl.java#L109

Added line #L109 was not covered by tests
}
}

private MimeMessage newMessage()
{
return new MimeMessage( this.session );
Expand Down

0 comments on commit 664d826

Please sign in to comment.