JavaMail收發郵件(包含附件)



import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.Enumeration;
import java.util.Properties;
import java.util.Vector;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.FetchProfile;
import javax.mail.Flags;
import javax.mail.Folder;
import javax.mail.Header;
import javax.mail.Message;
import javax.mail.Multipart;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Store;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class Mymail {

      private static final String SMTP_HOST_NAME = "smpt.163.com";
      private static final String POP3_HOST_NAME = "pop3.163.com";
      private static String USERNAME = "";
      private static String PASSWORD  = "";

      //private static final String emailMsgTxt      = "測試";
      private static final String emailSubjectTxt  = "享受生活中的每一刻";
      private static final String emailFromAddress = "[email protected]";
      
      private String filename="";
      private Vector<String> file = new Vector<String>();

      // Add List of Email address to who email needs to be sent to
      private static final String[] emailList = {"[email protected]"};
      
      //private static String attachpath = "E:/email/";
      private static String contentpath = "E:/郵件.txt";
      private static String savepath = "E:/email/";
      
      public static void main(String args[]) throws Exception{
         //System.out.println(emailMsgTxt);
         //smtpMailSender.attachfiles("E:/tosend");
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
         Mymail smtpMailSender = new Mymail ();
        
         while(true){
             System.out.println("press number 1 to post mail,number 2 to fetch mail,0 to exit");
            
             String number = reader.readLine();
             int flag = 0;
            
             while(true){
                 try{
                     flag = Integer.parseInt(number);                    
                     break;
                 }catch(Exception e){
                     System.out.println("please input number");
                     number = reader.readLine();
                 }
             }
            
             switch(flag){
                 case 0:{
                     System.out.println("Bye-Bye!/nWelcome to back next time.");
                     System.exit(0);
                 }
                 case 1:{
                      String content = smtpMailSender.readFromFile();
                     smtpMailSender.attachfile("E:/email/當下的幸福.pps");
                      smtpMailSender.read(0);
                     while(smtpMailSender.postMail( emailList, emailSubjectTxt, content, emailFromAddress)==false){
                         smtpMailSender.read(1);
                     }
                     break;
                 }
                 case 2:{
                     smtpMailSender.read(0);
                     while(smtpMailSender.fetchMail()==false){
                         smtpMailSender.read(1);
                     }
                     break;
                 }
                 default :break;
             }
         }  
        
      }

      private void read(int c) throws Exception{
          if(USERNAME!="" && PASSWORD!=""){
              return ;
          }
          
         BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
        
         if(c==0){
             System.out.print("Please input username and password/nUsername:");
         }else{
             System.out.print("Invalid username or password,please input again/nUsername:");
         }
         
         USERNAME = reader.readLine();
         System.out.print("Password:");
         PASSWORD = reader.readLine();
      }
      
      public void sendMail(String subject, String content) throws Exception{

          postMail( emailList, subject, content, emailFromAddress);

          System.out.println("Sucessfully Sent mail to All Users");
      }
      
      public boolean postMail( String recipients[], String subject,
                                String message , String from){
          boolean debug = false;

          //Set the host smtp address

          Properties props = System.getProperties();
          props.put("mail.smtp.host", SMTP_HOST_NAME);
          props.put("mail.smtp.auth", "true");
          //設置代理,但是無效
          //props.put("proxySet", "true");
          //props.put("http.ProxyPort", "192.168.12.227");
          //props.put("http.sProxyHost", "8888");

          Authenticator auth = new SMTPAuthenticator();
          Session session = Session.getInstance(props, auth);
          
          session.setDebug(debug);

          // create a message
          Message msg = new MimeMessage(session);

          // set the from and to address
          try{
              InternetAddress addressFrom = new InternetAddress(from);
              msg.setFrom(addressFrom);
    
              InternetAddress[] addressTo = new InternetAddress[recipients.length];
              for (int i = 0; i < recipients.length; i++){
                addressTo[i] = new InternetAddress(recipients[i]);
              }
              
              msg.setRecipients(Message.RecipientType.TO, addressTo);
    
              Multipart mp = new MimeMultipart();
              Enumeration efile=file.elements();
              while(efile.hasMoreElements()){
                 MimeBodyPart mbp = new MimeBodyPart();
                 filename = efile.nextElement().toString();
                 FileDataSource fds = new FileDataSource(filename);
                 mbp.setDataHandler(new DataHandler(fds));
                 
                 //用於解決中文亂碼問題
                 //sun.misc.BASE64Encoder enc = new sun.misc.BASE64Encoder();
                 //mbp.setFileName("=?GBK?B?"+enc.encode(fds.getName().getBytes())+"?=");
                 mbp.setFileName(MimeUtility.encodeText(fds.getName()));
                 mp.addBodyPart(mbp);
              }
              MimeBodyPart mbp = new MimeBodyPart();
              mbp.setContent(message, "text/plain;charset=gbk");
              mp.addBodyPart(mbp);
              
              // Setting the Subject and Content Type
              msg.setSubject(subject);
              msg.setSentDate(new Date((new Date()).getTime()-325000));
              //msg.setContent(message, "text/plain;charset=GBK");
              
              msg.setContent(mp);
              Enumeration em = msg.getAllHeaders();
              while(em.hasMoreElements()){
                  Header h = (Header)em.nextElement();
                  System.out.println(h.getName()+":"+h.getValue());
              }
              //msg.setHeader("X-Smtpd-IP", "192.168.12.201");
              //msg.setText(message);
              Transport.send(msg);
              session = null;
          }catch(Exception e){
              //e.printStackTrace();
              USERNAME="";
              PASSWORD="";
              return false;
          }

          file.removeAllElements();
          System.out.println("Sucessfully Sent mail to All Users");
          return true;
     }

     @SuppressWarnings("deprecation")
    public boolean fetchMail(){
         Session session = Session.getDefaultInstance(System.getProperties(),null);
        
         Folder inbox = null;
         Store store = null;
        
         try{
             store = session.getStore("pop3");
             System.out.print("connecting......");
             store.connect(POP3_HOST_NAME, USERNAME, PASSWORD);
             System.out.println("successfully");
         }catch(Exception e){
             System.out.println("failure");

             USERNAME="";
             PASSWORD="";
             return false;
         }
        
         try{
             inbox = store.getFolder("INBOX");
             inbox.open(Folder.READ_WRITE);
             
             FetchProfile profile = new FetchProfile();
             profile.add(FetchProfile.Item.ENVELOPE);
             
             Message[] messages = inbox.getMessages();
             inbox.fetch(messages, profile);
             //profile.add(UIDFolder.FetchProfileItem.UID);
             System.out.println("Inbox Number of Message :" + messages.length);
             
             for (int i = 0; i < messages.length; i++) {
                 System.out.println("The Email Number: " + (i+1));
                 if(messages[i].getFlags().contains(Flags.Flag.SEEN)){   
                    continue;
                 }
                
                 String from = decodeText(messages[i].getFrom()[0].toString());
                 String subject = "";
                 InternetAddress ia = new InternetAddress(from);
                 System.out.println("FROM:" + ia.getPersonal()+'('+ia.getAddress()+')');
    
                 //標誌郵件爲已讀,但是無效
                 messages[i].setFlag(Flags.Flag.SEEN, true);
                 //String pattern = "^([//S_//s|//:])*/";
                 String pattern = "//s|//:";
                 subject = messages[i].getSubject().replaceAll(pattern, "");
                 System.out.println("TITLE:" + messages[i].getSubject());   
                 System.out.println("TITLE:" + subject);
                 //System.out.println("DATE:" + messages[i].getSentDate().toLocaleString());
                 
                 if(messages[i].isMimeType("text/plain")){
                     //saveFile(attachpath + subject +".txt", messages[i].getContent().toString());   
                     System.out.println(messages[i].getContentType());
                     if(subject.startsWith("=?gb?")){
                         subject = subject.replace("=?gb?", "=?GBK?");
                         subject = decodeText(subject);
                     }
                     saveFile(savepath + subject +".txt", messages[i].getInputStream());
                     System.out.println("/n=======================================");
                     continue;
                 }
                 
                 Multipart mp = (Multipart)messages[i].getContent();
                 for(int j=0;j<mp.getCount();j++){
                     MimeBodyPart mbp = (MimeBodyPart)mp.getBodyPart(j);
                    
                     System.out.println(mbp.getContentType());
                     if(mbp.getFileName()!=null){
                         saveFile(savepath + decodeText(mbp.getFileName()),mbp.getInputStream());
                     }else{
                         saveFile(savepath + subject+".html",mbp.getContent().toString());
                     }
                 }
                 
                 System.out.println("/n=======================================");
              }
              inbox.close(true);
              store.close();
              session = null;
         }catch(Exception e){
             e.printStackTrace();
         }
         
         return true;
     }
    /**
    * SimpleAuthenticator is used to do simple authentication
    * when the SMTP server requires it.
    */
    private class SMTPAuthenticator extends javax.mail.Authenticator{

        public PasswordAuthentication getPasswordAuthentication(){
            String username = USERNAME;
            String password = PASSWORD;
            return new PasswordAuthentication(username, password);
        }
    }
    
    //保存附件
    private void saveFile(String filename, InputStream stream)throws Exception {
            FileOutputStream writer = new FileOutputStream(filename);
         byte[] buf = new byte[4096];
         int len = 0;
         while ((len = stream.read(buf)) > 0)
         {
             writer.write(buf, 0, len);
         }
         writer.flush();
         writer.close();
    }
    
    //將收到的郵件正文保存下來
    private void saveFile(String filename,String content)throws Exception {
        BufferedWriter out = new BufferedWriter(new FileWriter(filename));

        content = content.replace("/n", "/r/n");
        out.write(content);
        out.flush();
        out.close();
    }
    
    //從文件中獲取郵件正文
    private String readFromFile() {

        String content = "";
        String filepath = contentpath;
        try {
            String line;
            BufferedReader in = new BufferedReader(new FileReader(filepath));
            while((line = in.readLine()) != null){
                content += line + "/n";
            }
            in.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return content;
    }
    
    //添加附件名
    public void attachfile(String fname){
        file.addElement(fname);
    }
    
    //遍歷目錄以及所有子目錄下的文件
    public void attachfiles(String list){
        File f = new File(list);
        
        if(f.exists()==false){
            System.out.println("the directory is not exist.");
        }
        File[] dir = f.listFiles();
        for(int i=0;i<dir.length;i++){
            if(dir[i].isDirectory()){
                attachfiles(list+"/"+dir[i].getName());
                //System.out.println(dir[i].getName());
            }else{
                if(dir[i].getName().endsWith("jpg") || dir[i].getName().endsWith("gif")){
                    //file.addElement(list +"/"+ dir[i].getName());
                    //System.out.println(dir[i].getName());
                }
                file.addElement(list +"/"+ dir[i].getName());
                System.out.println(dir[i].getName());
            }
        }
    }
    
    //解碼
    private static String decodeText(String text) throws UnsupportedEncodingException {
       if (text == null)
          return null;
       if (text.startsWith("=?GB") || text.startsWith("=?gb")){
          text = MimeUtility.decodeText(text);
          //text = new String(text.getBytes("gbk"),"gb2312");
       }
       else{
          text = new String(text.getBytes("ISO8859_1"));
       }
       return text;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章