読者です 読者をやめる 読者になる 読者になる

Challenge Java EE !

Java EEを中心に趣味や仕事における開発メモを書いています。

JavaでSendGridを利用したメール送信

SendGrid JavaMail

本記事は古くなっており、2015年7月現在ではSendGridから公式のライブラリが出ていますので、合わせてご確認下さい。kikutaro777.hatenablog.com

先日、前に一緒に仕事していた後輩がこんな発表してました。

途中からSendGridの話。

1日200通のメール送信までは無料プランで使えるとのことで、登録(^^)
で、せっかくなのでJavaでSendGrid経由にメール送信してみました。

いくつかつまづいた点があったので、それを含めてメモ。

SendGridのアカウント作成

なにはともあれメール送信するためのアカウントを作成します。

1.SendGridのサイトへアクセス

http://sendgrid.com/

2.ユーザ登録(Sing Up)

トップページの右上に「Sign Up」とあるのでクリックします
f:id:kikutaro777:20130831110059j:plain

価格プランのページに遷移します。トップには有償のプランが並んでます。
画面の下の方へ移動します。
f:id:kikutaro777:20130831110222j:plain

「Free」の記述がある部分の「Get Started Now」をクリックします。
f:id:kikutaro777:20130831110258j:plain

ユーザ登録のページが表示されるので一通り入力します。
f:id:kikutaro777:20130831112608j:plain
WebSiteは本来メール送信に使うサイトなどを書くようですが、自分の場合は単にAPIを触ってみたいだけ…だったので、とりあえずブログのURL入れました。

入力後「Create My Account」ボタンを押して、完了ページが出ればOKです。
f:id:kikutaro777:20130831110701j:plain

アクティベーション

上記で登録したメールアドレス宛にSendGrid Support(help@sendgrid.com)からメールが来ます。
f:id:kikutaro777:20130831110825j:plain

「Activate Your Account」を押します。
その後、プロフィール情報なども入れて完了です。

provision待ちでハマった所

provision = セットアップする、使えるように設定する。とのこと(^^;
http://eow.alc.co.jp/search?q=provision

登録情報はサポート側でチェックしているらしく、実際にメール送信できる状態になるまで若干の時間がかかるようです。通常は数時間で完了になるようです。

私の場合は、provisioning失敗でした(^^;

登録した数時間後に「SendGrid - Account Provisioning Failure」というタイトルでメールが来ていました。
(実はこれに気が付かず、数日待っていた…ので、皆さんprovision待ちが長い場合は、登録したメールを細かくチェックしましょう!)
f:id:kikutaro777:20130831111417j:plain

全部英語であれなんですが、要はどういう目的で使おうとしてるのか不明瞭など、上記メールで挙げられている5つの理由に該当してしまったようです。

provisioning完了になるためには、このメール返信に対して返信すればOKでした。

メール内では必要な修正ポイントとして、登録したメールと登録したWebSiteが同じドメインになるようにしたり、登録したWebSiteの中にSendGridの文字を埋めたり、と書いてあるのですが、私の場合は、とりあえず正直ベースに「Javaやってて、API叩いてみたいだけなんだ」と英語で返信したら、OKになりました(^^)

さて、これでやっとこメール送信できる状態になりました。

JavaでSendGrid経由にメール送信

方法は色々ありそうですが、とりあえず以下2つ試しました。

  • JavaMail(SMTPベース)
  • sendgrid4j(WebAPIベース)

JavaMail利用

SendGridのページにJavaでの送信サンプルがあるので、それをベースに試しました。
http://sendgrid.com/docs/Code_Examples/java.html

注意点としては

  • SMTPサーバのポートは事前に確認
  • 日本語を利用する場合は文字コードの設定が必要

かなぁ。

SMTPポート番号の確認

SendGridのサンプルコードにはSMTPポート番号587となっていました。
が、ここで少しハマりました。

以下、SMTP使う場合のポート番号はドキュメントに記述があったのですが

http://sendgrid.com/docs/Integrate/index.html

25も587もダメでした(-_-;

サポートページに以下telnetでの確認があって

Testing your connectivity to Sendgrid's SMTP relay using Telnet
試したところ、2525で成功でした。

f:id:kikutaro777:20130831123713j:plain

というわけで、いったん確認するのがベターかも。

試した環境は

  • Windows 7 Professional 32bit
  • JDK 7
  • NetBeans 7.3
  • JavaMail 1.4.7
  • sendgrid4j 0.9.1

です。

Mavenでプロジェクト作成して、pom.xmlにJavaMailの依存性のみ記述しました。

<dependency>
    <groupId>javax.mail</groupId>
    <artifactId>mail</artifactId>
    <version>1.4.7</version>
</dependency>

で、試したコードは以下です。
SendGridのサンプルと同じでmain含む1つのjavaファイルで記述。

package com.mycompany.sendgridjavasample;

import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;

public class App 
{
    private static final String SMTP_HOST_NAME = "smtp.sendgrid.net";
    private static final String SMTP_AUTH_USER = "hogehoge";
    private static final String SMTP_AUTH_PWD  = "********";
    
    public static void main( String[] args )
    {
        try {
            new App().sendByJavaMail();
        } catch (Exception ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void sendByJavaMail() throws Exception{
        //必要な情報をプロパティへ設定する
        Properties props = new Properties();
        props.put("mail.transport.protocol", "smtp");
        props.put("mail.smtp.host", SMTP_HOST_NAME);
        props.put("mail.smtp.port", 2525); //ポート番号はtelnetなどで確認して設定
        props.put("mail.smtp.auth", "true");
 
        //Authenticatorを継承したクラスを作って(ここではSMTPAuthenticator)
        //getPasswordAuthentication()をオーバーライドして認証情報をセット
        Authenticator auth = new SMTPAuthenticator();
        
        //セッション
        Session mailSession = Session.getDefaultInstance(props, auth);
        
        //デバッグが必要なら以下設定する
        // mailSession.setDebug(true);
        
        //メール送信のため
        Transport transport = mailSession.getTransport();
 
        //メールの情報を設定するため
        MimeMessage message = new MimeMessage(mailSession);
 
        //マルチパート・メディアタイプはalternativeを指定
        Multipart multipart = new MimeMultipart("alternative");
 
        BodyPart part1 = new MimeBodyPart();
        part1.setText("マルチパートのパート1だよ");
 
        BodyPart part2 = new MimeBodyPart();
        part2.setContent("<b>マルチパートのパート2だよ</b>", "text/html;charset=iso-2022-jp");
        
        multipart.addBodyPart(part1);
        multipart.addBodyPart(part2);
        message.setContent(multipart);
        
        //送信元
        message.setFrom(new InternetAddress("kiku@test.com"));
        
        //メールタイトル
        message.setSubject("サブジェクトだよ");
        
        //送信先
        message.addRecipient(Message.RecipientType.TO, new InternetAddress("hogehoge@hoge.co.jp"));
        
        //メール送信
        transport.connect();
        transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
        transport.close();
    }
    
    private class SMTPAuthenticator extends Authenticator {
        @Override
        public PasswordAuthentication getPasswordAuthentication() {
           String username = SMTP_AUTH_USER;
           String password = SMTP_AUTH_PWD;
           return new PasswordAuthentication(username, password);
        }
    }
}

で、実行した結果

f:id:kikutaro777:20130831125049j:plain

f:id:kikutaro777:20130831125121j:plain

別途、会社のメールとかに送って、textでみると

f:id:kikutaro777:20130831125747j:plain

おー。できた。

JavaMailに関しては

辺りがいいのかな。

あとサンプルコードで途中に設定されてるalternativeってなんだっけ…ってことで以下サイトみたり
マルチパート・メディアタイプ
http://www.atmarkit.co.jp/ait/articles/0104/18/news002.html

sendgrid4j利用

後輩に教えてもらったのですが、既にラッパーライブラリがあるそうです(^^)

sendgrid4j
http://oss.flect.co.jp/libs/ja/sendgrid4j.html

WebAPIをラッピングしたライブラリですね。
上記本家のサイトに日本語でそのまま手順あるので、ここで触れる必要ないですが、一応自分で実際に試したものをメモしておく。

Mavenのpom.xmlでリポジトリを指定して

<repositories>
    <repository>
        <id>jp.co.flect</id>
        <name>FLECT maven repository</name>
        <url>http://flect.github.io/maven-repo/</url>
    </repository>
</repositories>

依存性を記述

<dependency>
    <groupId>jp.co.flect</groupId>
    <artifactId>sendgrid4j</artifactId>
    <version>0.9.1</version>
</dependency>

メール送信のコードはシンプル(^^)
とりあえずJavaAPIのと同じようにmainの1つで記述。

package com.mycompany.sendgridjavasample;

import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import jp.co.flect.sendgrid.SendGridClient;
import jp.co.flect.sendgrid.SendGridException;
import jp.co.flect.sendgrid.model.WebMail;

public class App 
{
    private static final String SMTP_AUTH_USER = "hogehoge";
    private static final String SMTP_AUTH_PWD  = "********";
    
    public static void main( String[] args )
    {
        try {
            new App().sendBySendGrid4j();
        } catch (SendGridException | IOException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    
    public void sendBySendGrid4j() throws SendGridException, IOException{
        SendGridClient client = new SendGridClient(SMTP_AUTH_USER, SMTP_AUTH_PWD);
        WebMail mail = new WebMail();
        
        //送信元と送信先の設定
        mail.setFrom("kiku@test.com");
        mail.setTo("hogehoge@hoge.co.jp");
        mail.setFromName("キクタローテスト");
        mail.setToName("キクタローさん");

        //サブジェクトとメール内容
        mail.setSubject("サブジェクトだよ");
        mail.setText("テキストでのメール内容だよ");
        mail.setHtml("HTMLでのメール内容だよ");

        //カテゴリ(タグみたいなもの?)がつけられる
        mail.setCategory("ブログ");
        client.mail(mail);
    }
}

で、Webメールに送った結果

f:id:kikutaro777:20130831132255j:plain

f:id:kikutaro777:20130831132307j:plain

同様にテキストで確認すると

f:id:kikutaro777:20130831132333j:plain

送信したメール数の確認など

SendGridにログインした画面で今日何通送ったか、残りどれくらいか、などステータスが確認できます。

f:id:kikutaro777:20130831132620j:plain

今回はメール送信だけでしたが、WebAPIでは他にも色々機能があるみたいです(^^)

にほんブログ村 IT技術ブログへ
にほんブログ村
にほんブログ村 IT技術ブログ Javaへ
にほんブログ村