很多时候,我们都以类似日志的方å¼åšè®°å½•ï¼Œè€Œå›žé¡¾åŽ†å²æ—¶ï¼Œæˆ‘们想看到的ä¸åªæ˜¯ä¸€æ¡æ¡çš„历å²è®°å½•,更多的是期望能以æŸç§æ–¹å¼å¯¹è®°å½•ä¿¡æ¯åšèšé›†ï¼Œå¹¶æœ‰ç»„ç»‡åœ°ã€æœ€å¥½æ˜¯åŽä¸½ä¸½åœ°å±•现出æ¥ã€‚为这类需求去开å‘web应用,如果ä»é‡‡ç”¨å…¸åž‹çš„Browser <–> Web server <–> Database 的设计(如å¤è€çš„S.S.H.常åšçš„é‚£æ ·ï¼‰æ˜¯ä¸å¥½çš„。
- åŽŸå› ä¸€ï¼Œæ•°æ®åº“大æå°ç”¨ã€‚å•纯的数æ®å†…å®¹åŠ ä¸Šæ›´åŠ å•纯的关系,如果用一关系型数æ®åº“,那真是浪费;
- åŽŸå› äºŒï¼ŒWeb formæäº¤è®°å½•çš„æ–¹å¼æ»æ¿ã€‚日志型的信æ¯ä½•å¿…è¦ä»¥ç™»å½•åŽæäº¤é¡µé¢çš„æ–¹å¼è®°å½•,太过æ£å¼äº†å§ï¼Œä¸ºä»€ä¹ˆä¸æ˜¯å‘一æ¡å¾®åšæˆ–è€…ä¸€å°é‚®ä»¶å°±é¡ºå¸¦ç€è®°å½•了呢?
如果考虑到微åšçš„ç§å¯†æ€§ä¸å¤Ÿï¼Œé‚£ä¹ˆå°±é‚®ä»¶å§ï¼šè®©ä½ çš„é‚®ç®±ä¸ºä½ å¿ å®žè®°å½•ä¸‹è¿™äº›æ—¥å¿—åž‹çš„è®°å½•â€”â€”ç”¨çº¦å®šçš„å—çœ¼ä¸ºé‚®ä»¶æ‰“ä¸Šæ ‡ç¾åŽå‘é€ï¼Œè®©è®¾è®¡çš„webåº”ç”¨ä»Žä½ æŒ‡å®šçš„æ”¶ä»¶ç®±ä¸æŠ“å–æ¤ç±»é‚®ä»¶ï¼Œåˆ†æžå†…容获得历å²è®°å½•,适当地åšä¿¡æ¯èšé›†ï¼Œç„¶åŽå°†ä½ 的记录信æ¯åŽä¸½åœ°å±•现在页é¢ä¸Šï¼ˆæ¯”å¦‚è¿™æ ·ï¼‰ã€‚
应用的设计框架画æˆä¸‹å›¾ã€‚
å¯ä»¥çœ‹åˆ°è®¾è®¡ä¸å¾ˆé‡è¦çš„一点是周期性地将内å˜ç»´æŠ¤çš„æ•°æ®ä¸ŽmailboxåŒæ¥ï¼Œè¿™ä¸€æ¥çš„工作应该是交给独立的åŽå°çº¿ç¨‹åŽ»åšçš„。ä¸é‡‡ç”¨å®žæ—¶è®¿é—®mailboxå–æ•°æ®çš„åŽŸå› æ˜¯æ˜¾è€Œæ˜“è§çš„——慢,并å‘å°±æ›´éš¾äº†ï¼›åŒæ—¶ï¼Œè€ƒè™‘到记录本身的数æ®é‡ä¸å¤§ï¼Œå®žæ—¶æ€§ä¹Ÿæ— è‹›æ±‚ï¼Œæ‰€ä»¥ç»´æŠ¤å†…å˜æ•°æ®åº“在这里å分划得æ¥ã€‚
è¿™ç§è®¾è®¡çš„好处还有:
- 多个用户的记录都通过邮件å‘é€åˆ°åŒä¸€ä¸ªé‚®ç®±ï¼Œé‚®ä»¶æœ¬èº«é™¤äº†æ ‡é¢˜å†…容之外还记录了å‘ä»¶äººã€æ—¶é—´ç‰ï¼Œæˆ‘们的web应用å¯ä»¥ç›´æŽ¥åˆ©ç”¨å®ƒä»¬ï¼›
- 通常web应用都ä¸å…被基于数æ®åº“çš„CRUDå›°ä½è„±ä¸å¼€èº«ï¼Œè€Œä¸Šå›¾çš„è®¾è®¡å´æ²¡æœ‰ä¸ºæˆ‘们这个需求简å•的应用添麻烦,开å‘äººå‘˜å¯æŠŠç²¾åŠ›æ›´å¤šåœ°æ”¾åœ¨æå–ä¿¡æ¯å’Œåˆ›å»ºä¸°å¯Œçš„页é¢å±•现上。
最åŽå›žå½’到代ç 。使用“mail.jarâ€è®¿é—®é‚®ä»¶çš„代ç å¯ä»¥å‚考下é¢çš„demo. ä¸è¦é”™å¼•或多引关于mailçš„jaråŒ…å“¦ï¼Œå› ä¸ºç–忽曾引入了两个ä¸åŒçš„但都关于mailçš„jar包,以致跑起的程åºå–ä¸åˆ°é‚®ä»¶å´åˆä¸æŠ¥é”™è¯¯ï¼Œæœ¬äººåƒè¿‡è¿™ä¸ªäºäº†ï¼Œæ‰€ä»¥å¸Œæœ›è¯»è€…å°å¿ƒã€‚
import com.sun.security.sasl.Provider import java.security.Security import java.util.Properties import javax.mail._ class MailFetcher { def connect(username: String, password: String) : Store = { Security.addProvider(new Provider) val SSL_FACTORY: String = "javax.net.ssl.SSLSocketFactory" val pop3Props: Properties = new Properties pop3Props.setProperty("mail.pop3.socketFactory.class", SSL_FACTORY) pop3Props.setProperty("mail.pop3.socketFactory.fallback", "false") pop3Props.setProperty("mail.pop3.port", "995") pop3Props.setProperty("mail.pop3.socketFactory.port", "995") val session = Session.getInstance(pop3Props, null) val store = session.getStore("pop3") store.connect("pop.gmail.com", 995, username, password) store } def fetchMailsFromFolder(folderName: String, store: Store) : Array[Message] = { val folder = store.getFolder(folderName) folder.open(Folder.READ_ONLY) folder.getMessages(); } def printMessagesInfo(messages: Array[Message]) { printTotalCount(messages.length) printSubjects(messages) } private def printTotalCount(count: Int) { println("Total count of emails: " + count) } private def printSubjects(messages: Array[Message]): Unit = { messages.foreach(msg => println(msg.getSubject)) } } object MailFetcher { def main(args: Array[String]) { val mailFetcher = new MailFetcher val store = mailFetcher.connect("your.account@gmail.com", "your.password") val messages = mailFetcher.fetchMailsFromFolder("INBOX", store) mailFetcher.printMessagesInfo(messages) } }