邮箱工具(尚未完成)的几个组件类

在使用公用电脑又没有带 u 盘的情况下,如果在网上找到了一些有用的链接需要转存起来,该怎么办呢?

一、Delicious 是一个解决方案,不过那个东西我不经常用,老是忘记账号密码(如果是常用邮箱的话,那就是滚瓜烂熟了)。

二、qq 邮箱的邮件草稿箱(有一个保存草稿的功能)

三、qq 空间的留言板

。。。。


不过我感觉都不是很好,我想到了一种自动化比较高的方案:

写一个工具上传到 csdn 的资源。

以后每次在公用电脑有需求的时候就将这个工具下载到本地。

这个工具主要包含了如下的功能:

能够解析拽入的链接的网页标题,然后,以一种特定的格式组织好发送到指定的邮箱。

然后,在自己的本地机器,写一个工具能够自动从指定邮箱里面抓出新增的链接 数据,

然后保存为特定的数据文件(比如说按日期分类的一个 html 文件,类似 chrome 导出 书签html)。

这样的话就形成了一个良好的循环,将所有零散的连接数据从其他公用电脑上面转移到了自己的本地机器中。


用邮箱的话也有一些弊端,比如:

邮件服务器一般都设置了垃圾邮件拦截,这样的话,发送邮件的频率就不能太高,不然发送失败的话数据就不安全了。

可以采用 “生产者-消费者” 的模式搞一个队列,或者是把单元数据累积起来,设置一个最低得发送间隔,

比如说下一封邮件的发送时间必须超过上次发送时间 10秒+,然后一次性把累积起来的数据发送到邮箱。


下面是我最近写的几个组件类(现在已经习惯性的往可重用性这方面靠了,篇幅短,结构简单,个人感觉重用性还是不错的)

EmailAddressUtil.java

package org.bruce.mail.tool.v2;

import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author yang3wei
 * 检查邮箱地址是否有效~
 */
public class EmailAddressUtil {

	public static final String REGULAR_EXPRESSION = 
			"^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$";

	/**
	 * 检查邮箱地址是否有效~
	 * @param strAddr
	 * @return
	 */
	public static boolean validate(String strAddr) {
		boolean bRetVal = false;

		Pattern pattern = Pattern.compile(REGULAR_EXPRESSION);
		Matcher matcher = pattern.matcher(strAddr);
		bRetVal = matcher.matches();

		return bRetVal;
	}
	
	/**
	 * 根据邮箱地址解析出邮箱主机的域名~
	 * @param strAddr
	 * @return
	 */
	public static String getHostDomain(String strAddr) {
		int index = strAddr.indexOf('@');
		String strHostDomain = strAddr.substring(index + 1);
		return strHostDomain;
	}

	/**
	 * 测试~
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		List<String> addrList = new ArrayList<String>();
		
		addrList.add("123456@qq.com");
		addrList.add("abcdefg@yeah.net");
		addrList.add("dfewfew@tom.com");
		addrList.add("dfewfew@263.com");
		
		addrList.add("asdfaf.dasd@das");
		addrList.add("asdfas@dfasdf");
		addrList.add("asdfasd.sdfwwefw");
		
		for (String strAddr : addrList) {
			boolean bRetVal = validate(strAddr);
			String yesOrNot = bRetVal ? " 是" : " 不是";
			System.out.println(strAddr + yesOrNot + "一个有效的邮箱地址");
			
			if (bRetVal) {
				System.out.println(strAddr + "的域名为:" + getHostDomain(strAddr));
			}
			
			System.out.println();
		}
	}
}
ValidateUtil.java

package org.bruce.mail.tool.v2;

import java.util.Properties;

import javax.mail.Session;
import javax.mail.Transport;

/**
 * @author yang3wei
 * 用来验证账号密码是否正确~
 */
public class ValidateUtil {
	
	/**
	 * @param usr
	 * @param pwd
	 * @return
	 */
	public static boolean validate(String usr, String pwd, String host) {
		boolean bRetVal = false;
		
		if (usr != null && EmailAddressUtil.validate(usr)) {
			
			Properties props = new Properties();
			props.put("mail.smtp.host", host);
			props.put("mail.smtp.auth", "true");
			
			try {
				Session session = Session.getDefaultInstance(props, null);
				Transport transport = session.getTransport("smtp");
				transport.connect(host, usr, pwd);
				bRetVal = transport.isConnected();
				transport.close();
			} catch (Exception e) {
				System.err.println("Authenticate failed!");
			}
		}
		
		return bRetVal;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		boolean bRetVal = validate("12345@yeah.net", "12345", "smtp.yeah.net");
		System.out.println(bRetVal ? "验证通过" : "验证失败");
	}

}

Account.java

package org.bruce.mail.tool.v2;

/**
 * @author yang3wei
 *
 */
public class Account {
	
	private String usr;
	private String pwd;
	private String host;

	public Account() {
		// TODO Auto-generated constructor stub
	}
	
	public Account(String usr, String pwd, String host) {
		this.usr = usr;
		this.pwd = pwd;
		this.host = host;
	}
	
	public String getHost() {
		return host;
	}
	public void setHost(String host) {
		this.host = host;
	}
	public String getUsr() {
		return usr;
	}
	public void setUsr(String usr) {
		this.usr = usr;
	}
	public String getPwd() {
		return pwd;
	}
	public void setPwd(String pwd) {
		this.pwd = pwd;
	}

}

AccountMgr.java

package org.bruce.mail.tool.v2;

import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

/**
 * @author yang3wei
 * 
 * 这里对用户名以及密码做把关。
 * 在获取到正确的用户名、密码之后,
 * 就会将其记录到 username,password 成员变量~
 */
public class AccountMgr {
	
	/**
	 * Max login times
	 */
	public static final int MAX_LOGIN_TIMES = 3;
	
	private static AccountMgr aMgr = null;
	private boolean available = false;
	private Account account = new Account();

	public static AccountMgr sharedInstance() {
		if (aMgr == null) {
			aMgr = new AccountMgr();
		}
		return aMgr;
	}
	
	private AccountMgr() {
		int times = 0;
		String strTip = "请输入邮箱密码";
		
		while (!available) {
			
			JTextField jtf_userName = new JTextField();
			/**
			 * http://bbs.csdn.net/topics/120044533
			 * 如果能让对话框弹出时密码框自动获取焦点就更好了(手动按下 tab 键就行了)~
			 * 让密码框自动获取焦点比较麻烦,要重写一个东西,还要加上阻塞的逻辑~
			 */
			JPasswordField jpf_pwd = new JPasswordField();
			Object[] comps = {"邮箱账号", jtf_userName, "邮箱密码", jpf_pwd};
			int iRetVal = JOptionPane.showConfirmDialog(null, comps, strTip, JOptionPane.OK_CANCEL_OPTION);
			// 关闭 = -1,取消 = 2;确定 = 0
			if (iRetVal == -1 || iRetVal == 2) {
				// “取消” 或 “关闭” 将进入到这里~
				System.exit(-1);
			}
			
			String strUsr = jtf_userName.getText();
			String strPwd = String.valueOf(jpf_pwd.getPassword());
			String strHost = null;
			
			if (strUsr == null || strUsr.equals("") || strPwd == null || strPwd.equals("")) {
				// 密码框里面什么都没有就按确定的话,就不做验证了,免得浪费时间(验证很耗时)~
				available = false;
				
			} else {
				strHost = "smtp." +  EmailAddressUtil.getHostDomain(strUsr);
				available = ValidateUtil.validate(strUsr, strPwd, strHost);
			}
			
			if (available) {
				account.setUsr(strUsr);
				account.setPwd(strPwd);
				account.setHost(strHost);
				JOptionPane.showMessageDialog(null, "验证通过");
				
			} else {
				times ++;
				int count = MAX_LOGIN_TIMES - times;
				if (count > 1) {
					strTip = "验证失败,还能尝试" + count + "次";
				} else if (count == 1) {
					strTip = "验证失败,再失败1次后退出!";
				} else {
					System.exit(-1);
				}
			}
		}
	}
	
	// getters && setters
	public Account getAccount() {
		return account;
	}
	public void setAccount(Account account) {
		this.account = account;
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		AccountMgr.sharedInstance();
	}
}
EmailSender.java

package org.bruce.mail.tool.v2;

import java.util.Date;
import java.util.Properties;
import java.util.Random;

import javax.mail.Message;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;

/**
 * @author yang3wei
 */
public class EmailSender {

	/**
	 * @param content
	 */
	public static void send(String content) {
		
		AccountMgr aMgr = AccountMgr.sharedInstance();
		String strUsr = aMgr.getAccount().getUsr();
		String strPwd = aMgr.getAccount().getPwd();
		String strHost = aMgr.getAccount().getHost();
		
		Properties props = new Properties();
		props.put("mail.smtp.host", strHost);
		props.put("mail.smtp.auth", "true");
		Session session = Session.getInstance(props, null);
		
		InternetAddress fromNetAddr = null;
		InternetAddress[] toNetAddr = new InternetAddress[1];
		
		try {
			fromNetAddr = new InternetAddress(strUsr);
			toNetAddr[0] = new InternetAddress(strUsr);

			MimeMessage msg = new MimeMessage(session);
			msg.setFrom(fromNetAddr);
			msg.setRecipients(Message.RecipientType.TO, toNetAddr);
			msg.setSubject("subject" + new Random().nextInt());
			msg.setSentDate(new Date());
			msg.setText(content);
			msg.saveChanges();
			
			Transport transport = session.getTransport("smtp");
			transport.connect(strHost, strUsr, strPwd);
			transport.sendMessage(msg, msg.getAllRecipients());
			transport.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		for (int i = 0; i < 5; i ++) {
			send("Nice to meet you! -" + i);
			System.out.println("Send an e-mail successfully!");
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
	}

}
HtimParser.java

package org.bruce.mail.tool.v2;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;

/**
 * @author yang3wei
 * jsoup 用例
 */
public class HtmlParser {
	
	public static final String USER_AGENT = 
			"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.31 (KHTML, like Gecko) Chrome/26.0.1410.64 Safari/537.31";
	
	/**
	 * 获取页面标题~
	 * @param url
	 * @return
	 */
	public static String getTitle(String url) {
		String title = "get_title_failed";
		Document doc = null;
		try {
			// 从 URL 直接加载 HTML 文档
			doc = Jsoup.connect(url).userAgent(USER_AGENT).get();
			title = doc.title();
		} catch (IOException e) {
			e.printStackTrace();
		}
		return title;
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		List<String> listUrl = new ArrayList<String>();
		
		listUrl.add("http://my.oschina.net/bigyuan/blog/98115");// 开源中国
		listUrl.add("http://blog.csdn.net/yang3wei/article/details/8577741");//csdn博客
		listUrl.add("http://blog.sina.com.cn/s/blog_6084f5880101801i.html");//新浪博客
		listUrl.add("http://fangxin.blog.51cto.com/1125131/735178");//51博客
		listUrl.add("http://hi.baidu.com/baby_66_/item/a2a7f125598f79daa5275af2");//百度空间
		listUrl.add("http://scholers.iteye.com/blog/728377");//iteye
		
		for (int i = 0; i < listUrl.size(); i ++) {
			String title = getTitle(listUrl.get(i));
			System.out.println(title);
		}
	}
}



原文地址:https://www.cnblogs.com/java20130723/p/3212030.html