需求
因为某些特定的业务需要,要从邮件中获取附件。花了一些时间,最终业务需求实现了,但是也遇到一些坑,所以记录一下。
JavaMail
使用JavaMail来实现邮件的一系列操作(发送、接收),我使用的版本是1.6.2(maven仓库里有),不多说,上代码
工具类
package com.xxx.xxx;
import com.sun.mail.imap.IMAPFolder;
import com.sun.mail.imap.IMAPStore;
import com.sun.mail.pop3.POP3Folder;
import com.sun.mail.pop3.POP3Store;
import org.castor.util.Base64Decoder;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.*;
import javax.mail.internet.*;
import javax.mail.search.*;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.security.Security;
import java.util.Date;
import java.util.List;
import java.util.Properties;
/**
* @author jiangyw
* @date 2019/1/7 19:29
* <p>
* 处理邮件工具类
* 接收/发送服务器根据不同邮箱有不同的地址
* 在邮箱设置里都可找到
*/
public class MailUtil {
// 发送服务器
private static final String SEND_SMTP_HOST = "smtp.exmail.qq.com";
private static final int SEND_SMTP_PORT = 465;
// 接收服务器
private static final String RECEIVE_IMAP_HOST = "imap.exmail.qq.com";
private static final int RECEIVE_IMAP_PORT = 993;
private static final String RECEIVE_POP_HOST = "pop.exmail.qq.com";
private static final int RECEIVE_POP_PORT = 110;
// 账号
private String user;
// 密码
private String password;
private IMAPFolder imapFolder = null;
private IMAPStore imapStore = null;
private POP3Store pop3Store = null;
private POP3Folder pop3Folder = null;
public MailUtil() {
this("your email address", "your email password");
}
private MailUtil(String user, String password) {
this.user = user;
this.password = password;
}
/**
* 发送邮件
*
* @param toEmail 收件人邮箱地址
* @param subject 邮件标题
* @param content 邮件内容 可以是html内容
*/
public void send(String toEmail, String subject, String content) {
Session session = loadSendSession();
// session.setDebug(true);
// 创建邮件消息
MimeMessage message = new MimeMessage(session);
try {
// 设置发件人
message.setFrom(new InternetAddress(user));
Address[] a = new Address[1];
a[0] = new InternetAddress(user);
message.setReplyTo(a);
// 设置收件人
InternetAddress to = new InternetAddress(toEmail);
message.setRecipient(MimeMessage.RecipientType.TO, to);
// 设置邮件标题
message.setSubject(subject);
// 设置邮件的内容体
message.setContent(content, "text/html;charset=UTF-8");
// 发送邮件
Transport.send(message);
} catch (MessagingException e) {
e.printStackTrace();
String err = e.getMessage();
// 在这里处理message内容, 格式是固定的
System.out.println(err);
}
}
/**
* 发送邮件 带附件
*
* @param toEmail 收件人邮箱地址
* @param subject 邮件标题
* @param content 邮件内容 可以是html内容
* @param attachPath 附件路径
*/
public void send(String toEmail, String subject, String content, String attachPath) {
Session session = loadSendSession();
MimeMessage mm = new MimeMessage(session);
try {
//发件人
mm.setFrom(new InternetAddress(user));
//收件人
mm.setRecipient(Message.RecipientType.TO, new InternetAddress(toEmail)); // 设置收件人
// mm.setRecipient(Message.RecipientType.CC, new