LoginSignup
16

More than 5 years have passed since last update.

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

Posted at

サンプル概要

  • 本文セミコロン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>

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16