Java-Android-jwebee
          Java-Android-jwebee
          對(duì)IT人來說,要成為一個(gè)優(yōu)秀的技術(shù)型管理者,除了需要具備扎實(shí)的技術(shù)基礎(chǔ)之外,還應(yīng)該培養(yǎng)良好的人際關(guān)系能力、談判與溝通技能、客戶關(guān)系與咨詢技能、商業(yè)頭腦和財(cái)務(wù)技能以及創(chuàng)新意識(shí),此外還要有巧妙的激勵(lì)技巧和化解沖突與解決突發(fā)問題的能力.

            :郵件群發(fā)是消息在Internet傳遞的最好辦法,同時(shí)也是垃圾郵件的來源。本文以使用JAVAMAIL為例,討論實(shí)現(xiàn)大規(guī)模郵件發(fā)送的方法和技巧。

          關(guān)鍵字SMTPMIMEJAVAMAIL、群發(fā)郵件

          一、引言

          郵件群發(fā)是Internet生活中最常見的一種信息傳遞方式,其傳遞信息的主動(dòng)性、高效率和低費(fèi)用而被眾多商家廣泛采用。我們的電子郵箱隨之充滿了各種類型的商業(yè)郵件,一般稱這些商業(yè)郵件為垃圾郵件。本文筆者運(yùn)用JAVA語言開發(fā)了一個(gè)基于SMTP服務(wù)器的郵件群發(fā)軟件,在以下內(nèi)容中將逐一介紹SMTP協(xié)議,JAVAMAIL包,以及郵件群發(fā)程序的片段等。

          二、簡單郵件傳輸協(xié)議與JAVAMAIL類庫

          1.簡單郵件傳輸協(xié)議(SMTP)從1982年起被用來在不同計(jì)算機(jī)系統(tǒng)間傳遞電子郵件。SMTP使用簡單的ASCII碼文本命令,命令定義長度為4個(gè)字符。SMTP基本命令集及功能如表一所示。

          命令

          功能

          HELO

          從客戶端打開問候信息

          MAIL

          標(biāo)識(shí)發(fā)件人

          RCPT

          標(biāo)識(shí)收件人

          DATA

          標(biāo)識(shí)郵件開始

          SEND

          向終端發(fā)送郵件

          SOML

          執(zhí)行SENDMAIL命令

          SAML

          執(zhí)行SENDMAIL命令

          RSET

          重置SMTP連接

          VRFY

          驗(yàn)證系統(tǒng)用戶名

          EXPN

          查詢列表和別名

          HELP

          查詢命令列表

          NOOP

          不操作

          QUIT

          終止SMTP連接

          TURN

          變換SMTP角色

          表一

          絕大多數(shù)SMTP系統(tǒng)采用一種標(biāo)準(zhǔn)的郵件報(bào)文格式,即RFC822來“規(guī)范”郵件的形式。RFC822明確的劃分郵件為兩個(gè)部分,一部分稱為郵件頭,起其作用是標(biāo)識(shí)郵件;第二部分是郵件體。

          郵件頭中包括:

          1Received:用來標(biāo)識(shí)將郵件從最初發(fā)送者到目的地進(jìn)行中間轉(zhuǎn)發(fā)的SMTP服務(wù)器,其中含有發(fā)信人及發(fā)信服務(wù)器真實(shí)的信息。

          2Return-path:用來標(biāo)識(shí)郵件發(fā)送到目的服務(wù)器所經(jīng)過的路徑。

          3From:顯示發(fā)信人的地址。格式為Fromuser-name

          4Date:記錄郵件發(fā)送時(shí)間。

          5Destination:記錄收郵件地址, 標(biāo)識(shí)電子郵件的接受方地址,這些地址是純粹地信息,SMTP僅通過RCPT命令發(fā)送信件。包括To主收件人,Cc抄送收件人,Bcc暗抄送收件人,格式為To/Cc/Bccaddress

          6Resent:表示一封郵件處于某中原因需要從客戶端再次發(fā)送。

          2JAVAMAIL關(guān)于郵件操作最新包是JavaMail1.2,有四個(gè)大類,如表二所示。

          javax.mail

          郵件系統(tǒng)模型類

          javax.mail.event

          Javamail API監(jiān)聽和事件處理類

          javax.mail.internet

          Internet郵件系統(tǒng)類

          javax.mail.search

          JavaMail API郵件搜索類

          表二

          這些類操作分別屬于mailapi.jar(文件包含核心API類),smtp.jar(實(shí)現(xiàn)SMTP協(xié)議功能),pop3.jar(實(shí)現(xiàn)POP3協(xié)議功能),imap.jar(包含IMAP協(xié)議功能)等四個(gè)文件。同時(shí)這四個(gè)文件都被包含在mail.jar中,如過圖省事的話,直接包含mail.jar即可。

          如果要實(shí)現(xiàn)帶附件的郵件收發(fā)功能,還需要包含activation.jar,它提供通過二進(jìn)制數(shù)據(jù)流的形式處理MIME類型的訪問。

          三、程序舉例

          1.首先是連接SMTP服務(wù)器,JAVAMAIL1.2不能實(shí)現(xiàn)SMTP服務(wù)的功能,但可以連接已有的SMTP服務(wù)器。

          //創(chuàng)建一個(gè)屬性對(duì)象

                Properties props=System.getProperties();  //創(chuàng)建系統(tǒng)屬性對(duì)象

                 props.setProperty("mail.transport.protocol","smtp");    //設(shè)置使用smtp協(xié)議

                 props.setProperty("mail.smtp.host",server);  //設(shè)置SMTP服務(wù)器地址

                 props.setProperty("mail.smtp.port",""+port); //設(shè)置SMTP端口號(hào)

                 props.setProperty("mail.smtp.auth","true");   //SMTP服務(wù)用戶認(rèn)證

                 //創(chuàng)建一個(gè)過程對(duì)象

          javax.mail.Session sess = javax.mail.Session.getDefaultInstance(props, null);

          2.創(chuàng)建一封新郵件,一般定義該MimeMessage創(chuàng)建一個(gè)郵件對(duì)象。

          MimeMessage msg=new MimeMessage(sess);       //創(chuàng)建郵件對(duì)象

          msg.setSubject(“郵件群發(fā)”)               //設(shè)置郵件主題

          msg.setSentDate(new Date());                 //設(shè)置發(fā)信日期

          msg.setFrom(Address address)               //設(shè)置發(fā)信人

          郵件地址只要符合帶有“@”符號(hào)并且使用“.”分成三段的字符串都會(huì)被SMTP服務(wù)器接受,發(fā)送廣告郵件的商家一般都會(huì)在這里修改發(fā)信人地址,所以我們的收件箱中看見的廣告郵件顯示中發(fā)信人內(nèi)容一些的根本不存在郵件地址。如果想查看真正地發(fā)信人,應(yīng)該查看郵件頭中Received的內(nèi)容。

          //設(shè)置主收件人

          msg.setRecipients(Message.RecipientType.TO,Address toaddress);

          //設(shè)置抄送收件人

          msg.addRecipients(Message.RecipientType.CC,Address coaddress);

          //設(shè)置暗抄送人

          msg.addRecipients(Message.RecipientType.BCC,Address bcoaddress);

          SMTP允許一封郵件有多個(gè)接受者,我們可以利用這個(gè)特點(diǎn),在這三個(gè)收件人中填寫多個(gè)收件人地址來提高大規(guī)模發(fā)郵件效率。另外Bcc這個(gè)字段可以隱藏收件人的地址,你有時(shí)可能發(fā)現(xiàn)郵件的收件人不是自己卻收到了這封郵件,就是利用了暗抄這個(gè)屬性。

          3.郵件體一般分為郵件正文本部分和附件部分。正文部分需要設(shè)置文本的格式,包括text文本類型,messafe報(bào)文類型,image圖象類型,video視頻類型,audio聲音類型,application應(yīng)用程序類型,multipart混合類型等。如下例,

               String m_body;                          //為需要添加文本內(nèi)容

              MimeMultipart content=new MimeMultipart();   //創(chuàng)建郵件體對(duì)象

              if(content==null) return false;

              MimeBodyPart part=new MimeBodyPart();        //創(chuàng)建文本部分對(duì)象

              String type="text/plain";                    //文本類型默認(rèn)為text/plain

              if(m_body.startsWith("<html>") || m_body.startsWith("<HTML>"))

                 type="text/html";             //如果是網(wǎng)頁形式的內(nèi)容,則改變類型為text/html

              part.setText(m_body);

              part.setHeader("Content-Type",type);

              content.addBodyPart(part);

              msg.setContent(content);                     //添加文本至郵件中

          msg.saveChanges();                      //保存修改

          4.如何向的郵件中添加附件,利用多用途互聯(lián)網(wǎng)郵件擴(kuò)展(MIME)協(xié)議可以直接二進(jìn)制數(shù)據(jù)添加到標(biāo)準(zhǔn)的RFC822郵件中。在JAVAMAIL中實(shí)現(xiàn)方法如下,

              String filename;                 //用于存儲(chǔ)文件名稱與存放路徑

              if(filename!=null || filename.length()>0){

                 MimeBodyPart part=new MimeBodyPart();//創(chuàng)建MIME對(duì)象

                 DataSource fds = new FileDataSource(filename); //創(chuàng)建文件流對(duì)象

                 part.setDataHandler(new DataHandler(fds));

             part.setFileName(MimeUtility.encodeText(fds.getName()));

                 content.addBodyPart(part);        //添加二進(jìn)制編碼至郵件體中

                 }

             msg.setContent(content);                  //添加文本至郵件中

          msg.saveChanges();                        //保存修改

          5.郵件的基本內(nèi)容設(shè)置完畢,發(fā)送SMTP電子郵件。

             Transport trans=sess.getTransport();      //創(chuàng)建發(fā)送對(duì)象

             trans.send (msg);                         //發(fā)送

              6.如何群發(fā)郵件,首先我們要有一個(gè)郵件地址列表,郵件地址列表可以向從公共網(wǎng)站獲得,也可以根據(jù)某單位名稱按字典法生成,或者購買用戶表。郵件地址列表應(yīng)該按行存放每個(gè)郵件地址。

          發(fā)信的速度和SMTP的響應(yīng)速度有密切的關(guān)系,所以因該充分利用一封郵件可以有多個(gè)接受地址的條件,將郵件地址按組讀入進(jìn)行發(fā)送,才能提高郵件群發(fā)地效率。下面的例子是每一封信發(fā)給10個(gè)郵件地址。

          import java.io.*;

          import java.net.*;

          import java.util.*;

          import javax.mail.*;

          import javax.activation.*;

          import javax.mail.internet.*;

          class massmail(){

          try{

              FileReader fis = new FileReader(“郵件列表文件”);

              BufferedReader dis = new BufferedReader(fis);

              int i=0;

          while((fileline = dis.readLine())!=null){

            if((i%10)==0)

              MimeMessage msg=new MimeMessage(sess);

          ……

            if((i%10)!=0){                //多個(gè)郵件地址之間要加“,”

                   maillist = maillist + “,” + fileline;

                 }else{

                   maillist = fileline;

                 }

                 i++;

                if((i%10)==0){     //一封郵件在暗抄地址處加10個(gè)收件人

          msg.addRecipients(Message.RecipientType.BCC, maillist);

              ……                        //設(shè)置郵件內(nèi)容

              Transport trans=sess.getTransport();    //創(chuàng)建發(fā)送對(duì)象

            trans.send (msg);        //發(fā)送

          }

          }

          fis.close();

          }catch(Exception error){

          System.out.println("Exception:" + error);

          }



          jwebee

          我的個(gè)人網(wǎng)站
          posted on 2007-07-23 09:26 周行 閱讀(5916) 評(píng)論(0)  編輯  收藏 所屬分類: IT技術(shù)
          Java-Android-jwebee
          主站蜘蛛池模板: 厦门市| 新巴尔虎右旗| 缙云县| 依安县| 灵寿县| 蓝山县| 望谟县| 丰宁| 当阳市| 德州市| 广汉市| 天水市| 苏尼特右旗| 义乌市| 开化县| 铁岭县| 建阳市| 万荣县| 迁安市| 灵川县| 兴化市| 广南县| 兴国县| 怀柔区| 宜宾县| 泗阳县| 遂宁市| 长岭县| 且末县| 抚远县| 汉源县| 久治县| 武强县| 临安市| 孟连| 忻州市| 静海县| 隆德县| 太白县| 湄潭县| 马公市|