本記事は古くなっており、2015年7月現在ではSendGridから公式のライブラリが出ていますので、合わせてご確認下さい。kikutaro777.hatenablog.com
先日、前に一緒に仕事していた後輩がこんな発表してました。
途中からSendGridの話。
1日200通のメール送信までは無料プランで使えるとのことで、登録(^^)
で、せっかくなのでJavaでSendGrid経由にメール送信してみました。
いくつかつまづいた点があったので、それを含めてメモ。
SendGridのアカウント作成
なにはともあれメール送信するためのアカウントを作成します。
2.ユーザ登録(Sing Up)
トップページの右上に「Sign Up」とあるのでクリックします
価格プランのページに遷移します。トップには有償のプランが並んでます。
画面の下の方へ移動します。
「Free」の記述がある部分の「Get Started Now」をクリックします。
ユーザ登録のページが表示されるので一通り入力します。
WebSiteは本来メール送信に使うサイトなどを書くようですが、自分の場合は単にAPIを触ってみたいだけ…だったので、とりあえずブログのURL入れました。
入力後「Create My Account」ボタンを押して、完了ページが出ればOKです。
アクティベーション
上記で登録したメールアドレス宛にSendGrid Support(help@sendgrid.com)からメールが来ます。
「Activate Your Account」を押します。
その後、プロフィール情報なども入れて完了です。
provision待ちでハマった所
provision = セットアップする、使えるように設定する。とのこと(^^;
http://eow.alc.co.jp/search?q=provision
登録情報はサポート側でチェックしているらしく、実際にメール送信できる状態になるまで若干の時間がかかるようです。通常は数時間で完了になるようです。
が
私の場合は、provisioning失敗でした(^^;
登録した数時間後に「SendGrid - Account Provisioning Failure」というタイトルでメールが来ていました。
(実はこれに気が付かず、数日待っていた…ので、皆さんprovision待ちが長い場合は、登録したメールを細かくチェックしましょう!)
全部英語であれなんですが、要はどういう目的で使おうとしてるのか不明瞭など、上記メールで挙げられている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で成功でした。
というわけで、いったん確認するのがベターかも。
試した環境は
- 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);
props.put("mail.smtp.auth", "true");
Authenticator auth = new SMTPAuthenticator();
Session mailSession = Session.getDefaultInstance(props, auth);
Transport transport = mailSession.getTransport();
MimeMessage message = new MimeMessage(mailSession);
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);
}
}
}
で、実行した結果
別途、会社のメールとかに送って、textでみると
おー。できた。
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メールに送った結果
同様にテキストで確認すると
送信したメール数の確認など
SendGridにログインした画面で今日何通送ったか、残りどれくらいか、などステータスが確認できます。
今回はメール送信だけでしたが、WebAPIでは他にも色々機能があるみたいです(^^)