Skip to content

Commit

Permalink
refactor to greenmail
Browse files Browse the repository at this point in the history
  • Loading branch information
JiriOndrusek committed Apr 1, 2022
1 parent b8bfb8a commit e3c1696
Show file tree
Hide file tree
Showing 9 changed files with 521 additions and 291 deletions.
22 changes: 16 additions & 6 deletions integration-tests/mail/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,18 @@
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-direct</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-seda</artifactId>
</dependency>

<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy</artifactId>
</dependency>
<dependency>
<groupId>org.jvnet.mock-javamail</groupId>
<artifactId>mock-javamail</artifactId>
</dependency>
<dependency>
<groupId>io.quarkus</groupId>
<artifactId>quarkus-resteasy-jackson</artifactId>
<artifactId>quarkus-resteasy-jsonb</artifactId>
</dependency>

<!-- test dependencies -->
Expand All @@ -69,7 +69,17 @@
<artifactId>awaitility</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.testcontainers</groupId>
<artifactId>testcontainers</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.icegreen</groupId>
<artifactId>greenmail</artifactId>
<version>1.6.7</version>
<scope>test</scope>
</dependency>
</dependencies>

<build>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,18 @@

import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import javax.activation.FileDataSource;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Store;
Expand All @@ -40,31 +41,32 @@
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

import com.sun.mail.imap.SortTerm;
import org.apache.camel.CamelContext;
import org.apache.camel.Endpoint;
import org.apache.camel.ConsumerTemplate;
import org.apache.camel.Exchange;
import org.apache.camel.Producer;
import org.apache.camel.ProducerTemplate;
import org.apache.camel.ServiceStatus;
import org.apache.camel.attachment.AttachmentMessage;
import org.apache.camel.attachment.DefaultAttachment;
import org.apache.camel.component.mail.DefaultJavaMailSender;
import org.apache.camel.component.mail.JavaMailSender;
import org.apache.camel.component.mail.MailConverters;
import org.apache.camel.component.mail.MailMessage;
import org.apache.camel.component.mail.MailSorter;
import org.jvnet.mock_javamail.Mailbox;

@Path("/mail")
@ApplicationScoped
public class CamelResource {

@Inject
ProducerTemplate template;
ProducerTemplate producerTemplate;

@Inject
ConsumerTemplate consumerTemplate;

// @Inject
Store store;

@Inject
Expand All @@ -74,30 +76,75 @@ public class CamelResource {
@Named("mailReceivedMessages")
List<Map<String, Object>> mailReceivedMessages;

@Path("/route/{route}")
@Path("/send")
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
public String route(String statement, @PathParam("route") String route) throws Exception {
return template.requestBody("direct:" + route, statement, String.class);
public void sendMail(
@QueryParam("subject") String subject,
@QueryParam("from") String from,
@QueryParam("to") String to,
String body) {

producerTemplate.send("direct:sendMail", exchange -> {
org.apache.camel.Message message = exchange.getMessage();
message.setHeader("Subject", subject);
message.setHeader("From", from);
message.setHeader("To", to);
message.setBody(body);
});
}

@Path("/sendWithHeaders/{direct}/{msg}")
@Path("/send/attachment/{fileName}")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void sendWithHeaders(Map<String, Object> headers, @PathParam("direct") String direct, @PathParam("msg") String msg)
throws Exception {
template.requestBodyAndHeaders("direct:" + direct, msg, headers);
@Consumes(MediaType.TEXT_PLAIN)
public void sendMailWithAttachment(
@PathParam("fileName") String fileName,
@QueryParam("subject") String subject,
@QueryParam("from") String from,
@QueryParam("to") String to,
String body) {

producerTemplate.send("direct:sendMail", exchange -> {
AttachmentMessage in = exchange.getMessage(AttachmentMessage.class);

DefaultAttachment attachment;
if (fileName.startsWith("/")) {
attachment = new DefaultAttachment(new FileDataSource(fileName));
} else {
attachment = new DefaultAttachment(
new ByteArrayDataSource(
Thread.currentThread().getContextClassLoader().getResourceAsStream("data/" + fileName),
"image/jpeg"));
}

in.addAttachmentObject(fileName, attachment);

org.apache.camel.Message message = exchange.getMessage();
message.setHeader("Subject", subject);
message.setHeader("From", from);
message.setHeader("To", to);
message.setBody(body);
});
}

@Path("/mimeMultipartUnmarshalMarshal")
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
public String mimeMultipartUnmarshalMarshal(String body) {
return producerTemplate.requestBody("direct:mimeMultipartUnmarshalMarshal", body, String.class);
}

@Path("/mimeMultipartMarshal/{fileName}/{fileContent}")
@POST
@Consumes(MediaType.TEXT_PLAIN)
@Produces(MediaType.TEXT_PLAIN)
public String mimeMultipart(String body, @PathParam("fileName") String fileName,
@PathParam("fileContent") String fileContent) throws Exception {
public String mimeMultipart(
@PathParam("fileName") String fileName,
@PathParam("fileContent") String fileContent,
String body) {

return template.request("direct:mimeMultipartMarshal", e -> {
return producerTemplate.request("direct:mimeMultipartMarshal", e -> {
AttachmentMessage in = e.getMessage(AttachmentMessage.class);
in.setBody(body);
in.setHeader(Exchange.CONTENT_TYPE, "text/plain;charset=iso8859-1;other-parameter=true");
Expand All @@ -111,28 +158,7 @@ public String mimeMultipart(String body, @PathParam("fileName") String fileName,
}).getMessage().getBody(String.class);
}

@Path("/send")
@POST
@Consumes(MediaType.APPLICATION_JSON)
public void send(List<String> messages) throws Exception {
JavaMailSender sender = new DefaultJavaMailSender();
store.connect("localhost", "jones", "secret");
Folder folder = store.getFolder("INBOX");
folder.open(Folder.READ_WRITE);
folder.expunge();

// inserts new messages
Message[] msgs = new Message[messages.size()];
int i = 0;
for (String msg : messages) {
msgs[i] = new MimeMessage(sender.getSession());
msgs[i].setHeader("Message-ID", "" + i);
msgs[i++].setText(msg);
}
folder.appendMessages(msgs);
folder.close(true);
store.close();
}
// ------------------------------------------------

@Path("/getReceived")
@GET
Expand All @@ -147,9 +173,8 @@ public List<Map<String, Object>> getReceived() {
public List<Map<String, Object>> getReceivedAsString() throws MessagingException, IOException {
List<Map<String, Object>> result = new LinkedList();
for (Map<String, Object> email : mailReceivedMessages) {
Message mm = ((MailMessage) email.get("body")).getMessage();
InputStream is = MailConverters.toInputStream(mm);
result.add(Collections.singletonMap("body", (Object) camelContext.getTypeConverter().convertTo(String.class, is)));
InputStream is = (InputStream) email.get("convertedStream");
result.add(Collections.singletonMap("body", camelContext.getTypeConverter().convertTo(String.class, is)));
}
mailReceivedMessages.clear();
return result;
Expand All @@ -160,7 +185,6 @@ public List<Map<String, Object>> getReceivedAsString() throws MessagingException
@GET
public void clear() {
mailReceivedMessages.clear();
Mailbox.clearAll();
}

@GET
Expand All @@ -177,34 +201,24 @@ public String controlRoute(@PathParam("routeId") String routeId, @PathParam("ope
break;
case "status":
return camelContext.getRouteController().getRouteStatus(routeId).name();

}
return null;
}

@GET
@Path("/sendAttachment/{filename}")
public void sendAttachment(@PathParam("filename") String filename) throws Exception {
Endpoint endpoint = camelContext.getEndpoint("smtp://james@mymailserver.com?password=secret");

// create the exchange with the mail message that is multipart with a file and a Hello World text/plain message.
Exchange exchange = endpoint.createExchange();
AttachmentMessage in = exchange.getIn(AttachmentMessage.class);
in.setBody("Sending " + filename + "!");
DefaultAttachment att = new DefaultAttachment(
new ByteArrayDataSource(Thread.currentThread().getContextClassLoader().getResourceAsStream("data/" + filename),
"image/jpeg"));
att.addHeader("Content-Description", "some sample content");
in.addAttachmentObject(filename, att);

// create a producer that can produce the exchange (= send the mail)
Producer producer = endpoint.createProducer();
// start the producer
producer.start();
// and let it go (processes the exchange by sending the email)
producer.process(exchange);

producer.stop();
@Path("/stopConsumers")
@Produces(MediaType.TEXT_PLAIN)
public void stopConsumers()
throws Exception {
Arrays.stream(CamelRoute.Routes.values()).forEach(r -> {
try {
if (camelContext.getRouteController().getRouteStatus(r.name()) == ServiceStatus.Started) {
camelContext.getRouteController().stopRoute(r.name());
}
} catch (Exception e) {
//ignore
}
});
}

@Path("/sort")
Expand Down

0 comments on commit e3c1696

Please sign in to comment.