[Java] メール(javax.mail)を発送する方法


Devlopment note / Java    作成日付 : 2020/03/05 20:07:49   修正日付 : 2020/03/05 20:07:49

こんにちは。明月です。


この投稿はJavaでメール(javax.mail)を発送する方法に関する説明です。

プログラム上で我々がメール発送することは様々のところで使えることができます。会員登録する時に登録認証やパスワード探すことなどがあるし、システム上で様々なアラームメッセージをメール発送することもできます。

最近はsnsがたくさんあるのでsnsでメッセージを発送する方法もよく使いますが、それでもまだ、メール発送機能はなくならないでしょう。


私はgoogle mail(gmail)を通ってメールを発送する例です。

Google mail - https://support.google.com/a/answer/176600?hl=ja


先にクロームに接続して右上のアカウント管理に行きましょう。(ログインができなかった状況なら先にログインしてから。)


アカウント管理に移動して安全性の低いアプリのアクセスのタブに移動します。


安全性の低いアプリの許可を有効にします。

このチェックをしないと外部からグーグルメールを使用できないようにすることです。なので、idやpwの漏れがなければそんなに問題はありません。


Javaでメールを発送するソースを作成するためにpom.xmlでメールライブラリを登録しなければならないです。

レポジトリ - https://mvnrepository.com/artifact/javax.mail/mail

<!-- https://mvnrepository.com/artifact/javax.mail/mail -->
<dependency>
  <groupId>javax.mail</groupId>
  <artifactId>mail</artifactId>
  <version>1.4.7</version>
</dependency>


メール発送はconsoleに作成しても問題ないので、consoleで作成しましょう。

import java.io.File;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.DataSource;
import javax.activation.FileDataSource;
import javax.mail.Address;
import javax.mail.Authenticator;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.AddressException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
// 開始関数は下にあります。
public class Program implements Runnable {
  // mainからrun関数を呼び出すとメール発送を開始します。
  @Override
  public void run() {
    try {
      // メール環境変数設定する。
      Properties props = new Properties();
      // メールプロトコールはgmailを利用することなのでsmtpを使用する。
      props.setProperty("mail.transport.protocol", "smtp");
      // メールホストのアドレスを設定する。
      props.setProperty("mail.host", "smtp.gmail.com");
      // ID, Password設定が必要だ。
      props.put("mail.smtp.auth", "true");
      // portは465だ。
      props.put("mail.smtp.port", "465");
      // sslを使う場合、設定する。
      props.put("mail.smtp.socketFactory.port", "465");
      props.put("mail.smtp.socketFactory.class", "javax.net.ssl.SSLSocketFactory");
      props.put("mail.smtp.socketFactory.fallback", "false");
      props.setProperty("mail.smtp.quitwait", "false");
      // idとpasswordを設定してsessionを生成する。
      Session session = Session.getInstance(props, new Authenticator() {
        protected PasswordAuthentication getPasswordAuthentication() {
          return new PasswordAuthentication("id", "password");
        }
      });
      // デバックモード
      session.setDebug(true);
      // メールメッセージを作るためにメッセージクラスを生成する。
      MimeMessage message = new MimeMessage(session);
      // 送信者設定
      message.setFrom(getAddress("nowonbun@gmail.com"));
      // 宛先設定
      message.addRecipients(Message.RecipientType.TO, getAddresses("nowonbun@gmail.com,nowonbun@gmail.com"));
      // CC設定
      message.addRecipients(Message.RecipientType.CC, getAddresses("nowonbun@gmail.com"));
      // BCC設定
      message.addRecipients(Message.RecipientType.BCC, getAddresses("nowonbun@gmail.com"));
      
      // メールタイトルを設定する。
      message.setSubject("Test Mail");
      // メール内容を設定するためにMimeクラスを設定する。
      message.setContent(new MimeMultipart());
      
      // メール内容を作成するためにMultipartクラスを受け取る。(上のnew MimeMultipart()で割り当てしたクラス)
      Multipart mp = (Multipart) message.getContent();
      // html形式で本文を作成してバウンダリーに入れる。
      mp.addBodyPart(getContents("<html><head></head><body>Hello Test<br><img src=\"cid:image\" ></body></html>"));
      // 添付ファイルを追加する。
      mp.addBodyPart(getFileAttachment("test.xlsx"));
      // イメージファイルを追加してcontextIdを設定する。contextIdは上の本文内容のcidでリンクの設定が可能。
      mp.addBodyPart(getImage("capture.png", "image"));
      // メールを送信する。
      Transport.send(message);
    } catch (Throwable e) {
      e.printStackTrace();
    }
  }
  // イメージをローカルから読み込んでBodyPartクラスに生成する。(バウンダリー変換)
  private BodyPart getImage(String filename, String contextId) throws MessagingException {
    // ファイルを読み込んでBodyPartで受け取る。
    BodyPart mbp = getFileAttachment(filename);
    if (contextId != null) {
      // ContextId設定
      mbp.setHeader("Content-ID", "<" + contextId + ">");
    }
    return mbp;
  }
  // ファイルをローカルから読み込んでBodyPartクラスを生成する。(バウンダリー変換)
  private BodyPart getFileAttachment(String filename) throws MessagingException {
    // BodyPart生成
    BodyPart mbp = new MimeBodyPart();
    // ファイルから読み込んでBodyPartに設定(バウンダリー変換)
    File file = new File(filename);
    DataSource source = new FileDataSource(file);
    mbp.setDataHandler(new DataHandler(source));
    mbp.setDisposition(Part.ATTACHMENT);
    mbp.setFileName(file.getName());
    return mbp;
  }
  // メールの本文内容設定
  private BodyPart getContents(String html) throws MessagingException {
    BodyPart mbp = new MimeBodyPart();
    // setTextを利用する場合、一般テキスト内容で設定する。
    // mbp.setText(html);
    // html形式に設定する。
    mbp.setContent(html, "text/html; charset=utf-8");
    return mbp;
  }
  // StringになっているメールアドレスをAddressクラスに変換する。
  private Address getAddress(String address) throws AddressException {
    return new InternetAddress(address);
  }
  // Stringで複数のメールアドレスをコンマ(,)の区切りでAddress array形に変換
  private Address[] getAddresses(String addresses) throws AddressException {
    String[] array = addresses.split(",");
    Address[] ret = new Address[array.length];
    for (int i = 0; i < ret.length; i++) {
      ret[i] = getAddress(array[i]);
    }
    return ret;
  }
  // 開始関数Programを生成してrun関数を実装する。 
  public static void main(String[] args) {
    Program p = new Program();
    p.run();
  }
}


私がsessionのデバックモードに設定しましたのでメールサーバと送受信されるメッセージの状態が表示されます。もし、プロトコールで追加する内容があればこのログを見て追加すればよいです。


メールを発送しましたので、自分のメールトレイにメールがあるかどうか確認しましょう。


メールの送信がよくできました。


ここまでJavaでメール(javax.mail)を発送する方法に関する説明でした。


ご不明なところや間違いところがあればコメントしてください。

最新投稿