OSDN Git Service

2019-02-11
[hayashilib/hayashi.git] / src / jp / co / areaweb / tools / mail / SendMail.java
1 package jp.co.areaweb.tools.mail;\r
2 \r
3 import java.io.File;\r
4 import java.io.FileInputStream;\r
5 import java.io.FileNotFoundException;\r
6 import java.io.UnsupportedEncodingException;\r
7 import java.util.Properties;\r
8 import java.util.Vector;\r
9 \r
10 import javax.mail.Message;\r
11 import javax.mail.MessagingException;\r
12 import javax.mail.Session;\r
13 import javax.mail.Transport;\r
14 import javax.mail.Store;\r
15 import javax.mail.internet.InternetAddress;\r
16 import javax.mail.internet.MimeBodyPart;\r
17 import javax.mail.internet.MimeMessage;\r
18 import javax.mail.internet.MimeMultipart;\r
19 import javax.mail.internet.MimeUtility;\r
20 \r
21 import jp.co.areaweb.tools.mail.SiteData;\r
22 \r
23 /**\r
24  * Eメールを送信するためのクラス<br>\r
25  * JavaMailを使用する\r
26  * @see <a href="http://java.sun.com/products/javamail/javadocs/index.html">JavaMail API</a>\r
27  * \r
28  * @author hayashi\r
29  * @version 2010/02/05  SMTPサーバーのポート番号指定を追加\r
30  */\r
31 public class SendMail\r
32 {\r
33     public static void main(java.lang.String[] args) {\r
34         try {\r
35                 SendMail mail = new SendMail("yuumail.properties");\r
36             mail.setSubject("[proxSafe] SendMail テスト");\r
37             mail.setContent("本文\n");\r
38             mail.setAttachment(new File("mail-1.4.jar"));\r
39             mail.send();\r
40         }\r
41         catch (Exception e) {\r
42             e.printStackTrace();\r
43         }\r
44     }\r
45 \r
46     protected Vector<String> toVector = new Vector<>(); // プロパティ 送信先(to) の値\r
47     protected Vector<String> ccVector = new Vector<>(); // プロパティ 送信先(Cc) の値\r
48     protected Vector<String> bccVector = new Vector<>();    // プロパティ 送信先(Bcc) の値\r
49     protected String from = null;         // プロパティ 発信元(from) の値\r
50     protected String subject;             // プロパティ 題名(subject) の値\r
51     protected String content;             // プロパティ 本文(content) の値\r
52     protected String mailHost;            // プロパティ SMTP(mail.smtp.host) の値\r
53     protected String mailHostPort;        // プロパティ SMTP_PORT(mail.smtp.port) の値\r
54     \r
55     protected Vector<File> attachments = new Vector<>();        // 添付ファイル\r
56     protected Vector<String> attachNames = new Vector<>();              // 添付ファイル名\r
57     \r
58     protected boolean POP_before_SMTP = false;\r
59     protected boolean USER_AUTH = false;\r
60     protected String popServer = "";\r
61     protected String userId = "";\r
62     protected String password ="";\r
63     protected Session session = null;\r
64     \r
65     /** \r
66      * 新しい YuuMail インスタンスを作成する \r
67      * @param propertyFile      メール設定ファイルのパス名称\r
68      */\r
69     public SendMail(String propertyFile) {\r
70         this(new SiteData(propertyFile));\r
71     }\r
72 \r
73     /**\r
74      * 新しい インスタンスを作成する \r
75      * @param siteData メール設定値を包含したオブジェクト\r
76      */\r
77     public SendMail(SiteData siteData) {\r
78         super();\r
79         \r
80         if (!siteData.MAIL_SMTP.equals("")) {\r
81             this.setMailHost(siteData.MAIL_SMTP);\r
82         }\r
83         if (!siteData.MAIL_SMTP_PORT.equals("")) {\r
84             this.setMailPort(siteData.MAIL_SMTP_PORT);\r
85         }\r
86         if (!siteData.MAIL_TO.equals("")) {\r
87             this.toVector.addElement(siteData.MAIL_TO);\r
88         }\r
89         if (!siteData.MAIL_CC.equals("")) {\r
90             this.ccVector.addElement(siteData.MAIL_CC);\r
91         }\r
92         if (!siteData.MAIL_BCC.equals("")) {\r
93             this.bccVector.addElement(siteData.MAIL_BCC);\r
94         }\r
95         if (!siteData.MAIL_FROM.equals("")) {\r
96             this.from = siteData.MAIL_FROM;\r
97         }\r
98 \r
99         this.POP_before_SMTP = siteData.POP_before_SMTP;\r
100         this.USER_AUTH = siteData.USER_AUTH;\r
101         this.popServer = siteData.MAIL_POP;\r
102         this.userId = siteData.USER_ID;\r
103         this.password = siteData.PASSWORD;\r
104         \r
105         \r
106         // メール(MimeMessageオブジェクト)を生成する\r
107         Properties props = System.getProperties();\r
108         props.put("mail.smtp.host", getMailHost());\r
109         props.put("mail.smtp.port", getMailPort());\r
110         if (this.USER_AUTH) {\r
111                 props.put("mail.smtp.auth", "true");\r
112         }\r
113         this.session = Session.getDefaultInstance(props, null);\r
114     }\r
115     \r
116     /** \r
117      * プロパティ mailHost の取得メソッド。\r
118      * @return プロパティ mailHost の値。\r
119      */\r
120     public String getMailHost() {\r
121         return this.mailHost;\r
122     }\r
123     \r
124     /** \r
125      * SMTPサーバーを設定\r
126      *  @param mailHost SMTPサーバー名またはSMTPサーバーのIPアドレス\r
127     */\r
128     public void setMailHost(String mailHost) {\r
129         this.mailHost = mailHost;\r
130     }\r
131     \r
132     /** \r
133      * プロパティ SMTPポート番号 の取得メソッド。\r
134      * @return SMTPポート番号を表す文字列(デシマル)\r
135      */\r
136     public String getMailPort() {\r
137         return this.mailHostPort;\r
138     }\r
139 \r
140     /** \r
141      * SMTPポート番号を設定\r
142      *  @param portStr SMTPポート番号を表す文字列(デシマル)\r
143      */\r
144     public void setMailPort(String portStr) {\r
145         this.mailHostPort = portStr;\r
146     }\r
147     \r
148     /**\r
149      * 送信先(To)を設定.数設定可\r
150      * @param to 送信先(To)\r
151      */\r
152     public void setTo(String to) {\r
153         if (!to.equals("")) {\r
154             toVector.addElement(to);\r
155         }\r
156     }\r
157     \r
158     /**\r
159      * 送信先(Cc)を設定。複数設定可\r
160      * @param cc 送信先(cc)\r
161      */\r
162     public void setCc(String cc) {\r
163         if (!cc.equals("")) {\r
164             ccVector.addElement(cc);\r
165         }\r
166     }\r
167     \r
168     /**\r
169      * 送信先(Bco)を設定.複数選択可\r
170      * @param bcc 送信先(Bcc)\r
171      */\r
172     public void setBcc(String bcc) {\r
173         if (!bcc.equals("")) {\r
174             bccVector.addElement(bcc);\r
175         }\r
176     }\r
177     \r
178     /** \r
179      * プロパティ from の取得メソッド。\r
180      * @return プロパティ from の値。\r
181      */\r
182     public String getFrom() {\r
183         return from;\r
184     }\r
185     \r
186     /** \r
187      * プロパティ 送信元(from) の設定メソッド。\r
188      * @param from 送信元メールアドレス\r
189      */\r
190     public void setFrom(String from) {\r
191         this.from = from;\r
192     }\r
193     \r
194     /** \r
195      * プロパティ subject の取得メソッド。\r
196      * @return プロパティ subject の値。\r
197      */\r
198     public String getSubject() {\r
199         return subject;\r
200     }\r
201     \r
202     /**\r
203      * プロパティ 題名(subject) の設定メソッド。\r
204      * メールタイトル(題名)を設定\r
205      * @param subject メールタイトル(題名)\r
206      */\r
207     public void setSubject(String subject) {\r
208         this.subject = subject;\r
209     }\r
210     \r
211     /** \r
212      * 本文(content)の取得メソッド。\r
213      * @return 本文の値。\r
214      */\r
215     public String getContent() {\r
216         return this.content;\r
217     }\r
218     \r
219     /** \r
220      * 本文(content)の設定メソッド。\r
221      * 本文(content)を設定\r
222      * @param content 本文(content)\r
223      */\r
224     public void setContent(String content) {\r
225         this.content = content;\r
226     }\r
227     \r
228     /** \r
229      * 添付ファイルの設定メソッド。\r
230      * 添付するファイル(attachment)を設定.添付ファイルは複数設定可。\r
231      * @param attachment 添付するファイル(attachment)\r
232      * @throws FileNotFoundException 添付するファイルが見つからなかった。\r
233      */\r
234     @SuppressWarnings("resource")\r
235         public void setAttachment(File attachment) throws FileNotFoundException {\r
236         new FileInputStream(attachment);    // ファイルが実存することをチェックする。\r
237         attachments.addElement(attachment);\r
238         attachNames.addElement(attachment.getName());\r
239     }\r
240     \r
241     /** \r
242      * 添付ファイルの設定メソッド。\r
243      * 添付するファイル(attachment)を設定.添付ファイルは複数設定可。\r
244      * @param attachment 添付するファイル(attachment)\r
245      * @param name 添付するファイルの表示名\r
246      * @throws FileNotFoundException 添付するファイルが見つからなかった。\r
247      */\r
248      @SuppressWarnings("resource")\r
249         public void setAttachment(File attachment, String name) throws FileNotFoundException {\r
250          new FileInputStream(attachment);    // ファイルが実存することをチェックする。\r
251          attachments.addElement(attachment);\r
252          attachNames.addElement(name);\r
253      }\r
254      \r
255     /**\r
256      * メールを送信\r
257      * @throws MessagingException エラー:メールの送信に失敗しました。\r
258      * @throws UnsupportedEncodingException エラー:メールの文字エンコードに失敗しました。\r
259      */\r
260     public void send() throws MessagingException, UnsupportedEncodingException {\r
261         //-------------------------\r
262         // POP before SMTP 対応\r
263         //--\r
264         Store store = null;\r
265         if (this.POP_before_SMTP == true) {\r
266                 System.out.println("store.connect("+ popServer +", '"+ userId +"', '"+ password +"')");\r
267                 store = this.session.getStore("pop3");\r
268                 store.connect(popServer, userId, password);\r
269         }\r
270         else {\r
271                 System.out.println("no POP_before_SMTP!");\r
272         }\r
273 \r
274         MimeMessage message = createMessage();\r
275         \r
276         if (this.USER_AUTH) {\r
277                 System.out.println("transport.connect(null, '"+ userId +"', '"+ password+"')");\r
278             Transport transport = this.session.getTransport("smtp");\r
279                 transport.connect(null, userId, password);\r
280             transport.sendMessage(message, message.getAllRecipients());\r
281         }\r
282         else {\r
283                 System.out.println("no SMTP_AUTH!");\r
284                 Transport.send(message);\r
285         }\r
286         \r
287         if (this.POP_before_SMTP == true) {\r
288             store.close();\r
289         }\r
290     }\r
291     \r
292     /**\r
293      * 新規にメールインスタンスを生成する。\r
294      * @return  メールインスタンス\r
295      * @throws MessagingException メール送信に失敗しました。\r
296      * @throws UnsupportedEncodingException 文字エンコーディングに失敗した。\r
297      */\r
298     protected MimeMessage createMessage() throws MessagingException, UnsupportedEncodingException {\r
299         MimeMessage msg = new MimeMessage(this.session);\r
300         \r
301         // 送信先(To)\r
302         InternetAddress[] toList = new InternetAddress[toVector.size()];\r
303         for (int i=0; i < toVector.size(); i++) {\r
304             toList[i] = new InternetAddress(toVector.elementAt(i));\r
305         }\r
306         msg.setRecipients(Message.RecipientType.TO, toList);\r
307 \r
308         // 送信先(Cc)\r
309         InternetAddress[] ccList = new InternetAddress[ccVector.size()];\r
310         for (int i=0; i < ccVector.size(); i++) {\r
311             ccList[i] = new InternetAddress(ccVector.elementAt(i));\r
312         }\r
313         msg.setRecipients(Message.RecipientType.CC, ccList);\r
314 \r
315         // 送信先(Bcc)\r
316         InternetAddress[] bccList = new InternetAddress[bccVector.size()];\r
317         for (int i=0; i < bccVector.size(); i++) {\r
318             bccList[i] = new InternetAddress(bccVector.elementAt(i));\r
319         }\r
320         msg.setRecipients(Message.RecipientType.BCC, bccList);\r
321         \r
322         // 送信元(From)\r
323         msg.setFrom(new InternetAddress(getFrom()));\r
324 \r
325         // 件名(Subject)\r
326         msg.setSubject(MimeUtility.encodeText(getSubject(), "iso-2022-jp", "B"));\r
327 \r
328         // 本文(Content)\r
329         MimeMultipart naiyou = new MimeMultipart();\r
330         msg.setContent(naiyou);\r
331         \r
332         MimeBodyPart honbun = new MimeBodyPart();\r
333         honbun.setContent(getContent(), "text/plain; charset=\"iso-2022-jp\"");\r
334         naiyou.addBodyPart(honbun);\r
335 \r
336         // 添付(Attachment)\r
337         for (int i=0; i < attachments.size(); i++) {\r
338             File attachFile = attachments.elementAt(i);\r
339             MimeBodyPart tenpu = new MimeBodyPart();\r
340             javax.activation.FileDataSource dfs = new javax.activation.FileDataSource(attachFile);\r
341             javax.activation.DataHandler dh = new javax.activation.DataHandler(dfs);\r
342             tenpu.setDataHandler(dh);\r
343             tenpu.setFileName(attachNames.elementAt(i));\r
344             naiyou.addBodyPart(tenpu);\r
345         }\r
346         \r
347         return msg;\r
348     }\r
349 }\r