第一篇:讀書筆記《Java郵件開發詳解》
讀書筆記《Java郵件開發詳解》
DNS
MX
自動回復 不填from 避免循環回復。
Pop3:可以查郵件總數、已占空間。
電子郵件的RFC822格式:
Return-Path:代表郵件的回復地址,該字段的內容由接收郵件的SMTP服務器填寫,接收郵件的SMTP服務器從郵件發送程序發出的mail form命令中獲得內容。
Received:通常格式是:Received from A by B for C,A為發送方,B為接收方,C為收件人的郵箱地址。常常被用來追蹤郵件傳輸的路線和分析郵件的來源。From:
To:
Subject:
Date:
Cc:
Bcc:
郵件的頭字段可以擴充成MIME類型。Content-Type: multipart/mixed;頭字段指定編碼方法。另外,也定義了郵件頭字段的內涵。
MIME消息的頭字段具體資源的數據類型和組合消息的組合關系,都是通過消息頭中的Content-Type頭字段來指定的,格式為“主類型/子類型”的形式出現,主類型有text、image、audio、application、multipart、message等;每個主類型下面又都有好多子類型。
MIME消息可以有三種組合關系:
Multipart/mixed 混合組合 內容可以是文本、附件等等。
Multipart/related 關聯組合 如郵件正文要使用HTML代碼引用內嵌的圖片資源。意思是說某些資源要關聯引用另外的資源。
Multipart/alternative 選擇組合這三種關系是可以隨意嵌套的,比如你寄一個復雜的盒子出去,這個盒子里面可以有好多好多小盒子,而每個盒子都可以看作一個MIME。
其他的頭字段都是顧名思義的,略!
設置內容的另一種方法:
setContent(Object object, String type)
setContent(body, “text/html;charset=gb2312”);
另外一種客戶端的發信方式:SMTP服務器功能的郵件發送程序
具有SMTP服務器功能的郵件發送程序會根據收件人地址的域名,直接連接到該域的SMTP服務器和進行郵件發送。根本用不到??
JNDI:命名式:把對象綁定到context中;目錄式:保存對象的屬性信息實際應用中命名式和對象式常常結合使用。
Tomcat可以通過配置文件自己創建javax.mail.Session
META-INF/context.xml
auth=”Container” type=”javax.mail.Session” mail.smtp.host=”smtp.sina.com.cn” mail.transport.protool=”smtp” mail.smtp.auth=”true” /> 在web.xml中說明一下,有資源是被tomcat創建的,如果換了別的應用服務器也要創建。 不知道書上為什么費那么大勁找個Session出來,還是個沒有校驗的Session,收發郵件時都得再寫用戶名密碼給服務器。為什么不隨便new一個或者從System中調一個呢?感覺基本用不著,我自己寫一個properties文件豈不是更好? JAF 對于通過JAF封裝的數據,應用程序通過JAF提供的接口可以完成如下功能:。訪問數據源中的數據 。獲知數據源的數據類型 。獲知可對數據源進行的各種操作 。用戶對數據源執行某種操作時,自動創建執行該操作的軟件部件的實例對象 好像是用來封裝數據源的(比如:聲音文件,java文件),這樣的好處是?可以識別文件類型對文件直接操作?不知道,回頭再看看。好像是附件用的,ms。 郵件搜索 用于創建邏輯組合關系的類AND、OR、NOT、Comparison 用于創建具體搜索條件的類DATE、CONTENT、HEADER 例:SearchTerm st = new AndTerm(new FromStringTerm(“zx@sina.com”),new ReceivedDateTerm(ComparisonTerm.EQ, new Date())); 這里主要說明ComparisonTerm類,常用于日期類的比較其中使用留個常量來標識六種不同的操作:EQ(=)、GE(>=)、GT(>)、LE(<=)、LT(<)、NE(!=)郵件的解析與顯示 如果Message的類型是“text/*”直接顯示之。如果Message的類型 (getContentType())是“multipart/mixed”,調getContent()方法得到Multipart,對其調getCount()看看其中有多少個BodyPart,遍歷之;當MIME類型為“text/*”顯示之,當MIME是圖片、聲音或附件等二進制時,調 getDataHandler方法得到封裝數據的對象,然后調其getInputSteam??.;當MIME類型為“mutlipart/mixed”再次遍歷得到其中的BodyPart。 注意:Message.isMimeType(“multipart/*”)這個方法居然可以寫通配附?!看看API的解釋:If the subType of mimeType is the special character '*', then the subtype is ignored during the comparison.。 處理內嵌類型的multipart(multipart/related)直接交給IE瀏覽器去顯示就好了: response.setContentType(”message/rfc822”); message.writeTo(response.getOutputStream()); 總結: 總的來說這本書講的很基礎,前半部分告訴我們什么是email、email是如何收發的及email的格式、著重說明了smtp協議和pop3協議,甚至告訴大家怎么使用協議的命令收發郵件,這些對于使用API做web開發的程序員來說用處不是很大,但第3章郵件的組織結構講述的還是比較好的;后半部分主要對Javamail進行說明,但是我個人覺得不如IBM的在線教程介紹的實用,主要是例子寫的別扭,呵呵。不過里面有一些細節可以起到拓寬知識面的作用。 此書對開發webmail用處不是很大,比如對于pop3協議來說,如何標記郵件,如何建立文件夾,如何移動郵件,甚至通訊錄什么的都一點也沒有提到,講郵件搜索的時候沒有說郵件過濾能不能通過搜索實現或者還是有更好的辦法。更深入一點的比如用工廠模式解耦合、使用線程池提高性能等更是只字未提。哎~看來還得再找找,實在不行就操作數據庫,那樣麻煩很多但是應該什么都能實現。最近看webmail看的很不爽,網上這樣的東西也很少,感覺沒有一個套路...郁悶~~ 讀書筆記 1、類和對象:類是用來定義一組對象共同具有的狀態和行為的模版。而對象是現實世界中個體或事物的抽象表示,并且封裝了它們的屬性和行為。 2、為了防止命名沖突,Java采用了管理類文件的機制,即類包機制。(package)定義包名的語法格式: “package包名;” Java命名規則要求包的命名需要使用小寫字母。 3、成員變量和成員方法: 1成員變量是在類體中定義的變量即全局變量,○成員變量一般用于定義對象的狀態。成員變量是給對象使用的,每個對象被創建后都會有屬于自己的屬性,即成員變量。通過修改這些屬性,從而改變對象的某個狀態。 2成員方法是對象行為的描述?!?/p> 定義成員方法的語法格式: “[修飾符] 返回值類型方法名([形參表]){ ······//方法體 }” 修飾符:可以是:publicprivateprotactedstaticfinall等; 返回值類型:如果方法需要返回值,必須這里聲明方法的返回值類型,可以是基 本數據類型(int short double booleanvoid等),也可以是對象 類型如:數組、字符串等。 形參表:(可選部分)說明方法被調用時應該向它傳遞的數據。形參表可以有一 個也可以有多個,當有多個形參時每個形參之間要用“,”隔開。 1創建對象:創建對象使用到new語句。 4、對象:○ 聲明并創建對象的語法格式如下: “類名對象名=new 類構造方法()” 構造方法:構造方法是類創建對象是必須執行的方法,用于構造一個新的對象并 初始化對象屬性。 2訪問對象的屬性: ○ 語法格式: “對象名.屬性” 3執行對象的行為:○對象的行為就是對象的成員方法,通常說調用或執行對象的某個方法。 語法格式: “對象名.成員方法名();” 4對象的銷毀:Java提供了垃圾回收機制,對不再使用的對象會自動銷毀,也可○ 以在程序中顯式的為某個對象賦null值,使對象不再被使用。 垃圾回收機制會找到并銷毀它,釋放該對象所占用的資源。 語法格式: “對象名=null” 1創建類:Java中使用class關鍵字來創建類。 5、類:○ 聲明并創建類的語法格式: “權限修飾符 class類名{ 類體; }” 權限修飾符:(可選項)可以使用public protected private 或者省略這3者。類體主要由成員變量和方法兩部分組成。 2成員變量:在Java中對象的屬性也稱為成員變量?!?/p> 聲明并創建成員變量的語法格式: “權限修飾符數據類型成員變量名;” (用static關鍵字定義的成員變量被稱為靜態成員變量即類變量。靜態成員變量不是分配給每個對象的,而是屬于累的變量。它在內存中是唯一的,可以直接使用“類名.成員變量名”的格式去訪問,他在內存中的位置是固定的,是該類的所有實例對象所共享的存儲單元。) 3成員方法:在Java語言中使用成員方法對應與類對象的行為。○ 定義成員方法的語法格式: “權限修飾符返回值類型方法名(參數類型參數名){ ·······//方法體 }” (同類變量一樣,由static關鍵字定義的成員方法被稱為類方法,類方法可以不必創建對象而由類直接訪問,靜態方法不可以直接調用非靜態方法)4局部變量:○在方法體中聲明的變量為局部變量,局部變量的有效范圍為方法體結束。 5this關鍵字:在Java語言中用this關鍵字來代表類對象的引用,this關鍵字被○ 隱式地用于引用對象的成員變量和方法。(在類方法中不可以使用this關鍵字。)this關鍵字和和對象都可以調用成員變量和方法,兩者的區別: 事實上,this引用的就是本類的一個對象,在局部變量或方法參數覆蓋了成員變量時,就要添加this關鍵字明確引用的是類成員還是局部變量的方法參數。6類的構造方法:構造方法與類同名?!?/p> 7類的主方法:主方法是類的入口點,它定義了程序從何處開始;主方法提供對○ 程序流向的控制,Java編譯器通過主方法來執行程序。 1)主方法是靜態的,所以如果要直接在主方法體中 調用其他方法,則該方法必須也是靜態的。 2)主方法沒有返回值。 3)主方法的形參為數組。其中args[0]~args[n]分別 代表程序的第一個參數到第n個參數,可以使用 args.length獲取參數的個數。 Java中完整的類聲明格式: “權限修飾符class類名{ 權限修飾符數據類型成員變量名1; 權限修飾符數據類型成員變量名2; ······· 權限修飾符數據類型成員變量名n; 權限修飾符返回值類型成員方法名1(形參類型形參變量){ 方法體 } 權限修飾符返回值類型成員方法名2(形參類型形參變量){ 方法體 } ······ 權限修飾符返回值類型成員方法名n(形參類型形參變量){ 方法體 } }” 6.由于類的主方法是靜態方法所以不可以調用類中的非靜態方法所以當需要調用非靜態方法時必須創建對象來調用。在輸入不同類型的數據時要使用不同的Scanner類對象,否則只能實現輸入一種數據類型。 7.abstract關鍵字是定義抽象類的關鍵字。使用abstract定義的發放成為抽象方法。抽象方法沒有方法體。抽象方法的唯一意義就是被重載。 個 人 簡 歷 個人信息 姓名:xxxxxxx性別:x 電話:187-xxx7-xxxx年齡:22 郵箱: lxxxxxxx@xxx.com專業:軟件技術應聘職位 Java軟件開發工程師 專業技能 熟練掌握CoreJava編程,具有扎實的編程功底和良好的編碼習慣 熟練掌握ssh(Struts2+hibernate+Spring)等輕量級框架 熟悉MVC開發模式 熟練使用Eclipse/MyEclipse工具進行Java軟件開發 熟練Unix/Linux環境下Java的應用軟件開發 熟練掌握MySQL、Oracle等數據庫操作,能編寫常用SQL語句 熟悉軟件開發的主要流程,可以根據指定要求快速完成設計、編碼等工作了解xml、HTML、JavaScript、Ajax技術 項目經驗 一、通用電子商務平臺(當當網購物系統) 開發環境:Linux 開發工具:MyEclipse8.6,Tomcat,MySQL 技術實現:Struts2+Hibernate+Spring+JavaScript+JSP+AJAX 項目描述:此系統為網上購物系統,用戶可以用過該系統實現網上購物、注冊、登錄、瀏覽商 品、訂貨、生成訂單功能。也包括對普通商品增刪改查功能和購物車內書的數量的增刪改功能。 責任描述:獨自完成項目的整個開發過程 用戶模塊包括登錄與注冊,主要使用了AJAX對其輸入的信息進行驗證,結合Hibernate存儲和驗證用戶登錄等。 商品列表模塊主要是用List集合來展示商品。 購物車模塊則是使用Session技術來保存購物車,通過Struts2調用不通方法來操作購物車中的商品集合,實現對購物車的增刪改查。 訂單模塊主要是用Hibernate對用戶所買商品的記錄進行存儲。 經驗總結:這個項目讓我們把我們所學習的三大框架以及JS,Ajax等都聯系起來。尤其是使用 Hibernate經常出現異常,在和組內成員討論中逐步解決問題,并且更加完善代碼。 通過這個項目不僅提高我個人能力,而且還促進了與他人合作的能力。 二、教學管理系統 開發環境:Linux 開發工具:MyEclipse8.6,Tomcat,MySQL 技術實現:Struts2+JavaScript+JDBC+AJAX 項目描述:項目實現了管理員對教師信息的增刪改查和對學生選課的管理 責任描述:獨立完成該項目的設計和實現,主要應用MVC模式的設計思想對項目進行劃分。 采用JDBC對教師信息進行增刪改查,在學生選課模塊,使用到了Ajax來對選課進 行檢驗。 經驗總結: 通過該項目讓我對MVC設計模式有了更深一步的認識。在數據的存儲方面尤其是 對JDBC對數據存儲的亂碼問題。通過與組內成員的不懈努力將其克服。極大的鍛 煉了自己團隊合作能力,項目計劃能力以及寫文檔的能力獨立解決問題的能力。 三、其它項目:BBS論壇,交友網等 實習經歷 2011/12 — 2012/05北京xxx科技Java工程師實習生 教育背景 2010/09―2012/07開封大學軟件技術 所獲證書 C+ E國際軟件工程師Java培訓證書 自我評價 專業技能:雖然在大學里,我學習的是軟件技術專業,已經具備了一些專業方面的基礎知識。但是想在行業中有更好的發展就必須學習更多與企業應用相關的知識,所以我選擇來達內進行培訓。在學習期間,我踏實勤奮,按時完成課后練習及作業,不斷的積累代碼量,同時也能幫同學解決一些力所能及的問題。遇到難題能夠主動動手查閱資料,解決問題。通過項目實戰提高我的個人能力和團隊協作能力。 綜合能力:性格比較沉穩,為人誠懇,不怕吃苦,有高度的責任心和團隊合作精神。對環境的適應能力強,有較強的團隊意識和集體榮譽感,做事情比較認真仔細,對每一件事情都能認真對待,能很好的自我調節。樂于學習新的知識與技術。 1、編寫程序 題目:古典問題:有一對公母豬,從出生后第3個月起每個月都生一對豬,小豬長到第三個月后每個月又生一對豬,假如豬都不死,問每個月的豬總數為多少? 答案: public class lianxi01 { public static void main(String[] args){ System.out.println(“第1個月的兔子對數: 1”); System.out.println(“第2個月的兔子對數:1”); int f1 = 1, f2 = 1, f, M=24; for(int i=3;i<=M;i++){ f = f2; f2 = f1 + f2; f1 = f; System.out.println(“第” + i +“個月的兔子對數: ”+f2); } } } 2、是非題 2.1 Java程序中的起始類名稱必須與存放該類的文件名相同。() 答案:正確 2.2 原生類中的數據類型均可任意轉換。() 答案:錯誤 3、問答題 3.1 try {}里有一個return語句,那么緊跟在這個try后的finally {}里的code會不會被執行,什么時候被執行,在return前還是后? 答案: 會執行,在return前執行。 3.2 sleep()和 wait()有什么區別: 答案: sleep是線程類(Thread)的方法,導致此線程暫停執行指定時間,給執行機會給其他線程,但是監控狀態依然保持,到時后會自動恢復。調用sleep不會 釋放對象鎖。wait是Object類的方法,對此對象調用wait方法導致本線程放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象發出notify方法(或notifyAll)后本線程才進入對象鎖定池準備獲得對象鎖進入運行狀態。 4、數據庫題 聚集函數的應用 編寫一條sql語句,希望從藝術家表artist_tab中,看到只有一個專長specialty的是哪些專長 答案:seelctspecialty from artist_tab group by specialty having count(*)=1’; commons-fileupload-1.1.1.jar 上傳文件總結: 1、驗證是否要處理的是上傳文件 ServletFileUpload.isMultipartContent(request) 2、創建DiskFileItemFactory 對象并對其初始化設置 DiskFileItemFactory factory = new DiskFileItemFactory(); factory.setSizeThreshold(20 * 1024); factory.setRepository(factory.getRepository()); 3、創建ServletFileUpload 對象并設置其編碼方式 ServletFileUpload upload = new ServletFileUpload(factory); upload.setHeaderEncoding(“gbk”); 4、開始獲取上傳文件的集合: formlists = upload.parseRequest(request); 5、設置上傳文件允許的大小 int size = 2 * 1024 * 1024; 6、循環遍歷formlists集合來根據其元素的類型(普通表單域還是文件域)進行賦值還是上傳功能 Iterator iter = formlists.iterator(); while(iter.hasNext()){ FileItem formitem =(FileItem)iter.next(); 7、是文件域則執行上傳: 具體做法:(1)、獲取文件路徑全名:String name = formitem.getName(); (2)、判斷文件名后綴是否符合要求:!name.endsWith(“mp3”) (3)、判斷文件大小是否符合要求formitem.getSize()> size If/else(4)、都符合要求則上傳: 第一步:判斷文件的名稱不能為空(formitem.getName())、大小不能為0 (formitem.getSize()),如果不符合要求則continue執行下一循環 第 二步: 獲取文件的單純文件名稱: name.substring(name.lastIndexOf(“”) + 1, name.length()); 第 三步: 設置保存到的服務器地址:fileDir(“file/”)+ “” + 單純名稱;File saveFile = new File(服務器地址); 第 四步: 上傳: formitem.write(saveFile);、是普通表單域則將表單項的值賦值給相關對象變量,如JavaBean(每一次循環將該次對應的表單項的值付 給適當的變量對象) String formname = formitem.getFieldName();獲取普通表單項的名稱 String con = formitem.getString(“gbk”); 用formname.equals(““)來判斷 下載文件具體方法: 1、獲取服務器下載地址并將此地址字符串進行編碼: String path=request.getParameter(“path”); 2、創建下載目錄: File file = new File(path);獲取普通表單項的值并編碼 path=new String(path.getBytes(“iso-8859-1”)); 3、創建文件字節輸入流 InputStream in = new FileInputStream(file); 4、創建輸出流對象 OutputStream os = response.getOutputStream(); 5、設置該輸出流的應大頭、編碼等配置 response.addHeader(“Content-Disposition”, “attachment;filename=” + new String(file.getName().getBytes(“gbk”),“iso-8859-1”)); response.addHeader(“Content-Length”, file.length()+ “");response.setCharacterEncoding(”gbk“); 6、開始下載: int data = 0; while((data = in.read())!=-1) { os.write(data);} 7、關閉輸入輸出流 os.close(); in.close(); 郵件接收的方法: DAO: 1、創建郵件接收類:Store 思路:創建Properties類并添加屬性->創建Session對象->創建store對象并連接到服務器和編寫關閉方法 2、獲取全部已讀郵件的名稱集合的方法 返回String3、獲取全部已讀或未讀郵件的內容的方法返回List(包含郵件信息和附件狀態,但不包含具體附件內容)思路: 獲取Store對象->獲取POP3Folder對象->打開POP3Folder郵件夾->創建FetchProfile預提取對象并對其添加兩個常用屬性->定義Message[]對象數組并設為null->獲取全部已讀郵件的uid字符串->若字符串不為空則->轉換為數組并進行排序->根據要求的已讀或者未讀條件來獲取全部已讀或未讀郵件信息給Message[](folder.search)->后退三步-若字符串為空則->獲取全部未讀郵件信息Message[]---?開始提取上述郵件數組中每一個郵件的詳細信息->循環遍歷Message[]數組->定義MimeMessage對象并賦值為數組元素->獲取郵件ID、發件人、郵件時間->根據編碼類型獲取郵件主題->由自定義方法獲取此郵件的附件對象(String[])->message[i].getFlags().getSystemFlags().toString();->如果判斷返回的郵件有附件,則獲取附件設置為1,否則設置為0(來控制頁面中的附件圖標的顯示)->將此郵件信息對象添加到List中。 4、向數據庫中添加已讀郵件的標記的方法:iduid address5、獲取指定郵件中附件的方法:此方法中重點是對郵件內容的編碼處理,故這里重點介紹主要功能語法: 思路:(1)定義該郵件名稱對應的所有附件連接字符串為超鏈接(附件之間用空格隔開)(String,由多個”附件序號=&附件名稱=&郵件序號”組成),定義郵件名稱字符串(已知條件) (2)Multipart multipart =(Multipart)part.getContent();得到該郵件所有的內容集合,然后對其遍歷以獲取每一個multipart中每一個BodyPart->判斷此BodyPart是否為附件,若是附件則獲取該附件的名稱 并添加到(1)中的連接字符串中,連接字符串中附件序號為遍歷變量j 最后: int counts = multipart.getCount(); BodyPart對象的個數 //返回MimeMultipart對象中保存的//關閉流 response.setContentType(”application/octet-stream“); for(int i = 0;i < counts;i++){} getMailAttach(multipart.getBodyPart(i), emailv); 并返回String[] obj = { 郵件主題內容, fileName1 }; 6、對輸入的UTF7編碼的內容進行轉碼的方法 Servlet: 下載附件servlet: 思路:設置response.setContentType(”text/html;charset=GBK“)、request.setCharacterEncoding(”GBK“)->創建HttpSession對象->創建ServletOutputStream對象->獲取頁面傳遞變量:附件序號、附件名稱;獲取session變量”message“->將附件名稱進行編碼處理:filename=new String(filename.getBytes(),”ISO-8859-1“)->response.setHeader(”Content-Disposition“,”attachment;filename=“+filename)->由”message”獲取Multipart對象->由Multipart對象獲取BodyPart對象->由BodyPart對象獲取InputStream對象->開始下載: int c=0; while((c=is.read())!=-1){out.write(c);} 收取郵件servlet(郵件的全部具體信息): 1、郵箱登陸的驗證方法: 思路:獲取表單傳遞值的host username pwd->用DAO(1)中的方法進行用戶驗證如果正確->創建HttpSession對象->用session.setAttribute的方法保存登陸的用戶信息(以上三個)-> store.close(); 2、獲取當前分頁頁面中已讀或未讀的全部郵件的集合(包含郵件信息和附件狀態,但不包含具體附件內容)思路:創建HttpSession對象,并獲session變量host username pwd和request變量”flag“和”Page“-> request.setAttribute(”flag“, flag)->根據request變量”page”來判斷是否已經開始分頁瀏覽->若沒有則先執行DAO(3)方法獲取已讀或未讀的全部郵件集合,然后執行自定義分頁類中的初始化方法獲取上述集合中的第一頁中的郵件集合,并request.getSession().setAttribute(”pagination", 分頁類的實例化);->若已經開始分頁,則將當前頁page賦值為已經存在的session類型的分頁類對象中的getPage方法中返回的page,并且執行自定義分頁類中的類似初始化方法的獲取當前頁面集合的方法(具體看程序) 3、查看郵件詳細信息:(獲取指定郵件的信息) 思路:同DAO(3)中的方法相似 不同之處是:DAO(3)查詢的是全部已讀或未讀 而本案查詢的是指定的郵件ID TOOLS: 本案中主要為分頁類的編寫: 1、初始化獲取第一頁的集合2、獲取已分頁的當前頁面的集合3、獲取全部記錄數 4、獲取最大頁數 5、獲取當前頁數 6、獲取分頁導航第二篇:Java讀書筆記
第三篇:JAVA開發個人簡歷
第四篇:java開發面試題
第五篇:java web郵件學習