--- /dev/null
+package hayashi.yuu.tools.mail;\r
+\r
+import java.io.File;\r
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.io.UnsupportedEncodingException;\r
+import java.util.Properties;\r
+import java.util.Vector;\r
+import javax.mail.Address;\r
+import javax.mail.Message;\r
+import javax.mail.MessagingException;\r
+import javax.mail.Session;\r
+import javax.mail.Transport;\r
+import javax.mail.Store;\r
+import javax.mail.internet.InternetAddress;\r
+import javax.mail.internet.MimeBodyPart;\r
+import javax.mail.internet.MimeMessage;\r
+import javax.mail.internet.MimeMultipart;\r
+import javax.mail.internet.MimeUtility;\r
+\r
+import hayashi.yuu.tools.mail.SiteData;\r
+\r
+/**\r
+ * Eメールを送信するためのクラス<br>\r
+ * JavaMailを使用する\r
+ * @see <a href="http://java.sun.com/products/javamail/javadocs/index.html">JavaMail API</a>\r
+ *\r
+ * @author hayashi\r
+ * @version 2010/02/05 SMTPサーバーのポート番号指定を追加\r
+ */\r
+public class SendMail\r
+{\r
+ public static void main(java.lang.String[] args) {\r
+ try {\r
+ SiteData siteData = new SiteData("sendmail.properties");\r
+ SendMail mail = new SendMail(siteData);\r
+ mail.setSubject("[SendMail] SendMail テスト");\r
+ mail.setContent("本文\n");\r
+ mail.setAttachment(new File("attache.jpg"));\r
+ mail.send();\r
+ }\r
+ catch (Exception e) {\r
+ e.printStackTrace();\r
+ }\r
+ }\r
+\r
+ protected Vector<String> toVector = new Vector<String>(); // プロパティ 送信先(to) の値\r
+ protected Vector<String> ccVector = new Vector<String>(); // プロパティ 送信先(Cc) の値\r
+ protected Vector<String> bccVector = new Vector<String>(); // プロパティ 送信先(Bcc) の値\r
+ protected String from = null; // プロパティ 発信元(from) の値\r
+ protected String subject; // プロパティ 題名(subject) の値\r
+ protected String content; // プロパティ 本文(content) の値\r
+ protected String mailHost; // プロパティ SMTP(mail.smtp.host) の値\r
+ protected String mailHostPort; // プロパティ SMTP_PORT(mail.smtp.port) の値\r
+\r
+ protected Vector<File> attachments = new Vector<File>(); // 添付ファイル\r
+ protected Vector<String> attachNames = new Vector<String>(); // 添付ファイル名\r
+\r
+ protected boolean POP_before_SMTP = false;\r
+ protected boolean STARTTLS = false;\r
+ protected boolean USER_AUTH = false;\r
+ protected String popServer = "";\r
+ protected String userId = "";\r
+ protected String password ="";\r
+ protected Session session = null;\r
+\r
+ /**\r
+ * 新しい YuuMail インスタンスを作成する\r
+ * @param mailProp メール設定ファイルのパス名称\r
+ */\r
+ public SendMail(String mailProp) {\r
+ this(new SiteData(mailProp));\r
+ }\r
+\r
+ /**\r
+ * 新しい インスタンスを作成する\r
+ * @param siteData メール設定値を包含したオブジェクト\r
+ */\r
+ public SendMail(SiteData siteData) {\r
+ super();\r
+\r
+ if (checkItem(siteData.MAIL_SMTP)) {\r
+ this.setMailHost(siteData.MAIL_SMTP);\r
+ }\r
+ if (checkItem(siteData.MAIL_SMTP_PORT)) {\r
+ this.setMailPort(siteData.MAIL_SMTP_PORT);\r
+ }\r
+ if (checkItem(siteData.MAIL_TO)) {\r
+ this.toVector.add(siteData.MAIL_TO);\r
+ }\r
+ if (checkItem(siteData.MAIL_CC)) {\r
+ this.ccVector.add(siteData.MAIL_CC);\r
+ }\r
+ if (checkItem(siteData.MAIL_BCC)) {\r
+ this.bccVector.add(siteData.MAIL_BCC);\r
+ }\r
+ if (checkItem(siteData.MAIL_FROM)) {\r
+ this.from = siteData.MAIL_FROM;\r
+ }\r
+\r
+ this.POP_before_SMTP = siteData.POP_before_SMTP;\r
+ this.STARTTLS = siteData.STARTTLS;\r
+ this.USER_AUTH = siteData.USER_AUTH;\r
+ this.popServer = siteData.MAIL_POP;\r
+ this.userId = siteData.USER_ID;\r
+ this.password = siteData.PASSWORD;\r
+\r
+ // メール(MimeMessageオブジェクト)を生成する\r
+ Properties props = System.getProperties();\r
+ props.put("mail.smtp.host", getMailHost());\r
+ props.put("mail.smtp.port", getMailPort());\r
+ if (this.USER_AUTH) {\r
+ props.put("mail.smtp.auth", "true");\r
+ }\r
+ if (this.STARTTLS) {\r
+ props.put("mail.smtp.starttls.enable", "true");\r
+ }\r
+ this.session = Session.getDefaultInstance(props, null);\r
+ }\r
+ private boolean checkItem(String itemStr) {\r
+ if (itemStr == null) {\r
+ return false;\r
+ }\r
+ if (itemStr.trim().equals("")) {\r
+ return false;\r
+ }\r
+ return true;\r
+ }\r
+\r
+ /**\r
+ * プロパティ mailHost の取得メソッド。\r
+ * @return プロパティ mailHost の値。\r
+ */\r
+ public String getMailHost() {\r
+ return this.mailHost;\r
+ }\r
+\r
+ /**\r
+ * SMTPサーバーを設定\r
+ * @param mailHost SMTPサーバー名またはSMTPサーバーのIPアドレス\r
+ */\r
+ public void setMailHost(String mailHost) {\r
+ this.mailHost = mailHost;\r
+ }\r
+\r
+ /**\r
+ * プロパティ SMTPポート番号 の取得メソッド。\r
+ * @return SMTPポート番号を表す文字列(デシマル)\r
+ */\r
+ public String getMailPort() {\r
+ return this.mailHostPort;\r
+ }\r
+\r
+ /**\r
+ * SMTPポート番号を設定\r
+ * @param portStr SMTPポート番号を表す文字列(デシマル)\r
+ */\r
+ public void setMailPort(String portStr) {\r
+ this.mailHostPort = portStr;\r
+ }\r
+\r
+ /**\r
+ * 送信先(To)を設定.数設定可\r
+ * @param to 送信先(To)\r
+ */\r
+ public void setTo(String to) {\r
+ if (!to.equals("")) {\r
+ toVector.addElement(to);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * 送信先(Cc)を設定。複数設定可\r
+ * @param cc 送信先(cc)\r
+ */\r
+ public void setCc(String cc) {\r
+ if (!cc.equals("")) {\r
+ ccVector.addElement(cc);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * 送信先(Bco)を設定.複数選択可\r
+ * @param bcc 送信先(Bcc)\r
+ */\r
+ public void setBcc(String bcc) {\r
+ if (!bcc.equals("")) {\r
+ bccVector.addElement(bcc);\r
+ }\r
+ }\r
+\r
+ /**\r
+ * プロパティ from の取得メソッド。\r
+ * @return プロパティ from の値。\r
+ */\r
+ public String getFrom() {\r
+ return from;\r
+ }\r
+\r
+ /**\r
+ * プロパティ 送信元(from) の設定メソッド。\r
+ * @param from 送信元メールアドレス\r
+ */\r
+ public void setFrom(String from) {\r
+ this.from = from;\r
+ }\r
+\r
+ /**\r
+ * プロパティ subject の取得メソッド。\r
+ * @return プロパティ subject の値。\r
+ */\r
+ public String getSubject() {\r
+ return subject;\r
+ }\r
+\r
+ /**\r
+ * プロパティ 題名(subject) の設定メソッド。\r
+ * メールタイトル(題名)を設定\r
+ * @param subject メールタイトル(題名)\r
+ */\r
+ public void setSubject(String subject) {\r
+ this.subject = subject;\r
+ }\r
+\r
+ /**\r
+ * 本文(content)の取得メソッド。\r
+ * @return 本文の値。\r
+ */\r
+ public String getContent() {\r
+ return this.content;\r
+ }\r
+\r
+ /**\r
+ * 本文(content)の設定メソッド。\r
+ * 本文(content)を設定\r
+ * @param content 本文(content)\r
+ */\r
+ public void setContent(String content) {\r
+ this.content = content;\r
+ }\r
+\r
+ /**\r
+ * 添付ファイルの設定メソッド。\r
+ * 添付するファイル(attachment)を設定.添付ファイルは複数設定可。\r
+ * @param attachment 添付するファイル(attachment)\r
+ * @throws FileNotFoundException 添付するファイルが見つからなかった。\r
+ */\r
+ @SuppressWarnings("resource")\r
+ public void setAttachment(File attachment) throws FileNotFoundException {\r
+ new FileInputStream(attachment); // ファイルが実存することをチェックする。\r
+ attachments.addElement(attachment);\r
+ attachNames.addElement(attachment.getName());\r
+ }\r
+\r
+ /**\r
+ * 添付ファイルの設定メソッド。\r
+ * 添付するファイル(attachment)を設定.添付ファイルは複数設定可。\r
+ * @param attachment 添付するファイル(attachment)\r
+ * @param name 添付するファイルの表示名\r
+ * @throws FileNotFoundException 添付するファイルが見つからなかった。\r
+ */\r
+ @SuppressWarnings("resource")\r
+ public void setAttachment(File attachment, String name) throws FileNotFoundException {\r
+ new FileInputStream(attachment); // ファイルが実存することをチェックする。\r
+ attachments.addElement(attachment);\r
+ attachNames.addElement(name);\r
+ }\r
+\r
+ /**\r
+ * メールを送信\r
+ * @throws MessagingException エラー:メールの送信に失敗しました。\r
+ * @throws UnsupportedEncodingException エラー:メールの文字エンコードに失敗しました。\r
+ */\r
+ public void send() throws MessagingException, UnsupportedEncodingException {\r
+ //-------------------------\r
+ // POP before SMTP 対応\r
+ //--\r
+ Store store = null;\r
+ if (this.POP_before_SMTP == true) {\r
+ System.out.println("store.connect('"+ popServer +"', '"+ userId +"', '"+ password +"')");\r
+ store = this.session.getStore("pop3");\r
+ store.connect(popServer, userId, password);\r
+ }\r
+ else {\r
+ System.out.println("no POP_before_SMTP!");\r
+ }\r
+\r
+ MimeMessage message = createMessage();\r
+\r
+ if (this.USER_AUTH) {\r
+ System.out.println("transport.connect(null, '"+ userId +"', '"+ password+"')");\r
+ Transport transport = this.session.getTransport("smtp");\r
+ transport.connect(null, userId, password);\r
+ Address[] addrs = message.getAllRecipients();\r
+ for (Address addr : addrs) {\r
+ System.out.println("[Addr] "+ addr.toString());\r
+ }\r
+ transport.sendMessage(message, message.getAllRecipients());\r
+ }\r
+ else {\r
+ System.out.println("no SMTP_AUTH!");\r
+ Transport.send(message);\r
+ }\r
+\r
+ if (this.POP_before_SMTP == true) {\r
+ store.close();\r
+ }\r
+ }\r
+\r
+ /**\r
+ * 新規にメールインスタンスを生成する。\r
+ * @return メールインスタンス\r
+ * @throws MessagingException メール送信に失敗しました。\r
+ * @throws UnsupportedEncodingException 文字エンコーディングに失敗した。\r
+ */\r
+ protected MimeMessage createMessage() throws MessagingException, UnsupportedEncodingException {\r
+ MimeMessage msg = new MimeMessage(this.session);\r
+\r
+ // 送信先(To)\r
+ InternetAddress[] toList = new InternetAddress[toVector.size()];\r
+ for (int i=0; i < toVector.size(); i++) {\r
+ toList[i] = new InternetAddress(toVector.elementAt(i));\r
+ }\r
+ msg.setRecipients(Message.RecipientType.TO, toList);\r
+\r
+ // 送信先(Cc)\r
+ InternetAddress[] ccList = new InternetAddress[ccVector.size()];\r
+ for (int i=0; i < ccVector.size(); i++) {\r
+ ccList[i] = new InternetAddress(ccVector.elementAt(i));\r
+ }\r
+ msg.setRecipients(Message.RecipientType.CC, ccList);\r
+\r
+ // 送信先(Bcc)\r
+ InternetAddress[] bccList = new InternetAddress[bccVector.size()];\r
+ for (int i=0; i < bccVector.size(); i++) {\r
+ bccList[i] = new InternetAddress(bccVector.elementAt(i));\r
+ }\r
+ msg.setRecipients(Message.RecipientType.BCC, bccList);\r
+\r
+ // 送信元(From)\r
+ msg.setFrom(new InternetAddress(getFrom()));\r
+\r
+ // 件名(Subject)\r
+ msg.setSubject(MimeUtility.encodeText(getSubject(), "iso-2022-jp", "B"));\r
+\r
+ // 本文(Content)\r
+ MimeMultipart naiyou = new MimeMultipart();\r
+ msg.setContent(naiyou);\r
+\r
+ MimeBodyPart honbun = new MimeBodyPart();\r
+ honbun.setContent(getContent(), "text/plain; charset=\"iso-2022-jp\"");\r
+ naiyou.addBodyPart(honbun);\r
+\r
+ // 添付(Attachment)\r
+ for (int i=0; i < attachments.size(); i++) {\r
+ File attachFile = attachments.elementAt(i);\r
+ MimeBodyPart tenpu = new MimeBodyPart();\r
+ javax.activation.FileDataSource dfs = new javax.activation.FileDataSource(attachFile);\r
+ javax.activation.DataHandler dh = new javax.activation.DataHandler(dfs);\r
+ tenpu.setDataHandler(dh);\r
+ tenpu.setFileName(attachNames.elementAt(i));\r
+ naiyou.addBodyPart(tenpu);\r
+ }\r
+\r
+ return msg;\r
+ }\r
+}\r