似非 FeedMail - MailOutput

【注意】ここで紹介しているプログラムは、たまたま名前がカブってますが、UnderDone さんによるサービス FeedMail とはまったくの別物です。以下の内容について、UnderDone さんに問い合わせたりしないようにお願いします。

自作版「RSS→メール」アプリケーションの 3 クラス目。メールを発信する部分。JavaMail にほとんどおまかせ。その部分も、田中宏和による下記ページからのコピペなので、僕はほとんど何もしてない。もはや自作とさえ言えないレベルかも。

JavaHello World JavaMail(SMTP)編
http://www.hellohiro.com/javamail.htm

ちなみに、自分の使ってる環境では SMTP 発信にパスワード認証が必要だったので、そのように作ってある。パスワード認証を使用しない環境では、このままだと動かないはず。

import java.io.IOException;
import java.util.Properties;
import java.util.Date;
import javax.mail.Session;
import javax.mail.PasswordAuthentication;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.Transport;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.InternetAddress;

public class MailOutput {
	String smtpHost;
	String senderAddress;
	String senderName;
	String recipientAddress;
	String mailTitle;
	volatile String smtpUserID;
	volatile String smtpPassword;
	
	public MailOutput(Properties config) {
		// TODO: リフレクションで
		this.smtpHost = config.getProperty("smtp.host");
		this.senderAddress = config.getProperty("sender.address");
		this.senderName = config.getProperty("sender.name");
		this.recipientAddress = config.getProperty("recipient.address");
		this.mailTitle = config.getProperty("mail.title");
		
		this.smtpUserID = config.getProperty("smtp.userid");
		this.smtpPassword = config.getProperty("smtp.password");
	}
	
	public void send(String text) throws IOException, FeedMailException {
		try {
			Properties props = System.getProperties();
			props.setProperty("mail.smtp.auth", "true");
			// SMTPサーバーのアドレスを指定
			props.put("mail.smtp.host", smtpHost);
			PasswordAuthenticator auth = new PasswordAuthenticator();
			auth.setPasswordAuthentication(new PasswordAuthentication(this.smtpUserID, this.smtpPassword));
			Session session = Session.getDefaultInstance(props, auth);
			session.setDebug(true);
			MimeMessage mimeMessage = new MimeMessage(session);
			// 送信元メールアドレスと送信者名を指定
			mimeMessage.setFrom(new InternetAddress(senderAddress, senderName, "iso-2022-jp"));
			// 送信先メールアドレスを指定
			mimeMessage.setRecipients(Message.RecipientType.TO, recipientAddress);
			// メールのタイトルを指定
			mimeMessage.setSubject(mailTitle,"iso-2022-jp");
			// メールの内容を指定
			mimeMessage.setText(text, "iso-2022-jp");
			// メールの形式を指定
			mimeMessage.setHeader("Content-Type", "text/plain");
			// 送信日付を指定
			mimeMessage.setSentDate(new Date());
			// 送信します
			Transport.send(mimeMessage);
		} catch (IOException e) {
			throw e;
		} catch (Exception e) {
			throw new FeedMailException(e);
		}
	}
	
	static class PasswordAuthenticator extends Authenticator {
		private PasswordAuthentication authentication;
		
		public void setPasswordAuthentication(PasswordAuthentication authentication) {
			this.authentication = authentication;
		}
		protected PasswordAuthentication getPasswordAuthentication() {
			System.out.println("auth>> " + authentication.getUserName() + authentication.getPassword());
			return this.authentication;
		}
	}
}