29行でメール送信サービスを作る - Apache Camel


# サンプル概要

* 本文セミコロン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:....に書き換えるよい

# サーバーっぽく起動する所まで

```java: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


```java: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

# メール送信

```java: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

メールの設定がまぁまぁ稼いだな。


# 最後にライブラリの設定

```xml: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>
```