服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - java实现简单发送邮件功能

java实现简单发送邮件功能

2022-11-20 14:18Yweir Java教程

这篇文章主要为大家详细介绍了java实现简单发送邮件功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了java实现简单发送邮件的具体代码,供大家参考,具体内容如下

添加依赖

?
1
2
3
4
5
6
7
8
9
10
11
12
13
<!--发送邮件API-->
    <!-- https://mvnrepository.com/artifact/javax.mail/javax.mail-api -->
    <dependency>
      <groupId>javax.mail</groupId>
      <artifactId>javax.mail-api</artifactId>
      <version>1.6.2</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/com.sun.mail/javax.mail -->
    <dependency>
      <groupId>com.sun.mail</groupId>
      <artifactId>javax.mail</artifactId>
      <version>1.6.2</version>
</dependency>

自定义异常类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class EmailException extends Exception {
 
    public EmailException(String message) {
        super(message);
    }
     public EmailException() {
            super();
     }
    /**
    
     */
    private static final long serialVersionUID = 115631651651651651L;
 
}

IMAP协议读取邮件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
 
import com.sun.mail.util.MailSSLSocketFactory;
 
 
public class IMAPReceiveMail {
    private String user = "";//账号
    private String password = "";//密码
    private  String HOST = ""; // smtp服务器
//    private Properties props = null;
    private Folder folder = null;//收件箱
    private Store store  = null;//实例对象
//    final String pop3 = "IMAP";
    final String imap = "imap";
    public IMAPReceiveMail(String user,String password) {
        this.password = password;//密码
        this.user = user;//账户
    }
    
     /**
     * @param message 邮件对象
     * @param to 收件人
     * @throws MessagingException
     * @throws IOException
     */
//    public void forwardMail(Message message,String to) throws MessagingException, IOException {
//            Message forward = new MimeMessage(session);
//            forward.setSubject(message.getSubject());
//            forward.setFrom(new InternetAddress(to));
//            forward.setRecipient(Message.RecipientType.TO, new InternetAddress(to));
//            forward.setSentDate(new Date());
//            forward.setContent(message.getContent(), message.getContentType());
//
//            Transport smtp = session.getTransport("smtp");
//            smtp.connect(HOST, user, password);//连接服务器的邮箱
//            smtp.sendMessage(forward, forward.getAllRecipients());
//            smtp.close();
//     }
    /**
     * 接收邮件
     */
    public  Folder resceive() throws Exception {
        /**
         * 因为现在使用的是163邮箱 而163的 pop地址是 pop3.163.com 端口是 110 比如使用好未来企业邮箱 就需要换成 好未来邮箱的
         * pop服务器地址 pop.263.net 和 端口 110
         */
        String duankou = ""; // 端口号
        String servicePath = ""; // 服务器地址
        if(user==null||user.length()==0) throw new EmailException("账户不能为空!!!!");
        if(password==null||password.length()==0) throw new EmailException("密码不能为空!!!!");
        if(user.contains("@163")) {
            duankou = "143"; // 端口号
            servicePath = "imap.163.com"; // 服务器地址
        }else if(user.contains("@qq")) {
            duankou = "993"; // 端口号
            servicePath = "imap.qq.com"; // 服务器地址
        }else {
            throw new EmailException("不支持该协议");
        }
 
        // 准备连接服务器的会话信息
        Properties props = new Properties();
        
        props.setProperty("mail.store.protocol", imap); // 使用pop3协议
        props.setProperty("mail.imap.socketFactory.fallback", "false");
        props.setProperty("mail.imap.port", duankou); // 端口
        props.setProperty("mail.imap.socketFactory.port", duankou); // 端口
        props.setProperty("mail.transport.protocol", "smtp");// 发送邮件协议名称
        props.setProperty("mail.smtp.auth", "true");  //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条
        props.setProperty("mail.host", HOST);
        
        //关闭读取附件时分批获取 BASE64 输入流的配置
        props.setProperty("mail.imap.partialfetch", "false");
        props.setProperty("mail.imaps.partialfetch", "false");
//        props.setProperty("mail.pop3.host", servicePath); // pop3服务器
        
//        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; 
//        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
//        props.setProperty("mail.imap.socketFactory.class", SSL_FACTORY);
        MailSSLSocketFactory sf = new MailSSLSocketFactory();//ssl加密
        sf.setTrustAllHosts(true);
        props.put("mail.imap.ssl.enable", "true");
        props.put("mail.imap.ssl.socketFactory", sf);
        
        // 创建Session实例对象
        Session session = Session.getInstance(props);
        session.setDebug(false);
        store = session.getStore(imap);
        store.connect(servicePath,user,password); // 163邮箱程序登录属于第三方登录所以这里的密码是163给的授权密码而并非普通的登录密码
        // 获得收件箱
        folder = store.getFolder("INBOX");
        /*
         * Folder.READ_ONLY:只读权限 Folder.READ_WRITE:可读可写(可以修改邮件的状态)
         */
        folder.open(Folder.READ_WRITE); // 打开收件箱
        // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
//        System.out.println("未读邮件数: " + folder.getUnreadMessageCount());
        // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
//        System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
//        System.out.println("新邮件: " + folder.getNewMessageCount());
        // 获得收件箱中的邮件总数
//        System.out.println("邮件总数: " + folder.getMessageCount());
        // 得到收件箱中的所有邮件,并解析
//        Message[] messages = folder.getMessages();
//        parseMessage(messages);
        // 得到收件箱中的所有邮件并且删除邮件
//        deleteMessage(messages);
 
        // 释放资源
//        folder.close(true);
//        store.close();
        return folder;
    }
    public void Colsefolder() throws MessagingException {//关闭资源
        if(folder!=null) {
            folder.close();
        }
        if(store!=null) {
            store.close();
        }
    }
    /**
     * 解析邮件
    
     * @param messages 要解析的邮件列表
     */
    public  void parseMessage(Message... messages) throws MessagingException, IOException {
        if (messages == null || messages.length < 1)
            throw new MessagingException("未找到要解析的邮件!");
        // 解析所有邮件
        for (int i = 0, count = messages.length; i < count; i++) {
            MimeMessage msg = (MimeMessage) messages[i];
            System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");
            System.out.println("主题: " + getSubject(msg));
            System.out.println("发件人: " + getFrom(msg));
            System.out.println("收件人:" + getReceiveAddress(msg, null));
            System.out.println("发送时间:" + getSentDate(msg, null));
            System.out.println("是否已读:" + isSeen(msg));
            System.out.println("邮件优先级:" + getPriority(msg));
            System.out.println("是否需要回执:" + isReplySign(msg));
            System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");
            boolean isContainerAttachment = isContainAttachment(msg);
            System.out.println("是否包含附件:" + isContainerAttachment);
            if (isContainerAttachment) {
                saveAttachment(msg, "f:\\mailTest\\" + msg.getSubject() + "_" + i + "_"); // 保存附件
            }
            StringBuffer content = new StringBuffer(30);
            getMailTextContent(msg, content);
            System.out.println("邮件正文:" + (content.length() > 100 ? content.substring(0, 100) + "..." : content));
            System.out.println("------------------第" + msg.getMessageNumber() + "封邮件解析结束-------------------- ");
            System.out.println();
        }
    }
 
    /**
     * 解析邮件
    
     * @param messages 要解析的邮件列表
     */
    public  void deleteMessage(Message... messages) throws MessagingException, IOException {
        if (messages == null || messages.length < 1)
            throw new MessagingException("未找到要解析的邮件!");
 
        // 解析所有邮件
        for (int i = 0, count = messages.length; i < count; i++) {
 
            /**
             * 邮件删除
             */
            Message message = messages[i];
            String subject = message.getSubject();
            // set the DELETE flag to true
            message.setFlag(Flags.Flag.DELETED, true);
            System.out.println("Marked DELETE for message: " + subject);
 
        }
    }
 
    /**
     * 获得邮件主题
    
     * @param msg 邮件内容
     * @return 解码后的邮件主题
     */
    public  String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {
        return MimeUtility.decodeText(msg.getSubject());
    }
 
    /**
     * 获得邮件发件人
    
     * @param msg 邮件内容
     * @return 姓名 <Email地址>
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public  String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
        String from = "";
        Address[] froms = msg.getFrom();
        if (froms.length < 1)
            throw new MessagingException("没有发件人!");
 
        InternetAddress address = (InternetAddress) froms[0];
        String person = address.getPersonal();
        if (person != null) {
            person = MimeUtility.decodeText(person) + " ";
        } else {
            person = "";
        }
        from = person + "<" + address.getAddress() + ">";
 
        return from;
    }
    
    
    public  String getFromAddress(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
        String from = "";
        Address[] froms = msg.getFrom();
        if (froms.length < 1)
            throw new MessagingException("没有发件人!");
 
        InternetAddress address = (InternetAddress) froms[0];
        from = address.getAddress();
 
        return from;
    }
    /**
     * 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
     * <p>
     * Message.RecipientType.TO 收件人
     * </p>
     * <p>
     * Message.RecipientType.CC 抄送
     * </p>
     * <p>
     * Message.RecipientType.BCC 密送
     * </p>
    
     * @param msg  邮件内容
     * @param type 收件人类型
     * @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...
     * @throws MessagingException
     */
    public  String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {
        StringBuffer receiveAddress = new StringBuffer();
        Address[] addresss = null;
        if (type == null) {
            addresss = msg.getAllRecipients();
        } else {
            addresss = msg.getRecipients(type);
        }
 
        if (addresss == null || addresss.length < 1)
            throw new MessagingException("没有收件人!");
        for (Address address : addresss) {
            InternetAddress internetAddress = (InternetAddress) address;
            receiveAddress.append(internetAddress.toUnicodeString()).append(",");
        }
 
        receiveAddress.deleteCharAt(receiveAddress.length() - 1); // 删除最后一个逗号
 
        return receiveAddress.toString();
    }
 
    /**
     * 获得邮件发送时间
    
     * @param msg 邮件内容
     * @return yyyy年mm月dd日 星期X HH:mm
     * @throws MessagingException
     */
    public  String getSentDate(MimeMessage msg, String pattern) throws MessagingException {
        Date receivedDate = msg.getSentDate();
        if (receivedDate == null)
            return "";
 
        if (pattern == null || "".equals(pattern))
            pattern = "yyyy年MM月dd日 E HH:mm ";
 
        return new SimpleDateFormat(pattern).format(receivedDate);
    }
 
    /**
     * 判断邮件中是否包含附件
    
     * @param msg 邮件内容
     * @return 邮件中存在附件返回true,不存在返回false
     * @throws MessagingException
     * @throws IOException
     */
    public  boolean isContainAttachment(Part part) throws MessagingException, IOException {
        boolean flag = false;
        if (part.isMimeType("multipart/*")) {
            MimeMultipart multipart = (MimeMultipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                String disp = bodyPart.getDisposition();
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                    flag = true;
                } else if (bodyPart.isMimeType("multipart/*")) {
                    flag = isContainAttachment(bodyPart);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("application") != -1) {
                        flag = true;
                    }
 
                    if (contentType.indexOf("name") != -1) {
                        flag = true;
                    }
                }
 
                if (flag)
                    break;
            }
        } else if (part.isMimeType("message/rfc822")) {
            flag = isContainAttachment((Part) part.getContent());
        }
        return flag;
    }
 
    /**
     * 判断邮件是否已读
    
     * @param msg 邮件内容
     * @return 如果邮件已读返回true,否则返回false
     * @throws MessagingException
     */
    public  boolean isSeen(MimeMessage msg) throws MessagingException {
        return msg.getFlags().contains(Flags.Flag.SEEN);
    }
 
    /**
     * 判断邮件是否需要阅读回执
    
     * @param msg 邮件内容
     * @return 需要回执返回true,否则返回false
     * @throws MessagingException
     */
    public  boolean isReplySign(MimeMessage msg) throws MessagingException {
        boolean replySign = false;
        String[] headers = msg.getHeader("Disposition-Notification-To");
        if (headers != null)
            replySign = true;
        return replySign;
    }
 
    /**
     * 获得邮件的优先级
    
     * @param msg 邮件内容
     * @return 1(High):紧急 3:普通(Normal) 5:低(Low)
     * @throws MessagingException
     */
    public  String getPriority(MimeMessage msg) throws MessagingException {
        String priority = "普通";
        String[] headers = msg.getHeader("X-Priority");
        if (headers != null) {
            String headerPriority = headers[0];
            if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
                priority = "紧急";
            else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
                priority = "低";
            else
                priority = "普通";
        }
        return priority;
    }
 
    /**
     * 获得邮件文本内容
    
     * @param part    邮件体
     * @param content 存储邮件文本内容的字符串
     * @throws MessagingException
     * @throws IOException
     */
    public  void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
        // 如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
        if (part.isMimeType("text/*") && !isContainTextAttach) {
            content.append(part.getContent().toString());
        } else if (part.isMimeType("message/rfc822")) {
            getMailTextContent((Part) part.getContent(), content);
        } else if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                getMailTextContent(bodyPart, content);
            }
        }
    }
 
    /**
     * 保存附件
    
     * @param part    邮件中多个组合体中的其中一个组合体
     * @param destDir 附件保存目录
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     * @throws FileNotFoundException
     * @throws IOException
     */
    public  void saveAttachment(Part part, String destDir)
            throws UnsupportedEncodingException, MessagingException, FileNotFoundException, IOException {
        if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent(); // 复杂体邮件
            // 复杂体邮件包含多个邮件体
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                // 获得复杂体邮件中其中一个邮件体
                BodyPart bodyPart = multipart.getBodyPart(i);
                // 某一个邮件体也有可能是由多个邮件体组成的复杂体
                String disp = bodyPart.getDisposition();
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                    InputStream is = bodyPart.getInputStream();
                    saveFile(is, destDir, decodeText(bodyPart.getFileName()));
                } else if (bodyPart.isMimeType("multipart/*")) {
                    saveAttachment(bodyPart, destDir);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
                        saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName()));
                    }
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            saveAttachment((Part) part.getContent(), destDir);
        }
    }
 
    /**
     * 读取输入流中的数据保存至指定目录
    
     * @param is       输入流
     * @param fileName 文件名
     * @param destDir  文件存储目录
     * @throws FileNotFoundException
     * @throws IOException
     */
    private  void saveFile(InputStream is, String destDir, String fileName)
            throws FileNotFoundException, IOException {
        BufferedInputStream bis = new BufferedInputStream(is);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(destDir + fileName)));
        int len = -1;
        while ((len = bis.read()) != -1) {
            bos.write(len);
            bos.flush();
        }
        bos.close();
        bis.close();
    }
 
    public void SetSEEN(MimeMessage message) throws MessagingException {//设置文件已读
        message.setFlag(Flags.Flag.SEEN,true);
    }
    /**
     * 文本解码
    
     * @param encodeText 解码MimeUtility.encodeText(String text)方法编码后的文本
     * @return 解码后的文本
     * @throws UnsupportedEncodingException
     */
    public  String decodeText(String encodeText) throws UnsupportedEncodingException {
        if (encodeText == null || "".equals(encodeText)) {
            return "";
        } else {
            return MimeUtility.decodeText(encodeText);
        }
    }
}

POP3协议接收邮件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
 
import javax.mail.Address;
import javax.mail.BodyPart;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Part;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;
 
import com.sun.mail.util.MailSSLSocketFactory;
 
/**
 * 使用POP3协议接收邮件
 */
public class POP3ReceiveMail {
    private String user = "";//账号
    private String password = "";//密码
//    private Properties props = null;
    private Folder folder = null;//收件箱
    private Store store  = null;//实例对象
    final String pop3 = "pop3";
//    final String imap = "imap";
    public POP3ReceiveMail(String user,String password) {
        this.password = password;//密码
        this.user = user;//账户
    }
    /**
     * 接收邮件
     */
    public  Folder resceive() throws Exception {
        /**
         * 因为现在使用的是163邮箱 而163的 pop地址是 pop3.163.com 端口是 110 比如使用好未来企业邮箱 就需要换成 好未来邮箱的
         * pop服务器地址 pop.263.net 和 端口 110
         */
        
        String duankou = ""; // 端口号
        String servicePath = ""; // 服务器地址
        if(user==null||user.length()==0) throw new EmailException("账户不能为空!!!!");
        if(password==null||password.length()==0) throw new EmailException("密码不能为空!!!!");
        if(user.contains("@163")) {
            duankou = "110"; // 端口号
            servicePath = "pop3.163.com"; // 服务器地址
        }else if(user.contains("@qq")) {
            duankou = "995"; // 端口号
            servicePath = "pop.qq.com"; // 服务器地址
        }else {
            throw new EmailException("不支持该协议");
        }
        
 
        // 准备连接服务器的会话信息
        Properties props = new Properties();
        props.setProperty("mail.store.protocol", pop3); // 使用pop3协议
 
//        props.setProperty("mail.transport.protocol", pop3); // 使用pop3协议
        props.setProperty("mail.pop3.port", duankou); // 端口
        props.setProperty("mail.pop3.host", servicePath); // pop3服务器
        props.setProperty("mail.pop3.socketFactory.fallback", "true");
        
        MailSSLSocketFactory sf = new MailSSLSocketFactory();//ssl加密
        sf.setTrustAllHosts(true);
        props.put("mail.pop3.ssl.enable", "true");
        props.put("mail.pop3.ssl.socketFactory", sf);
        
//        final String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory"; 
//      Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
//        props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY);
        // 创建Session实例对象
        Session session = Session.getInstance(props);
        store = session.getStore(pop3);
        store.connect(servicePath,user,password); // 163邮箱程序登录属于第三方登录所以这里的密码是163给的授权密码而并非普通的登录密码
        // 获得收件箱
        folder = store.getFolder("INBOX");
        /*
         * Folder.READ_ONLY:只读权限 Folder.READ_WRITE:可读可写(可以修改邮件的状态)
         */
//        folder.open(Folder.READ_WRITE); // 打开收件箱
        folder.open(Folder.READ_WRITE); // 打开收件箱
        // 由于POP3协议无法获知邮件的状态,所以getUnreadMessageCount得到的是收件箱的邮件总数
//        System.out.println("未读邮件数: " + folder.getUnreadMessageCount());
        // 由于POP3协议无法获知邮件的状态,所以下面得到的结果始终都是为0
//        System.out.println("删除邮件数: " + folder.getDeletedMessageCount());
//        System.out.println("新邮件: " + folder.getNewMessageCount());
        // 获得收件箱中的邮件总数
//        System.out.println("邮件总数: " + folder.getMessageCount());
        // 得到收件箱中的所有邮件,并解析
//        Message[] messages = folder.getMessages();
//        parseMessage(messages);
        // 得到收件箱中的所有邮件并且删除邮件
//        deleteMessage(messages);
 
        // 释放资源
//        folder.close(true);
//        store.close();
        return folder;
    }
    public void Colsefolder() throws MessagingException {//关闭资源
        if(folder!=null) {
            folder.close();
        }
        if(store!=null) {
            store.close();
        }
    }
    /**
     * 解析邮件
    
     * @param messages 要解析的邮件列表
     */
    public  void parseMessage(Message... messages) throws MessagingException, IOException {
        if (messages == null || messages.length < 1)
            throw new MessagingException("未找到要解析的邮件!");
        // 解析所有邮件
        for (int i = 0, count = messages.length; i < count; i++) {
            MimeMessage msg = (MimeMessage) messages[i];
            System.out.println("------------------解析第" + msg.getMessageNumber() + "封邮件-------------------- ");
            System.out.println("主题: " + getSubject(msg));
            System.out.println("发件人: " + getFrom(msg));
            System.out.println("收件人:" + getReceiveAddress(msg, null));
            System.out.println("发送时间:" + getSentDate(msg, null));
            System.out.println("是否已读:" + isSeen(msg));
            System.out.println("邮件优先级:" + getPriority(msg));
            System.out.println("是否需要回执:" + isReplySign(msg));
            System.out.println("邮件大小:" + msg.getSize() * 1024 + "kb");
            boolean isContainerAttachment = isContainAttachment(msg);
            System.out.println("是否包含附件:" + isContainerAttachment);
            if (isContainerAttachment) {
                saveAttachment(msg, "f:\\mailTest\\" + msg.getSubject() + "_" + i + "_"); // 保存附件
            }
            StringBuffer content = new StringBuffer(30);
            getMailTextContent(msg, content);
            System.out.println("邮件正文:" + (content.length() > 100 ? content.substring(0, 100) + "..." : content));
            System.out.println("------------------第" + msg.getMessageNumber() + "封邮件解析结束-------------------- ");
            System.out.println();
        }
    }
 
    /**
     * 解析邮件
    
     * @param messages 要解析的邮件列表
     */
    public  void deleteMessage(Message... messages) throws MessagingException, IOException {
        if (messages == null || messages.length < 1)
            throw new MessagingException("未找到要解析的邮件!");
 
        // 解析所有邮件
        for (int i = 0, count = messages.length; i < count; i++) {
 
            /**
             * 邮件删除
             */
            Message message = messages[i];
            String subject = message.getSubject();
            // set the DELETE flag to true
            message.setFlag(Flags.Flag.DELETED, true);
            System.out.println("Marked DELETE for message: " + subject);
 
        }
    }
 
    /**
     * 获得邮件主题
    
     * @param msg 邮件内容
     * @return 解码后的邮件主题
     */
    public  String getSubject(MimeMessage msg) throws UnsupportedEncodingException, MessagingException {
        return MimeUtility.decodeText(msg.getSubject());
    }
 
    /**
     * 获得邮件发件人
    
     * @param msg 邮件内容
     * @return 姓名 <Email地址>
     * @throws MessagingException
     * @throws UnsupportedEncodingException
     */
    public  String getFrom(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
        String from = "";
        Address[] froms = msg.getFrom();
        if (froms.length < 1)
            throw new MessagingException("没有发件人!");
 
        InternetAddress address = (InternetAddress) froms[0];
        String person = address.getPersonal();
        if (person != null) {
            person = MimeUtility.decodeText(person) + " ";
        } else {
            person = "";
        }
        from = person + "<" + address.getAddress() + ">";
 
        return from;
    }
 
    public  String getFromAddress(MimeMessage msg) throws MessagingException, UnsupportedEncodingException {
        String from = "";
        Address[] froms = msg.getFrom();
        if (froms.length < 1)
            throw new MessagingException("没有发件人!");
 
        InternetAddress address = (InternetAddress) froms[0];
        from = address.getAddress();
 
        return from;
    }
    /**
     * 根据收件人类型,获取邮件收件人、抄送和密送地址。如果收件人类型为空,则获得所有的收件人
     * <p>
     * Message.RecipientType.TO 收件人
     * </p>
     * <p>
     * Message.RecipientType.CC 抄送
     * </p>
     * <p>
     * Message.RecipientType.BCC 密送
     * </p>
    
     * @param msg  邮件内容
     * @param type 收件人类型
     * @return 收件人1 <邮件地址1>, 收件人2 <邮件地址2>, ...
     * @throws MessagingException
     */
    public  String getReceiveAddress(MimeMessage msg, Message.RecipientType type) throws MessagingException {
        StringBuffer receiveAddress = new StringBuffer();
        Address[] addresss = null;
        if (type == null) {
            addresss = msg.getAllRecipients();
        } else {
            addresss = msg.getRecipients(type);
        }
 
        if (addresss == null || addresss.length < 1)
            throw new MessagingException("没有收件人!");
        for (Address address : addresss) {
            InternetAddress internetAddress = (InternetAddress) address;
            receiveAddress.append(internetAddress.toUnicodeString()).append(",");
        }
 
        receiveAddress.deleteCharAt(receiveAddress.length() - 1); // 删除最后一个逗号
 
        return receiveAddress.toString();
    }
 
    /**
     * 获得邮件发送时间
    
     * @param msg 邮件内容
     * @return yyyy年mm月dd日 星期X HH:mm
     * @throws MessagingException
     */
    public  String getSentDate(MimeMessage msg, String pattern) throws MessagingException {
        Date receivedDate = msg.getSentDate();
        if (receivedDate == null)
            return "";
 
        if (pattern == null || "".equals(pattern))
            pattern = "yyyy年MM月dd日 E HH:mm ";
 
        return new SimpleDateFormat(pattern).format(receivedDate);
    }
 
    /**
     * 判断邮件中是否包含附件
    
     * @param msg 邮件内容
     * @return 邮件中存在附件返回true,不存在返回false
     * @throws MessagingException
     * @throws IOException
     */
    public  boolean isContainAttachment(Part part) throws MessagingException, IOException {
        boolean flag = false;
        if (part.isMimeType("multipart/*")) {
            MimeMultipart multipart = (MimeMultipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                String disp = bodyPart.getDisposition();
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                    flag = true;
                } else if (bodyPart.isMimeType("multipart/*")) {
                    flag = isContainAttachment(bodyPart);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("application") != -1) {
                        flag = true;
                    }
 
                    if (contentType.indexOf("name") != -1) {
                        flag = true;
                    }
                }
 
                if (flag)
                    break;
            }
        } else if (part.isMimeType("message/rfc822")) {
            flag = isContainAttachment((Part) part.getContent());
        }
        return flag;
    }
 
    /**
     * 判断邮件是否已读
    
     * @param msg 邮件内容
     * @return 如果邮件已读返回true,否则返回false
     * @throws MessagingException
     */
    public  boolean isSeen(MimeMessage msg) throws MessagingException {
        return msg.getFlags().contains(Flags.Flag.SEEN);
    }
 
    /**
     * 判断邮件是否需要阅读回执
    
     * @param msg 邮件内容
     * @return 需要回执返回true,否则返回false
     * @throws MessagingException
     */
    public  boolean isReplySign(MimeMessage msg) throws MessagingException {
        boolean replySign = false;
        String[] headers = msg.getHeader("Disposition-Notification-To");
        if (headers != null)
            replySign = true;
        return replySign;
    }
 
    /**
     * 获得邮件的优先级
    
     * @param msg 邮件内容
     * @return 1(High):紧急 3:普通(Normal) 5:低(Low)
     * @throws MessagingException
     */
    public  String getPriority(MimeMessage msg) throws MessagingException {
        String priority = "普通";
        String[] headers = msg.getHeader("X-Priority");
        if (headers != null) {
            String headerPriority = headers[0];
            if (headerPriority.indexOf("1") != -1 || headerPriority.indexOf("High") != -1)
                priority = "紧急";
            else if (headerPriority.indexOf("5") != -1 || headerPriority.indexOf("Low") != -1)
                priority = "低";
            else
                priority = "普通";
        }
        return priority;
    }
 
    /**
     * 获得邮件文本内容
    
     * @param part    邮件体
     * @param content 存储邮件文本内容的字符串
     * @throws MessagingException
     * @throws IOException
     */
    public  void getMailTextContent(Part part, StringBuffer content) throws MessagingException, IOException {
        // 如果是文本类型的附件,通过getContent方法可以取到文本内容,但这不是我们需要的结果,所以在这里要做判断
        boolean isContainTextAttach = part.getContentType().indexOf("name") > 0;
        if (part.isMimeType("text/*") && !isContainTextAttach) {
            content.append(part.getContent().toString());
        } else if (part.isMimeType("message/rfc822")) {
            getMailTextContent((Part) part.getContent(), content);
        } else if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent();
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                BodyPart bodyPart = multipart.getBodyPart(i);
                getMailTextContent(bodyPart, content);
            }
        }
    }
 
    /**
     * 保存附件
    
     * @param part    邮件中多个组合体中的其中一个组合体
     * @param destDir 附件保存目录
     * @throws UnsupportedEncodingException
     * @throws MessagingException
     * @throws FileNotFoundException
     * @throws IOException
     */
    public  void saveAttachment(Part part, String destDir)
            throws UnsupportedEncodingException, MessagingException, FileNotFoundException, IOException {
        if (part.isMimeType("multipart/*")) {
            Multipart multipart = (Multipart) part.getContent(); // 复杂体邮件
            // 复杂体邮件包含多个邮件体
            int partCount = multipart.getCount();
            for (int i = 0; i < partCount; i++) {
                // 获得复杂体邮件中其中一个邮件体
                BodyPart bodyPart = multipart.getBodyPart(i);
                // 某一个邮件体也有可能是由多个邮件体组成的复杂体
                String disp = bodyPart.getDisposition();
                if (disp != null && (disp.equalsIgnoreCase(Part.ATTACHMENT) || disp.equalsIgnoreCase(Part.INLINE))) {
                    InputStream is = bodyPart.getInputStream();
                    saveFile(is, destDir, decodeText(bodyPart.getFileName()));
                } else if (bodyPart.isMimeType("multipart/*")) {
                    saveAttachment(bodyPart, destDir);
                } else {
                    String contentType = bodyPart.getContentType();
                    if (contentType.indexOf("name") != -1 || contentType.indexOf("application") != -1) {
                        saveFile(bodyPart.getInputStream(), destDir, decodeText(bodyPart.getFileName()));
                    }
                }
            }
        } else if (part.isMimeType("message/rfc822")) {
            saveAttachment((Part) part.getContent(), destDir);
        }
    }
 
    /**
     * 读取输入流中的数据保存至指定目录
    
     * @param is       输入流
     * @param fileName 文件名
     * @param destDir  文件存储目录
     * @throws FileNotFoundException
     * @throws IOException
     */
    private  void saveFile(InputStream is, String destDir, String fileName)
            throws FileNotFoundException, IOException {
        BufferedInputStream bis = new BufferedInputStream(is);
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File(destDir + fileName)));
        int len = -1;
        while ((len = bis.read()) != -1) {
            bos.write(len);
            bos.flush();
        }
        bos.close();
        bis.close();
    }
 
    /**
     * 文本解码
    
     * @param encodeText 解码MimeUtility.encodeText(String text)方法编码后的文本
     * @return 解码后的文本
     * @throws UnsupportedEncodingException
     */
    public  String decodeText(String encodeText) throws UnsupportedEncodingException {
        if (encodeText == null || "".equals(encodeText)) {
            return "";
        } else {
            return MimeUtility.decodeText(encodeText);
        }
    }
}

发送邮件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.GeneralSecurityException;
import java.util.Date;
import java.util.Properties;
import java.util.UUID;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
 
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
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;
import javax.mail.internet.MimeUtility;
 
import com.sun.mail.util.MailSSLSocketFactory;
 
/*
 * 发送邮件
 */
public class SendMailUtil {
    private  String HOST = ""; // smtp服务器
    private String FROM = ""; // 发件人地址
//    private String TO = ""; // 收件人地址
    private String[] AFFIX = null; // 附件地址
//    private String AFFIXNAME = ""; // 附件名称
    private String USER = ""; // 用户名
    private String PWD = ""; // 163的授权码
//    private String SUBJECT = ""; // 邮件标题
    private String[] TOS = null;
    private  Properties props = null;//
    /**
     * @param USER 账户名
     * @param PWD    密码
     * @param FROM 发件人地址
     * @throws EmailException 
     * @throws GeneralSecurityException 
     */
    public SendMailUtil(String USER,String PWD,String FROM) throws EmailException, GeneralSecurityException {
        this.USER = USER;//账户
        this.PWD = PWD;//密码
        this.FROM = FROM;//发件人地址
        stratProperties();
        
    }
    private void stratProperties() throws EmailException, GeneralSecurityException {
         props = new Properties();
         if(USER==null||USER.length()==0) {
             throw new EmailException("邮箱账号不能为空");    
         }else {
             if(USER.contains("@qq")) {
                 HOST = "smtp.qq.com";
             }else if(USER.contains("@163")) {
                 HOST = "smtp.163.com";
             }else if(USER.contains("@sina")) {
                 HOST = "smtp.sina.com.cn";
             }else {
                 throw new EmailException("不支持该协议");
             }
//             props.setProperty("mail.smtp.host", HOST);//设置发送邮件的邮件服务器的属性(这里使用网易的smtp服务器)
             // 设置邮件服务器主机名
             props.setProperty("mail.host", HOST);
             
         }
         if(PWD==null||PWD.length()==0)throw new EmailException("邮箱密码不能为空");
          props.setProperty("mail.transport.protocol", "smtp");// 发送邮件协议名称
         props.setProperty("mail.smtp.auth", "true");  //需要经过授权,也就是有户名和密码的校验,这样才能通过验证(一定要有这一条)
//         props.put("mail.debug", "true");//设置debug模式 后台输出邮件发送的过程
         
         MailSSLSocketFactory sf = new MailSSLSocketFactory();//ssl加密
         sf.setTrustAllHosts(true);
         props.put("mail.smtp.ssl.enable", "true");
         props.put("mail.smtp.ssl.socketFactory", sf);
    }
    
    public void forwardMail(Message message) throws AddressException, MessagingException, EmailException, IOException {
        if(TOS.length==0)throw new EmailException("收件人不能为空");
         Session session = Session.getInstance(props);//用props对象构建一个session
//         session.setDebug(true);//关闭控制台输出
         MimeMessage newmessage = new MimeMessage(session);//用session为参数定义消息对象
         newmessage.setSubject(message.getSubject());
            newmessage.setFrom(new InternetAddress(FROM));
          newmessage.setSentDate(new Date());
         newmessage.setContent(message.getContent(), message.getContentType());
         InternetAddress[] sendTo = new InternetAddress[TOS.length]; // 加载收件人地址
         for (int i = 0; i < TOS.length; i++) {  
             sendTo[i] = new InternetAddress(TOS[i]);  
         }
        newmessage.addRecipients(Message.RecipientType.TO,sendTo);
        newmessage.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(FROM));//设置在发送给收信人之前给自己(发送方)抄送一份,不然会被当成垃圾邮件,报554错
        Transport smtp = session.getTransport("smtp");
       smtp.connect(HOST, USER, PWD);
       smtp.sendMessage(newmessage, newmessage.getAllRecipients());
       smtp.close();
    }
    /**
     * @param path 需要添加附件的文件路径
     * @throws EmailException 
     */
    public void addFile(String...path) throws EmailException {
        if(path==null||path.length==0)throw new EmailException("附件路径不能为空");    
        this.AFFIX = path;
    }
    public void setTo(String...to) throws EmailException {
        if(toString().length()>0) {
            for(String t : to) {
                boolean emailFormat = emailFormat(t);
                if(!emailFormat) {
                    throw new EmailException(t+"邮箱格式不正确");    
                }
            }
            TOS = to;
        }else {
            throw new EmailException("收件人不能为空");    
        }
    }
   
    /**
     ** 验证输入的邮箱格式是否符合
     * @param email
     * @return 是否合法
     */
    private  boolean emailFormat(String email)
    {
        boolean tag = true;
        final String pattern1 = "^([a-z0-9A-Z]+[-|\\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\\.)+[a-zA-Z]{2,}$";
        final Pattern pattern = Pattern.compile(pattern1);
        final Matcher mat = pattern.matcher(email);
        if (!mat.find()) {
            tag = false;
        }
        return tag;
    }
    /**
     * @param SUBJECT 标题
     * @param context 文本信息
     * @throws EmailException
     * @throws MessagingException 
     * @throws AddressException 
     * @throws GeneralSecurityException 
     * @throws UnsupportedEncodingException 
     */
    public  void send(String SUBJECT,String context) throws EmailException, AddressException, MessagingException, GeneralSecurityException, UnsupportedEncodingException {
        
        if(SUBJECT==null||SUBJECT.length()==0)SUBJECT=UUID.randomUUID().toString();
//        this.SUBJECT = SUBJECT;//标题
        if(TOS.length==0)throw new EmailException("收件人不能为空");
        Session session = Session.getInstance(props);//用props对象构建一个session
//        session.setDebug(true);//关闭控制台输出
        MimeMessage message = new MimeMessage(session);//用session为参数定义消息对象
        message.setFrom(new InternetAddress(FROM));// 加载发件人地址
        InternetAddress[] sendTo = new InternetAddress[TOS.length]; // 加载收件人地址
        for (int i = 0; i < TOS.length; i++) {  
            sendTo[i] = new InternetAddress(TOS[i]);  
        }
        message.addRecipients(Message.RecipientType.TO,sendTo);
        message.addRecipients(MimeMessage.RecipientType.CC, InternetAddress.parse(FROM));//设置在发送给收信人之前给自己(发送方)抄送一份,不然会被当成垃圾邮件,报554错
        message.setSubject(SUBJECT);//加载标题
        Multipart multipart = new MimeMultipart();//向multipart对象中添加邮件的各个部分内容,包括文本内容和附件
        BodyPart contentPart = new MimeBodyPart();//设置邮件的文本内容
        contentPart.setText(context);
        multipart.addBodyPart(contentPart);
        if(AFFIX!=null&&AFFIX.length>0){//添加附件
            for(int i = 0 ; i <AFFIX.length ; i++) {
                File file = new File(AFFIX[i]);
                if(file.exists()) {
                     BodyPart messageBodyPart = new MimeBodyPart();
                     FileDataSource source = new FileDataSource(file);
//                     String AFFIXNAME = file.getName();
//                     System.out.println(AFFIXNAME);
                     messageBodyPart.setDataHandler(new DataHandler(source));//添加附件的内容
                     messageBodyPart.setFileName(MimeUtility.encodeWord(file.getName(), "GBK", null));
                     multipart.addBodyPart(messageBodyPart);
                }else {
                    throw new EmailException("文件"+AFFIX[i]+"不存在");
                }
            }
            
        }
        message.setContent(multipart);//将multipart对象放到message中
        message.saveChanges(); //保存邮件
        Transport transport = session.getTransport();//发送邮件
        transport.connect(HOST, USER, PWD);//连接服务器的邮箱
        transport.sendMessage(message, message.getAllRecipients());//把邮件发送出去
        transport.close();//关闭连接
    }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://laiwei.blog.csdn.net/article/details/109709703

延伸 · 阅读

精彩推荐