Challenge Engineer Life !

エンジニア人生を楽しみたい!仕事や趣味で学んだ技術的なことを書いていくブログです。

JavaFXとSendGridで簡易送信メーラーSendGridFXを作る!

少し前にSendGridへ登録したのですが、結構放置してました(^^;

登録の流れやJavaで送信する簡易プログラムは前のエントリを参照下さい↓

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

sendgrid4j使うとJavaで簡単にSendGrid経由にメール送れるので何か面白いことできないかなぁ、と思ってたのですが、最近遊んでるJavaFXと合わせてみました。

名付けてSendGridFX!(なにそれ

すごい簡単なプログラムですが、JavaFXのHTMLEditorコンポーネントを使って、SendGrid経由でHTMLメールを送る、というものです(^^;それだけ

画面は以下のような感じで、ラベルとテキストとボタン、そしてHTMLEditorだけの超シンプルな構成です。

f:id:kikutaro777:20131025193729j:plain

宛先とタイトルを入れて、メール内容をHTMLEditorで書きます。

f:id:kikutaro777:20131025193805j:plain

HTMLEditorで

  • フォント色やサイズ、太字・イタリックに変えたり
  • 横罫線入れたり
  • 箇条書き(番号つきも)
  • センタリングや右寄せ

などなどしてみました。

で、送信!!

受信したメーラ(ThunderBird)でみると(本当はメーラもJavaFXで作ってるとかっこいい気も…)

ちゃんとHTMLメール!!(あたりまえっ

f:id:kikutaro777:20131025194056j:plain

せっかくなので、Yahooメール辺りに送って、JavaFXのWebViewからみてみます(^^;

こんなメールを

f:id:kikutaro777:20131025195149j:plain

送信!

JavaFXでWebViewを置いたアプリでYahooのメールをみてみます。

f:id:kikutaro777:20131025195218j:plain

おおー

f:id:kikutaro777:20131025195227j:plain

やはりJavaFX面白い!そしてSendGridも便利そう!

ちなみにSendGridは前に一緒に仕事していた後輩がSendGrid社とパートナーになって最近力を入れていますので興味ある方は是非彼に!ブログも始めたらしい(^^↓

プログラム

NetBeans7.4からJavaFXプロジェクトをMavenで作れるようになったので、sendgrid4jもpom.xml

リポジトリ

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

依存性を書けばOKですね。

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

Maven使えるとやはり楽w

コードはこんなレベルです(^^;JavaFXのコントローラだけですが

package jp.co.hoge.sendgridfx;

import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.web.HTMLEditor;
import jp.co.flect.sendgrid.SendGridClient;
import jp.co.flect.sendgrid.SendGridException;
import jp.co.flect.sendgrid.model.WebMail;

public class SendGridFXController implements Initializable {
    
    //SendGridのSMTPアクセス情報
    private static final String SMTP_AUTH_USER = "hogehoge";
    private static final String SMTP_AUTH_PWD  = "hogehoge";
    
    //送信元の情報
    private static final String MAIL_FROM = "kiku@test.com";
    private static final String MAIL_FROM_NAME = "キクタローテスト";
    
    SendGridClient client;
    
    @FXML
    private HTMLEditor editor;
    
    @FXML
    private TextField textTo;
    
    @FXML
    private TextField textTitle;
    
    @FXML
    private Label message;
    
    @FXML
    private void sendButtonAction(ActionEvent event) {
        try {
            WebMail mail = new WebMail();
            
            //送信元情報
            mail.setFrom(MAIL_FROM);
            mail.setFromName(MAIL_FROM_NAME);
            
            //送信先
            mail.setTo(textTo.getText());
            
            //送信タイトル
            mail.setSubject(textTitle.getText());
            
            //HTMLエディタ入力内容
            mail.setHtml(editor.getHtmlText());
            
            //メール送信
            client.mail(mail);
            
            message.setText("メールの送信に成功しました。");
        } catch (IOException | SendGridException ex) {
            message.setText("メールの送信に失敗しました。");
        }
    }
    
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        client = new SendGridClient(SMTP_AUTH_USER, SMTP_AUTH_PWD);
    }    
}

簡単なメール送信するだけなら、こんなレベルで作れます(^^;

ちなみにJDK8で作っていたのですが、HTMLEditorを使うと実行時に以下のエラーで落ちました…。


Exception in Application start method
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1959)
at com.sun.javafx.scene.web.skin.HTMLEditorSkin$15$1.updateItem(HTMLEditorSkin.java:699)
at com.sun.javafx.scene.web.skin.HTMLEditorSkin$15$1.updateItem(HTMLEditorSkin.java:694)
at javafx.scene.control.ListCell.updateItem(ListCell.java:442)
at javafx.scene.control.ListCell.indexChanged(ListCell.java:320)
at javafx.scene.control.IndexedCell.updateIndex(IndexedCell.java:115)
at com.sun.javafx.scene.control.skin.VirtualFlow.setCellIndex(VirtualFlow.java:1730)
at com.sun.javafx.scene.control.skin.VirtualFlow.getCell(VirtualFlow.java:1627)
//略
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:491)
//略
Caused by: java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:868)
at com.sun.javafx.application.LauncherImpl.access$000(LauncherImpl.java:55)
at com.sun.javafx.application.LauncherImpl$1.run(LauncherImpl.java:157)
at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1959)
at com.sun.javafx.scene.web.skin.HTMLEditorSkin$15$1.updateItem(HTMLEditorSkin.java:699)
at com.sun.javafx.scene.web.skin.HTMLEditorSkin$15$1.updateItem(HTMLEditorSkin.java:694)
at javafx.scene.control.ListCell.updateItem(ListCell.java:442)
//略
at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
at com.sun.glass.ui.win.WinApplication$3$1.run(WinApplication.java:101)
... 1 more
Exception running application jp.co.hoge.sendgridfx.MainApp

JDKというよりmavenまわりなのかな(^^;JDK7にしたら動いたので、とりあえず今回のサンプルはNetBeans7.4とJDK7で作りました。

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