OSDN Git Service

meven
[hayashilib/hayashi.git] / src / main / java / hayashi / yuu / tools / mail / SendMail.java
diff --git a/src/main/java/hayashi/yuu/tools/mail/SendMail.java b/src/main/java/hayashi/yuu/tools/mail/SendMail.java
new file mode 100755 (executable)
index 0000000..4e52833
--- /dev/null
@@ -0,0 +1,367 @@
+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