【JavaEE】经典JAVA EE企业应用实战-读书笔记8

使用JavaMail接收邮件

1)创建邮件Session实例

2)以Session实例获取邮件存储对象Store。调用Store对象的connect方法执行连接

3)调用Store对象的getFolder方法来获取指定的邮件文件夹

4)调用Folderopen方法打开指定的邮件文件夹,接下来就可执行他的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();
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值