一.é‚®äšgçš„å‘é€?br /> ½W¬ä¸€ä»¶è¦çŸ¥é“的事情是,ä½ çš„SMTPæœåŠ¡å™¨çš„ä¸ÀLœºå?它负责将您的邮äšgå‘é€åˆ°å¤–部世界的机å™?一般æ¥è¯´è¿™äº›æœåŠ¡å™¨éƒ½ç¬¦åˆå‘½åä¹ æƒ?比如,å¦‚æžœä½ çš„é‚®ç®±æ˜?a href="mailto:acmilan@sina.com.cn">acmilan@sina.com.cn,那么SMTPæœåŠ¡å™¨çš„ä¸ÀLœºå则是smtp.sina.com.cn;å¦å¤–也å¯ä»¥å‚考å„大网站自å·Þqš„说明.ä¸ÞZº†æ–¹ä¾¿,下文ä¸ä»¥¾|‘易邮箱ä¸ÞZ¾‹.
 JavaMail使用了Session¾cÈš„概念æ¥ä¿å˜è¯¸å¦‚SMTPä¸ÀLœºå’Œè®¤è¯çš„ä¿¡æ¯åQŒä¸»è¦æƒ³æ³•是åŸÞZºŽä¼šè¯åQˆSessionsåQ‰åœ¨Java虚拟æœÞZ¸å¯ä»¥è¢«é𔼛»ï¼Œ˜q™å¯ä»¥é˜»æ¢æ¶æ„代ç 窃å–其他用户在其他会è¯ä¸çš„ä¿¡æ¯åQŒè¿™äº›ä¿¡æ¯å¯èƒ½åŒ…括用户å和密ç ç‰è®¤è¯ä¿¡æ¯.ä½ æ‰€è¦å‘é€çš„é‚®äšgž®†ä¿å˜åœ¨ä¸€ä¸ªMessage对象ä¸?而这个Message对象则是ç”׃½ æ‰€æž„é€ çš„session实例æ¥åˆ›å»?br /> è¦å¾—åˆîC¸€ä¸ªç‰¹å®šçš„session对象,å¯ä»¥é€šè¿‡ä¸€ä¸‹ä»£ç ?
     //讄¡½®session的属æ€?br />     Properties pro = new Properties();
     pro.put("mail.transport.protocol", "smtp");
     pro.put("mail.smtp.auth", "true");
     pro.put("mail.smtp.host", "smtp.126.com");
     pro.put("mail.host", "126.com");
    Â
     //讄¡½®è®¤è¯å™?br />     PopupAuthenticator pop = new PopupAuthenticator();
     pop.performCheck("My Name", "My Password");//ä½ çš„å¸æˆ·å’Œå¯†ç ?br />    Â
     //得到session
     Session mailSession = Session.getInstance(pro, pop);
Â è¦æ³¨æ„çš„æ˜?ä¸ÞZº†é¿å…垃圾邮äšg,大多数的smtpæœåŠ¡å™¨éœ€è¦è®¤è¯?SMTP认è¯(SMTP AUTH)需è¦ç”¨æˆ·åå’Œå¯†ç æ¥å‘é€é‚®ä»?å› æ¤,必须在sessionçš„åˆå§‹åŒ–傿•°ä¸è®¾¾|®ä¸€ä¸ªè®¤è¯è€…(AuthenticatoråQ‰æ¥˜q”回所需的认è¯è¯ä¹?具体代ç å¿…é¡»ç”Þp‡ªå·±æ¥å®žçް:
    class PopupAuthenticator extends Authenticator {
      String username = null;
      String password = null;
      public PopupAuthenticator() {}
      public PasswordAuthentication performCheck(String user, String pass) {
        username = user;
        password = pass;
        return getPasswordAuthentication();
       }
      protected PasswordAuthentication getPasswordAuthentication() {
        return new PasswordAuthentication(username, password);
       }
     } 接ç€,ž®±å¯ä»¥ç”¨ä¹‹å‰å¾—到的sessionæ¥æž„é€ Message对象:
   Message msg = new MimeMessage(mailSession);Â
 在ä‹É用会è¯åˆ›å»ÞZº†ä¸€ä¸ªMimeMessageå?æˆ‘ä»¬éœ€è¦æ¥å¡«å……˜q™ä¸ªæ¶ˆæ¯.首先是设¾|®è¡¨å¤´ä¿¡æ?Message¾cÕd®šä¹‰äº†é‚®äšg¾pÈ»Ÿä¸ä‹É用的属æ€?ç”±åå?值对¾l„æˆ,使用˜q™äº›åå—-值å¯ä»¥æŒ‡å®šé‚®ä»¶è¡¨å¤´ä¿¡æ?Javamailæä¾›äº†ä¸€¾pÕdˆ—api用于讄¡½®å¸¸è§çš„邮件表å¤?å…¶ä¸åœ¨æ¶‰åŠåœ°å€çš„æ“ä½œæ—¶,我们用InternetAddressæ¥è¿›è¡Œå°è£?
     msg.setFrom(new InternetAddress ("acmilan@126.com");
     msg.setSubject("Hello");
     msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("intermilan@126.com", false));
     msg.setText("I will beat u");
     msg.setSentDate(new Date());
     //å‘逿¶ˆæ?br />     Transport.send(msg);
 对Transport¾cÈš„调用ž®†ä¼šåŽÀLŸ¥æ‰ùN€‚当的会è¯ï¼Œòq¶æ‰¾å‡ºå¦‚何å‘逿¶ˆæ¯ï¼Œž®½ç®¡˜q™æ ·åšçœ‹ä¸ŠåŽ»æœ‰äº›ä¸ç›´è§‚。当我们完战q™ä¸€æ¥çš„æ—¶å€™ï¼Œæˆ‘们的邮件就已ç»å‘é€å‡ºåŽÖMº†ã€‚æ¤æ—Óž¼Œæˆ‘们˜q˜éœ€è¦æ·»åŠ ä»£ç æ¥æ•获三ç§JavaMailå¯èƒ½æŠ›å‡ºçš„异常,它们是AddressExceptionã€MessagingExceptionå’ŒUnsupportedEncodingException. 但这ž®±æ˜¯æœ€åŸºæœ¬çš„ä‹É用JavaMailå‘é€é‚®ä»¶çš„æ–ÒŽ³•ã€?br /> 有时候我们还需è¦ç»™é‚®äšgæ·ÕdР附äšg.å†å›žåˆîC¹‹å‰å¯¹Message的讨è®ÞZ¸,Messageå¯¹è±¡åŒæ ·å®šä¹‰äº†é‚®ä»¶çš„内容,它å¯ä»¥å®šä¹‰ä¸€ä¸ªæ¶ˆæ¯å†…å®?也å¯ä»¥å®šä¹‰å¤šä¸ªæ¶ˆæ¯å†…å®?消æ¯å†…容(通常指的是附ä»?都将由DataHandle下的¾cÀL¥å¤„ç†.Message对象由Multipart¾l„æˆ,一个Multipartå¯å«æœ‰å¤šä¸ªBodyPart,˜q™äº›BodyPartž®†ç”¨æ¥ä¿å˜æ–‡æœ¬ä¿¡æ¯å’Œé™„äšg.
     MimeMultipart multipart = new MimeMultipart();
     BodyPart msgBodyPart = new MimeBodyPart();//ç”¨æ¥æ”„¡½®æ–‡æœ¬å†…容
     msgBodyPart.setContent(message, "text/plain");
     BodyPart attBodyPart = new MimeBodyPart();//ç”¨æ¥æ”„¡½®é™„äšg
     DataSource ds = new FileDataSource(new File("c:/td.txt"));
     attBodyPart.setDataHandler(new DataHandler(ds));//讄¡½®DataHandler
     attBodyPart.setFileName("bsbs.txt");//附äšg的显½Cºåå?br />     multipart.addBodyPart(msgBodyPart);
     multipart.addBodyPart(attBodyPart);
     msg.setContent(multipart);
     Transport.send(msg);
  最å?我们æ¥çœ‹çœ‹å¦‚何å‘é€HTMLæ ¼å¼çš„é‚®ä»?æ–‡æœ¬çš„æ ¼å¼å¿…™åÈ›¸åº”的讄¡½®ä¸ºtext/html,é‚®äšgä¸çš„囄¡‰‡ž®†ä»¥é™„äšgå½¢å¼åŠ è²,å¦å¤–˜q˜è¦æŒ‡å®šä¸€ä¸ªå†…部ID以供调用;
     MimeMultipart multipart = new MimeMultipart();
     BodyPart msgBodyPart = new MimeBodyPart();
     //讄¡½®æ ¼å¼ä¸?text/html"
     msgBodyPart.setContent("<H1>Hi! From HtmlJavaMail</H1> <img src=\"cid:logo\"/>", "text/html");
     BodyPart embedImage = new MimeBodyPart();
     DataSource ds = new URLDataSource(new URL("     embedImage.setDataHandler(new DataHandler(ds));
     //讄¡½®è¡¨å¤´çš„内部ID,注æ„,所讄¡½®å†…å®¹å¿…é¡»ä¸Žå‰æ–‡å¯¹åº?在æ¤å¤?剿–‡çš„å¼•ç”¨äØ“<img src=\"cid:logo\"/>,å› æ¤Content-ID表头对应
     //的应该是<logo>
     embedImage.setHeader("Content-ID", "<logo>");
     multipart.addBodyPart(msgBodyPart);
     multipart.addBodyPart(embedImage);
     msg.setContent(multipart);
  ˜q™æ ·,一ž®HTMLæ ¼å¼çš„邮件便完æˆäº?br />     Transport.send(msg);
äº?é‚®äšg的收å?br />Â åŒæ ·,½W¬ä¸€æ¥è¿˜æ˜¯è¦èŽ·å¾—æœåŠ¡å™¨çš„åå—.我们˜q˜æ˜¯ä»¥ç½‘æ˜“äØ“ä¾?
 接收邮äšg包å«ä¸¤ä¸ªåè®®åQŒå³POP3å’ŒIMAP。POP3是è€å议,它æä¾›ä¸€ä¸ªå•一收信½Ž±ï¼Œä»¥å˜æ”¾ä¸€å®šé¡ºåºçš„é‚®äšgä¿¡æ¯ã€‚IMAP相对比较斎ͼŒå®ƒäؓ邮äšgæä¾›˜qžæŽ¥åˆîC¸€ä¸ªå±‚‹Æ¡å…³¾pÈš„æ–‡äšgå…¥å£åQŒå…¶ä¸ä¸€ä¸ªå…¥å£å³ä¸ºæ”¶ä¿¡ç®±ã€‚当然还有其它å¯ä»¥ä‹É用的åè®®åQŒPOP3å’ŒIMAPåªæ˜¯å…¶ä¸ä¸€¿U安全性很好的å议。JavaMailž®†è¿™äº›åè®®æç‚égؓ一¿U邮件仓åº?Store)的概念,˜q™ä¸€ä»“库为文件牾U§çš„集åˆã€‚è¿™¿Uæç‚¼æ„味ç€ä»“库包å«å¾ˆå¤šå†…容åQŒä½†æˆ‘们åªéœ€è¦å¼„清楚在一个æœåŠ¡æ–‡ä»¶å¤¹ä¸æµè§ˆä¸Žå¯ÆDˆªé‚®äšgä¿¡æ¯çš„过½E‹ï¼Œè€Œå®žé™…处ç†é‚®ä»¶å议的ä»ÕdŠ¡åˆ™é€šè¿‡JavaMail调用Provideræ¥å®Œæˆ?ä¸åŒçš„å议对应ä¸åŒçš„providerã€?br /> JavaMailçš„Provideræ“作æœåŠ¡äºŽPOP3å’ŒIMAPåQŒä½ 也å¯ä»¥å°†å¦å¤–çš„Providers嵌入到JavaMail API以处ç†å…¶å®ƒè¯¸å¦‚NNTP或本地å˜å‚¨é‚®ä»¶çš„å议。在Sunä¸»é¡µä¸Šåˆ—å‡ø™¿™æ–šw¢çš„第三方Providersã€?br /> 在Javamailä¸?storeå’Œfolder¾cÀL˜¯ç”¨æ¥å˜å‚¨å’ŒæŽ¥å—消æ?store由具体的session得到,它ä‹É用å¯å¸¦å‚æ•°çš„connectæ–ÒŽ³•与æœåС噍˜qžæŽ¥,folder则和File有点¾cÖM¼¼,å¯ä»¥ž®†å…¶æ¯”作windows下的文äšgå¤?客户由store¾cÖM¸å–å¾—folder,å†å¯¹folder˜q›è¡Œæ“作--˜q›å…¥ç‰¹å®šçš„folder,è¯Õd–folderä¸çš„æ¶ˆæ¯.
    Session session;
    Store store = null;
    Folder folder = null;
    Folder inboxfolder = null;
   Â
    Properties props = System.getProperties();
    props.setProperty("mail.pop3s.rsetbeforequit", "true");//˜q™æ ·è¯Õd–é‚®äšgæ—¶æœåС噍ä¸ä¼šåˆ 除原有的邮ä»?br />    props.setProperty("mail.pop3.rsetbeforequit", "true");
    session = Session.getInstance(props, null);
    store = session.getStore("pop3");//通过"pop3"得到适当的provider
    store.connect(emailserver, emailuser, emailpassword);
    folder = store.getDefaultFolder();//得到默认的顶¾U§æ–‡ä»¶å¤¹
 æ¯ä¸€Folderå¯ä»¥åŒ…å«å¾ˆå¤šå…¶å®ƒçš„æ–‡ä»¶å¤¹,通过getFolderæ–ÒŽ³•æ¥æµè§ˆç‰¹å®šæ–‡ä»¶å¤¹ã€‚INBOX是邮件æœåŠ¡å™¨è¡¨ç¤ºçš„ä¸»æ–‡äšg夹ä¿ç•™çš„åç§°,pop3å’Œimapå˜å‚¨éƒ½ä¼šæä¾›ä¸€ä¸ªINBOXæ–‡äšgå¤?
    inboxfolder = folder.getFolder("INBOX");
    inboxfolder.open(Folder.READ_ONLY);//åªè¯»æ¨¡å¼
    Message[] msgs = inboxfolder.getMessages();
Â éœ€è¦æ³¨æ„çš„æ˜?æ¤æ—¶çœŸæ£çš„æ¶ˆæ¯å¯¹è±¡åƈ没有å˜å‚¨åˆ°æ•°¾l?msgs)ä¸?数组ä¿å˜çš„åªæ˜¯è¿™äº›æ¶ˆæ¯å¯¹è±¡çš„引用,åªæœ‰åœ¨è°ƒç”¨äº†å…·ä½“çš„Message.getXX()æ–ÒŽ³•æ—?½E‹åºæ‰ä¼šå†æ¬¡˜qžæŽ¥æœåŠ¡å™¨åÆˆå–得真æ£çš„结æž?如果è¦è¿›è¡Œå¯¹é‚®äšgçš„ç›é€‰å·¥ä½?ä¸åœçš„调用æ¯ä¸ªæ¶ˆæ¯å¯¹è±¡çš„getXXæ–ÒŽ³•æ— ç–‘ä¼šåª„å“æ€§èƒ½.å› æ¤æˆ‘们å¯ä»¥ç”¨FetchProfile¾cÀL¥é¢„å…ˆæŠ“å–æ„Ÿå…´‘£çš„部分内容(如å„表头内容),˜q™å°±ä¸éœ€è¦æ¯‹Æ¡è°ƒç”¨getXXæ–ÒŽ³•æ—‰™ƒ½å†è¿žæŽ¥æœåС噍äº?
    FetchProfile fp = new FetchProfile();
    fp.add("Subject");//å›_ªè¯Õd–主题信æ¯
    inboxfolder.fetch(msgs, fp);//é¢„è¯»å–æ¯ä¸ªæ¶ˆæ¯çš„主题
    for (int j = 0 ;j <msgs.length; j++) {
       if (msgs[j].getSubject().startsWith("^_^")) {//åªå¯¹æ ‡é¢˜ä¸?^_^"的邮件进行æ“ä½?br />         .......
       }
 接下æ?ž®±å¯ä»¥è°ƒç”¨Message的儿U方法对邮äšg˜q›è¡Œæ“作äº?对ä¸åŒæ ¼å¼çš„é‚®äšg,具体的æ“作当然也略微ä¸åŒ.ä¸€ä¸ªåšæ³•是å¯ÒŽ¯ä¸ªå…·ä½“çš„BodyPart˜q›è¡Œæ“作,通过下列的递归æ–ÒŽ³•å¯ä»¥èŽ·å¾—æ¯ä¸ªBodyPart的引ç”?br />    private void extractPart(final Part part) throws MessagingException,IOException {
      if(part.getContent() instanceof Multipart) {
          Multipart mp=(Multipart)part.getContent();
          for (int i = 0; i < mp.getCount(); i++) {
              extractPart(mp.getBodyPart(i));
          }
     return;
   }
 Partçš„getContentTypeæ–ÒŽ³•å¯ä»¥ä¸ºæˆ‘们对光™‡‡å–何¿Uæ–¹æ³•å¤„ç†æä¾›ä¾æ?br />    part.getContentType().startsWith("text/plain").....
 如果是以"text/plain"或è€?text/html"å¼€å¤?通常我们å¯ä»¥ç›´æŽ¥å–出其内å®?br />   bodytext = (String) part.getContent();
Â å¦‚æžœä¸¤è€…éƒ½ä¸æ˜¯,我们ž®†å…¶è§†ä¹‹ä¸ºé™„ä»?通过IO‹¹æ¥è¯Õd–:
     InputStream in = part.getInputStream();//è¯Õd–partä¸çš„附äšg
     ByteArrayOutputStream bos = new ByteArrayOutputStream();
     byte[] buffer = new byte[8192];
     int count = 0;
     while ( (count = in.read(buffer)) >= 0) {
       bos.write(buffer, 0, count);
     }
     in.close();
 接下æ?ž®±å¯ä»¥å¯¹‹¹è¿›è¡Œæ“作了.
 那么,关于Javamailçš„ç ”½I¶ä¹Ÿž®Þp¿›è¡Œåˆ°˜q™å„¿äº?
å‚考文çŒ?
 DJ Walker-Morgan         Getting the mail in: receiving in JavaMail
                                     Sending email in Java: There's more than one way
 赵强,乔新亮                   J2EE应用开å?/p>
]]>