サンプル概要
- 本文セミコロン15個 + import, package文 セミコロン14個 = 29行(カウントひどい)
- API(HTTP REST形式)で受け付ける
- POST /api/mail/{to}
- httpメソッドにPOSTを使うとメールを出してる感
- 受け付けたらメールを送信する。(smtpでメールサーバに送信)
- 送信結果を返す
- {"status": "success"}
- SpringBootを使う(java -jar で起動できるということ)
- smtp over SSLの時はsmtp:...の所をsmtps:....に書き換えるよい
サーバーっぽく起動する所まで
AppMain.java
package suburi.camel.mailservice;
import org.apache.camel.spring.boot.CamelSpringBootApplicationController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppMain {
public static void main(String[] args) {
SpringApplication.run(AppMain.class, args)
.getBean(CamelSpringBootApplicationController.class).run();
}
}
以上。
これだけのコードで起動すると起動しっぱなしで止まらない状態になる。
本文中のセミコロンは1個
参考
http://camel.apache.org/spring-boot.html
RESTで受けれるようにしておく
HTTPで待受して、受け取るとメールが送信されるようにする。
例: http://localhost:18181/api/mail/user_name
RestRoute.java
package suburi.camel.mailservice;
import org.apache.camel.builder.RouteBuilder;
import org.apache.camel.model.rest.RestBindingMode;
import org.springframework.stereotype.Component;
@Component
public class RestRoute extends RouteBuilder {
@Override
public void configure() throws Exception {
// httpサーバの設定
restConfiguration().component("netty4-http")
.bindingMode(RestBindingMode.json)
.host("0.0.0.0").port(18181);
rest("/api/mail")
// HTTP POST
.post("/{to}")
.to(SendMailRoute.IN);
}
}
camel使って書いたけど、springのrestで受けても良いね
本文中のセミコロンは HTTPサーバ1個, REST設定1個
@Componentを忘れないように
参考
http://camel.apache.org/rest-dsl.html
メール送信
SendMailRoute.java
package suburi.camel.mailservice;
import org.apache.camel.Message;
import org.apache.camel.builder.RouteBuilder;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class SendMailRoute extends RouteBuilder {
public static final String IN = "direct://SendMailRoute";
@Override
public void configure() throws Exception {
from(IN)
.process(exchange -> {
Message in = exchange.getIn();
// "to"を受け取る
// 今回は前段のルートがRESTでtoを設定していたが、他のルートで
// "to"を設定しても良い。とりあえず"to"を受け取って処理する
String to = in.getHeader("to", String.class);
// 不具合防止の為に不要なヘッダは削除しておく
in.removeHeaders("*");
// 送信先メールアドレス
in.setHeader("To", to + "@myexamplecompany5.com");
// 送信元メールアドレス
in.setHeader("From", "noreply@myexamplecompany5.com");
// メールのタイトル
in.setHeader("Subject", "メールのタイトルはここ");
// メールの本文
in.setBody("テストメールです。\n" +
"受信したら破棄してくださいね。\n");
})
// メールの送信開始!
.to("smtp:smtp.myexamplecompany5.com:99999?username=xxxxxxxxx&password=yyyyyyyyyyy")
// 不要なヘッダは不具合防止の為に削除しておく
.removeHeaders("*")
// 返却値の作成
.process(exchange -> {
Map map = new HashMap();
map.put("status", "success");
exchange.getIn().setBody(map);
});
}
}
本文中のセミコロンは ルート設定 1個, メールの設定 7個, 結果返却 3個
参考
http://camel.apache.org/mail.html
メールの設定がまぁまぁ稼いだな。
最後にライブラリの設定
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>suburi.camel</groupId>
<artifactId>mailservice</artifactId>
<version>1</version>
<properties>
<java.version>1.8</java.version>
<camel.version>2.17.2</camel.version>
</properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-parent</artifactId>
<version>${camel.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- spring boot -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-spring-boot-starter</artifactId>
</dependency>
<!-- REST -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-netty4-http</artifactId>
</dependency>
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-jackson</artifactId>
</dependency>
<!-- mail -->
<dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-mail</artifactId>
</dependency>
</dependencies>
</project>