Skip to content

Commit b6be759

Browse files
Email Delivery (#71)
* Email Delivery --------- Signed-off-by: Anders Swanson <anders.swanson@oracle.com>
1 parent 135dcd8 commit b6be759

File tree

25 files changed

+772
-4
lines changed

25 files changed

+772
-4
lines changed

docs/src/main/asciidoc/email.adoc

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
// Copyright (c) 2024, Oracle and/or its affiliates.
2+
// Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
3+
4+
[#email-delivery]
5+
== Email Delivery
6+
7+
https://docs.oracle.com/en-us/iaas/Content/Email/home.htm[Email Delivery] provides an implementation of the Spring Mail interface, providing MailSender and JavaMailSender beans to send email using OCI Email Delivery.
8+
9+
Maven coordinates:
10+
11+
[source,xml]
12+
----
13+
<dependency>
14+
<groupId>com.oracle.cloud.spring</groupId>
15+
<artifactId>spring-cloud-oci-starter-email</artifactId>
16+
</dependency>
17+
----
18+
19+
Gradle coordinates:
20+
21+
[source,subs="normal"]
22+
----
23+
dependencies {
24+
implementation("com.oracle.cloud.spring:spring-cloud-oci-starter-email")
25+
}
26+
----
27+
28+
=== Configuring Email Delivery
29+
30+
Email Delivery uses the Spring Mail SMTP configuration properties to configure MailSender and JavaMailSender beans. https://docs.oracle.com/en-us/iaas/Content/Email/Reference/gettingstarted_topic-create-smtp-credentials.htm#top[Create SMTP credentials for OCI] and use these to configure your username and password in Spring.
31+
32+
Your OCI SMTP endpoint can be found on the OCI Email Delivery Console.
33+
34+
[source,yaml]
35+
----
36+
spring:
37+
mail:
38+
host: ${OCI_SMTP_HOST}
39+
username: ${OCI_SMTP_USERNAME}
40+
password: ${OCI_SMTP_PASSWORD}
41+
# Port 25 or 587 may be used. 587 is default.
42+
port: 587
43+
----
44+
45+
=== Using MailSender
46+
47+
For simple emails, use the MailSender interface. The following sample shows how to send an email with the MailSender interface.
48+
49+
[source,java]
50+
----
51+
@Service
52+
public class EmailService {
53+
private final MailSender mailSender;
54+
55+
public EmailService(@Qualifier("ociMailSender") MailSender mailSender) {
56+
this.mailSender = mailSender;
57+
}
58+
59+
public void sendSimpleMail(
60+
String from,
61+
String to,
62+
String subject,
63+
String text
64+
) {
65+
SimpleMailMessage message = new SimpleMailMessage();
66+
message.setFrom(from);
67+
message.setTo(to);
68+
message.setSubject(subject);
69+
message.setText(text);
70+
mailSender.send(message);
71+
}
72+
}
73+
----
74+
75+
=== Using JavaMailSender
76+
77+
For more complex emails, such as those with attachments, use the JavaMailSender interface. The followign example shows how to send an email with the JavaMailSender API.
78+
79+
[source,java]
80+
----
81+
@Service
82+
public class EmailService {
83+
private final JavaMailSender javaMailSender;
84+
85+
public EmailService(@Qualifier("ociJavaMailSender") JavaMailSender javaMailSender) {
86+
this.javaMailSender = javaMailSender;
87+
}
88+
89+
public void sendJavaMail(
90+
String from,
91+
String to,
92+
String subject,
93+
String text,
94+
File fileAttachment
95+
) throws MessagingException {
96+
MimeMessage message = javaMailSender.createMimeMessage();
97+
Multipart multipartContent = new MimeMultipart();
98+
MimeBodyPart textContent = new MimeBodyPart();
99+
textContent.setContent(text, "text/html");
100+
multipartContent.addBodyPart(textContent);
101+
102+
MimeBodyPart attachmentContent = new MimeBodyPart();
103+
DataSource source = new FileDataSource(fileAttachment);
104+
attachmentContent.setDataHandler(new DataHandler(source));
105+
attachmentContent.setFileName(fileAttachment.getName());
106+
multipartContent.addBodyPart(attachmentContent);
107+
108+
message.setFrom(from);
109+
message.setRecipients(Message.RecipientType.TO, InternetAddress.parse(to));
110+
message.setSubject(subject);
111+
message.setContent(multipartContent);
112+
javaMailSender.send(message);
113+
}
114+
}
115+
----
116+
117+
=== Sample
118+
119+
A sample application provided https://github.com/oracle/spring-cloud-oci/tree/main/spring-cloud-oci-samples/spring-cloud-oci-email-sample[here] contains examples that demonstrate the usage of Spring Cloud OCI Email module.

docs/src/main/asciidoc/index.adoc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@ include::adb.adoc[]
1818

1919
include::core.adoc[]
2020

21+
include::email.adoc[]
22+
2123
include::function.adoc[]
2224

2325
include::logging.adoc[]

pom.xml

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,13 +67,16 @@ Licensed under the Universal Permissive License v 1.0 as shown at https://oss.or
6767
<module>spring-cloud-oci-streaming</module>
6868
<module>spring-cloud-oci-vault</module>
6969
<module>spring-cloud-oci-queue</module>
70+
<module>spring-cloud-oci-email</module>
7071
<module>docs</module>
7172
</modules>
7273

7374
<properties>
7475
<spring-cloud-oci-dependencies.version>${project.version}</spring-cloud-oci-dependencies.version>
7576
<spring-cloud-dependencies.version>2023.0.2</spring-cloud-dependencies.version>
7677
<spring-boot-dependencies.version>3.2.7</spring-boot-dependencies.version>
78+
<spring-framework.version>6.1.10</spring-framework.version>
79+
<jakarta-mail.version>2.0.3</jakarta-mail.version>
7780
<oci-sdk.version>3.44.2</oci-sdk.version>
7881
<spring-boot-maven-plugin.version>3.2.5</spring-boot-maven-plugin.version>
7982
<maven.compiler.source>17</maven.compiler.source>
@@ -110,6 +113,11 @@ Licensed under the Universal Permissive License v 1.0 as shown at https://oss.or
110113
<type>pom</type>
111114
<scope>import</scope>
112115
</dependency>
116+
<dependency>
117+
<groupId>com.oracle.oci.sdk</groupId>
118+
<artifactId>oci-java-sdk-email</artifactId>
119+
<version>${oci-sdk.version}</version>
120+
</dependency>
113121
<dependency>
114122
<groupId>com.oracle.oci.sdk</groupId>
115123
<artifactId>oci-java-sdk-objectstorage-extensions</artifactId>
@@ -160,6 +168,18 @@ Licensed under the Universal Permissive License v 1.0 as shown at https://oss.or
160168
<type>pom</type>
161169
<scope>import</scope>
162170
</dependency>
171+
<dependency>
172+
<groupId>org.springframework</groupId>
173+
<artifactId>spring-context-support</artifactId>
174+
<version>${spring-framework.version}</version>
175+
<scope>compile</scope>
176+
</dependency>
177+
<dependency>
178+
<groupId>org.eclipse.angus</groupId>
179+
<artifactId>jakarta.mail</artifactId>
180+
<version>${jakarta-mail.version}</version>
181+
<scope>compile</scope>
182+
</dependency>
163183
</dependencies>
164184
</dependencyManagement>
165185

spring-cloud-oci-autoconfigure/pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,11 @@ Licensed under the Universal Permissive License v 1.0 as shown at https://oss.or
115115
<artifactId>spring-cloud-oci-vault</artifactId>
116116
<optional>true</optional>
117117
</dependency>
118+
<dependency>
119+
<groupId>com.oracle.cloud.spring</groupId>
120+
<artifactId>spring-cloud-oci-email</artifactId>
121+
<optional>true</optional>
122+
</dependency>
118123
<dependency>
119124
<groupId>com.oracle.cloud.spring</groupId>
120125
<artifactId>spring-cloud-oci-queue</artifactId>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
** Copyright (c) 2024, Oracle and/or its affiliates.
3+
** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
4+
*/
5+
package com.oracle.cloud.spring.email;
6+
7+
import java.util.Properties;
8+
9+
import jakarta.mail.Session;
10+
import org.springframework.beans.factory.annotation.Qualifier;
11+
import org.springframework.boot.autoconfigure.AutoConfiguration;
12+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
13+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
14+
import org.springframework.context.annotation.Bean;
15+
import org.springframework.mail.MailSender;
16+
import org.springframework.mail.javamail.JavaMailSender;
17+
18+
@AutoConfiguration
19+
@ConditionalOnClass({ EmailDeliveryMailSender.class })
20+
@EnableConfigurationProperties(MailSenderProperties.class)
21+
public class EmailDeliveryAutoConfiguration {
22+
private final MailSenderProperties properties;
23+
24+
public EmailDeliveryAutoConfiguration(MailSenderProperties properties) {
25+
this.properties = properties;
26+
}
27+
28+
@Bean
29+
@Qualifier("ociMailSender")
30+
public MailSender emailDeliveryMailSender(Session session) {
31+
return new EmailDeliveryMailSender(
32+
session,
33+
properties.getHost(),
34+
properties.getUsername(),
35+
properties.getPassword()
36+
);
37+
}
38+
39+
@Bean
40+
@Qualifier("ociJavaMailSender")
41+
JavaMailSender emailDeliveryJavaMailSender(Session session) {
42+
return new EmailDeliveryJavaMailSender(
43+
session,
44+
properties.getHost(),
45+
properties.getUsername(),
46+
properties.getPassword()
47+
);
48+
}
49+
50+
@Bean
51+
Session session() {
52+
Properties props = new Properties();
53+
props.put("mail.transport.protocol", "smtp");
54+
props.put("mail.smtp.port", String.valueOf(properties.getPort()));
55+
props.put("mail.smtp.auth", "true");
56+
props.put("mail.smtp.auth.login.disable", "true");
57+
props.put("mail.smtp.starttls.enable", "true");
58+
props.put("mail.smtp.starttls.required", "true");
59+
return Session.getDefaultInstance(props);
60+
}
61+
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
** Copyright (c) 2024, Oracle and/or its affiliates.
3+
** Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl/
4+
*/
5+
package com.oracle.cloud.spring.email;
6+
7+
8+
import java.util.Objects;
9+
10+
import org.springframework.boot.context.properties.ConfigurationProperties;
11+
import org.springframework.util.StringUtils;
12+
13+
@ConfigurationProperties(prefix = MailSenderProperties.PREFIX)
14+
public class MailSenderProperties {
15+
public static final String PREFIX = "spring.mail";
16+
17+
private String host;
18+
private String username;
19+
private String password;
20+
private Integer port;
21+
22+
public String getHost() {
23+
return host;
24+
}
25+
26+
public void setHost(String host) {
27+
this.host = host;
28+
}
29+
30+
public String getUsername() {
31+
return username;
32+
}
33+
34+
public void setUsername(String username) {
35+
this.username = username;
36+
}
37+
38+
public String getPassword() {
39+
return password;
40+
}
41+
42+
public void setPassword(String password) {
43+
this.password = password;
44+
}
45+
46+
public Integer getPort() {
47+
return Objects.requireNonNullElse(port, 587);
48+
}
49+
50+
public void setPort(Integer port) {
51+
this.port = port;
52+
}
53+
}

spring-cloud-oci-autoconfigure/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,4 @@ com.oracle.cloud.spring.queue.QueueAutoConfiguration
1010
com.oracle.cloud.spring.genai.GenAIAutoConfiguration
1111
com.oracle.cloud.spring.vault.VaultAutoConfiguration
1212
com.oracle.cloud.spring.adb.AutonomousDbAutoConfiguration
13+
com.oracle.cloud.spring.email.EmailDeliveryAutoConfiguration

spring-cloud-oci-dependencies/pom.xml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@
9797
<artifactId>spring-cloud-oci-queue</artifactId>
9898
<version>${project.version}</version>
9999
</dependency>
100+
<dependency>
101+
<groupId>com.oracle.cloud.spring</groupId>
102+
<artifactId>spring-cloud-oci-email</artifactId>
103+
<version>${project.version}</version>
104+
</dependency>
100105
<dependency>
101106
<groupId>com.oracle.cloud.spring</groupId>
102107
<artifactId>spring-cloud-oci-starter</artifactId>
@@ -147,6 +152,11 @@
147152
<artifactId>spring-cloud-oci-starter-queue</artifactId>
148153
<version>${project.version}</version>
149154
</dependency>
155+
<dependency>
156+
<groupId>com.oracle.cloud.spring</groupId>
157+
<artifactId>spring-cloud-oci-starter-email</artifactId>
158+
<version>${project.version}</version>
159+
</dependency>
150160
</dependencies>
151161
</dependencyManagement>
152162

0 commit comments

Comments
 (0)