使用JavaMail接收邮件
1)创建邮件Session实例
2)以Session实例获取邮件存储对象Store。调用Store对象的connect方法执行连接
3)调用Store对象的getFolder方法来获取指定的邮件文件夹
4)调用Folder的open方法打开指定的邮件文件夹,接下来就可执行他的getMessage方法来获取该文件夹内所有的邮件了
遍历每封邮件,提取邮件内容
public class ReceiveMail {
private final static String SSL_FACTORY = "javax.net.ssl.SSLSocketFactory";
// 用户账号
private String account;
// 密码
private String password;
// POP3邮件服务器
private String pop3Host;
// POP3的端口
private int pop3Port;
// 省略set和get方法
private Sotre store;
public Store getStore() {
if (this.store == null || !this.store.isConnected()) {
try {
Properties props = new Properties();
if (isGmail()) {
props.setproperty("mail.pop3.socketFactory.class", SSL_FACTORY);
}
Session session = Session.getDefaultInstance(props);
// 使用POP3协议接收邮件
URLName url = new URLName("pop3", getPop3Host(), getPop3Port(), null, getAccount(), getPassword());
Store store = session.getStore(url);
store.connect();
this.store = store;
} catch (Exception e) {
e.printStackTrace();
System.out.println("连接邮箱异常,请检查连接信息");
}
}
return this.store;
}
// 对于Gmail的邮箱需要特别处理
private boolean isGmail() {
if (this.account == null || this.account.trim().equals("")) {
return false;
}
if (this.account.lastIndexOf("@gmail.com") != -1) {
return true;
}
return false;
}
public void getMessages() {
// 获取收件箱
try {
Folder inbox = getStore().getFolder("INBOX");
inbox.open(Folder.READ_WRITE);
// 等到INBOX里的所有信息
Message[] messages = inbox.getMessages();
for (int i = 0; i < messages.length; i++) {
System.out.println("第" + (i + 1) + "封邮件的信息");
printMessage(messages[i]);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("读取邮件信息出错");
}
}
// 得到接收的日期,优先返回发送日期,其次返回收信日期
public Date getReceivedDate(Message m) throws Exception {
if (m.getSentDate() != null) {
return m.getSentDate();
}
if (m.getReceiveDate != null) {
return m.getReceiveDate();
}
return new Date();
}
// 得到抄送的地址
public List<String> getCC(Message m) throws Exception {
Address[] addresses = m.getRecipients(Message.RecipientType.CC);
return getAddresses(addresses);
}
// 得到文件名的后缀
private String getFileSuffix(String fileName) {
if (fileName == null || fileName.trim().equals("")) {
return "";
}
int dotPos = fileName.lastIndexOf(".");
if (dotPos != -1) {
return fileName.substring(dotPos);
}
return "";
}
// 获得邮件的附件
public List<FileObject> getFiles(Message m) throws Exception {
List<FileObject> files = new ArrayList<FileObject>();
// 是混合类型,就进行处理
if (m.isMimeType("multipart/mixed")) {
Multipartt mp = (Multipart) m.getContent();
// 得到邮件内容的Multipart对象并得到内容中Part的数量
int count = mp.getCount();
for (int i = 1; i < count; i++) {
// 获取附件
Part part = mp.getBodyPart(i);
// 获取邮件附件名
String sercerFileName = MimeUtility.decodeText(part.getFileName());
// 生产UUID作为在本地系统中唯一的文件标识
String fileName = UUID.randomUUID().toString();
File file = new File(fileName + getFileSuffix(serverFileName));
// 读写文件
FileOutputStream fos = new FileOutputStream(file);
InputStream is = part.getInputStream();
BufferedOutputStream outs = new BufferedOutputStream(fos);
// 使用IO流读取邮件附件
byte[] b = new byte[1024];
int hasRead = 0;
while ((hasRead = is.read(b)) > 0) {
outs.write(b, 0, hasRead);
}
outs.close();
is.close();
fos.close();
FileObject fileObject = new FileObject(serverFileName, file);
files.add(fileObject);
}
}
return files;
}
// 处理邮件正文的工具方法
private StringBuffer getContent(Part part, StringBuffer result) throws Exception {
if (part.isMimeType("multipart/*")) {
Multipart p = (Multipart) part.getContent();
int count = p.getCount();
// Multipart的第一部分是text/plain
// 第二部分是text/html的格式,只解析第一部分即可
if (count > 1)
count = 1;
for (int i = 0; i < count; i++) {
BodyPart bp = p.getBodyPart(i);
// 递归调用
getContent(bp, result);
}
} else if (part.isMimeType("text/*")) {
result.append(part.getContent());
}
return result;
}
// 返回邮件正文内容
public String getContent(Message m) throws Exception {
StringBuffer sb = new StringBuffer("");
return getContent(m, sb).toString();
}
// 判断一封邮件是否已读,true表示已读,false表示没有读取
public boolean hasRead(Message m) throws Exception {
Flags flags = m.getFlages();
return flags.contains(Flags.Flag.SEEN);
}
// 得到一封邮件的所有收件人
public List<String> getAllRecipients(Message m) throws Exception {
Address[] addresses = m.getAllRecipients();
return getAddresses(addresses);
}
// 工具方法,将参数的地址字符串封装成集合
public List<String> getAddresses(Address[] addresses) {
List<String> result = new ArrayList<String>();
if (addresses == null) {
return result;
}
for (Address a : addresses) {
result.add(a.toString());
}
return result;
}
// 得到发送人的地址
public String getSender(Message m) throws Exception {
Address[] addresses = m.getForm();
return MimeUtility.decodeText(addresses[0].toString());
}
// 打印Message的信息
public void printMessage(Message m) throws Exception {
System.out.println(m.toString());
System.out.println("接收日期" + getReceivedDate(m));
System.out.println("抄送地址" + getCC());
System.out.println("是否已读" + hasRead(m));
System.out.println("所有收件人" + getAllRecipients(m));
System.out.println("发件人地址" + getSender(m));
System.out.println("邮件正文\n" + getContent(m));
System.out.println("附件信息" + getFiles(m));
}
public static void main(String[] args) throws Exception {
ReceiveMail rec = new ReceiveMail();
rec.setPop3Host("pop3.sina.com");
rec.setPop3Port(110);
...
rec.getMessages();
}
}