青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Javen-Studio 咖啡小屋

http://javenstudio.org - C++ Java 分布式 搜索引擎
Naven's Research Laboratory - Thinking of Life, Imagination of Future

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  24 隨筆 :: 57 文章 :: 170 評論 :: 4 Trackbacks

//------------------------------------------------------------------
//                              \\\|///
//                            \\  -^-  //
//                             (  @ @  )
//    +----------------------oOOo-(_)-oOOo---------------------+
//
//           FREE SOFTWARE WRITEN BY NAVY, COPYLEFT (C) 2002
//                       SmtpClient Class 1.0
//               Use smtp server with user authorization
//                         All rights reserved.
//
//                                    Oooo
//    +---------------------- oooO---(   )---------------------+
//                            (   )   ) /
//                             \ (   (_/
//                              \_)
//------------------------------------------------------------------


package encrypt;

import java.io.*;
import java.net.*;
import java.util.Vector;
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
import encrypt.Base64;

/***
 * 標準SMTP發信類
 * <p>
 * 標準的純JAVA的SMTP發信客戶端程序,支持用戶認證。
 * <p>
 * <p>
 * @author Naven
 * @see SmtpClient
 ***/

public class SmtpClient
{
    //protected static final Log log = LogFactory.getLog(SmtpClient.class);
   
    private static final String CMD_HELO            = "HELO ";
    private static final String CMD_AUTH_LOGIN      = "AUTH LOGIN ";
    private static final String CMD_MAIL_FROM       = "MAIL FROM: ";
    private static final String CMD_RCPT_TO         = "RCPT TO: ";
    private static final String CMD_DATA            = "DATA";
    private static final String CMD_HELP            = "HELP";
    private static final String CMD_RSET            = "RSET";
    private static final String CMD_NOOP            = "NOOP";
    private static final String CMD_QUIT            = "QUIT";
    private static final String END_OF_MAIL         = "\r\n.\r\n";

    private static final String RCV_SERVOK          = "220";        // 220 服務就緒
    private static final String RCV_HELO            = "250";        // 250 要求的郵件操作完成
    private static final String RCV_AUTH_LOGIN      = "334";
    private static final String RCV_AUTH_USER       = "334";
    private static final String RCV_AUTH_PASSWD     = "334";
    private static final String RCV_AUTH_OK         = "235";
    private static final String RCV_MAIL_FROM       = "250";
    private static final String RCV_RCPT_TO         = "250";
    private static final String RCV_DATA            = "354";
    private static final String RCV_SEND_END        = "250";
    private static final String RCV_RSET            = "250";
    private static final String RCV_NOOP            = "250";
    private static final String RCV_QUIT            = "221";        // 221 服務關閉傳輸信道

    private static final int SEND_BLOCK_SIZE        = 1024;         // 每次發送信件內容的塊的大小
   
    /**
     * BASE64加密對象
     */
    //private Base64 base64 = new Base64();
   

    private static final int _NOTHING_SPECIAL_STATE = 0;
    private static final int _LAST_WAS_CR_STATE = 1;
    private static final int _LAST_WAS_NL_STATE = 2;

    /**
     * 記錄處理郵件正文數據發送的狀態
     */
    private int _state = 0;
   
    /**
     * 用于處理郵件正文數據發送同步處理的鎖定
     */
    private Integer lock = new Integer(0);
   
    /**
     * client socket
     */
    private Socket      socketSmtp = null;
   
    /**
     * socket out printwriter
     */
    private PrintWriter     sout = null;
   
    /**
     * socket int reader
     */
    private BufferedReader  sin = null;
   
    /**
     * smtp email server address
     */
    private String      smtpServer = null;
   
    /**
     * email from user for smtp server
     */
    private String      user = null;
   
    /**
     * user password
     */
    private String      passwd = null;
   
    /**
     * sender's email address
     */
    private String      sender = null;
   
    /**
     * email from user for smtp server, base64 encode
     */
    private String      encryptUser = null;
   
    /**
     * user password, base64 encode
     */
    private String      encryptPasswd = null;
   
    /**
     * client localhost
     */
    private String      localHost = null;

    /**
     * error message
     */
    private String      errorString = "NO ERROR";   
   

    /***
     * 初始化發信類
     * <p>
     * @param server  SMTP服務器地址
     * @param sender  SMTP發信人郵件地址
     ***/
    public SmtpClient(String server, String sender)
    {
        this(server, null, null, sender);
    }
   
    /***
     * 初始化發信類
     * <p>
     * @param server  SMTP服務器地址
     * @param user  SMTP發信人認證用戶名
     * @param passwd  SMTP發信人認證密碼
     * @param sender  SMTP發信人郵件地址
     ***/
    public SmtpClient(String server, String user, String passwd, String sender)
    {
        this.smtpServer = server;
        this.user       = user;
        this.passwd     = passwd;
        this.sender     = sender;

        if( this.user != null && this.passwd != null )
        {
            Base64 base64 = new Base64();
           
            // base64 encode begain
            byte[] buser  = user.getBytes();
            byte[] bpasswd= passwd.getBytes();
   
            base64.startEncode();
            base64.encode(buser, buser.length);
            base64.endEncode();
            this.encryptUser = new String(base64.getEncodedResult());
   
            base64.startEncode();
            base64.encode(bpasswd, bpasswd.length);
            base64.endEncode();
            this.encryptPasswd = new String(base64.getEncodedResult());
        }
    }

    /***
     * 獲取處理的錯誤信息
     * <p>
     * @return  錯誤信息
     ***/
    public String getError() {
        return errorString;
    }

    /***
     * 當出錯時拋出錯誤信息
     * <p>
     * @param e  錯誤異常
     ***/
    private void onError(Exception e)
    {
        this.errorString = e.getMessage();
        //log.error("onError() " + this.errorString);
        //if( log.isDebugEnabled() ) {
        //    log.debug("onError()", e);
        //}
    }

    /***
     * 檢查SMTP協議通訊收到的信息是否成功,即以指定返回代號開頭,SMTP協議標準。
     * <p>
     * @param rcvmsg  SMTP協議通訊收到的信息
     * @param code  SMTP協議通訊返回代號
     * @exception IOException  失敗時拋出異常
     ***/
    private void check(String rcvmsg, String code)
        throws IOException
    {
        if( code == null || code.length() == 0 ) return;
        if( rcvmsg == null || rcvmsg.startsWith(code) == false )
            throw ( new IOException(rcvmsg) );
    }

    /***
     * 檢查SMTP協議通訊收到的信息是否成功,即以指定返回代號數組中任意個開頭,SMTP協議標準。
     * <p>
     * @param rcvmsg  SMTP協議通訊收到的信息
     * @param codes  SMTP協議通訊返回代號數組
     * @exception IOException  失敗時拋出異常
     ***/
    private void check(String rcvmsg, String[] codes)
        throws IOException
    {
        if( codes == null || codes.length == 0 ) return;
        boolean result = false;
        for( int i=0; rcvmsg != null && i < codes.length && codes[i] != null; i++ ) {
            if( rcvmsg.startsWith(codes[i]) == false ) {
                result = true;
                break;
            }
        }
        if(!result) throw ( new IOException(rcvmsg) );
    }

    /***
     * 往SMTP服務器寫郵件正文數據的一個字節,并處理數據中“\r\n.”需轉換成“\r\n..”的情況。
     * <p>
     * @param ch  寫入的一個字節
     * @exception IOException  失敗時拋出異常
     ***/
    private void write(int ch)
        throws IOException
    {
        synchronized (lock)
        {
            switch (ch)
            {
            case '\r':
                _state = _LAST_WAS_CR_STATE;
                sout.write('\r');
                return ;
            case '\n':
                if (_state != _LAST_WAS_CR_STATE)
                    sout.write('\r');
                sout.write('\n');
                _state = _LAST_WAS_NL_STATE;
                return ;
            case '.':
                // Double the dot at the beginning of a line
                if (_state == _LAST_WAS_NL_STATE)
                    sout.write('.');
                // Fall through
            default:
                _state = _NOTHING_SPECIAL_STATE;
                sout.write(ch);
                return ;
            }
        }
    }

    /***
     * 往SMTP服務器寫郵件正文數據的一段數據,并處理數據中“\r\n.”需轉換成“\r\n..”的情況。
     * <p>
     * @param buffer  寫入的數據緩沖
     * @param offset  寫入的數據緩沖的偏移
     * @param length  寫入的數據緩沖的長度
     * @exception IOException  失敗時拋出異常
     ***/
    private void write(char[] buffer, int offset, int length)
        throws IOException
    {
        synchronized (lock)
        {
            while (length-- > 0)
                write(buffer[offset++]);
        }
    }

    /***
     * 往SMTP服務器寫郵件正文數據的一段數據,并處理數據中“\r\n.”需轉換成“\r\n..”的情況。
     * <p>
     * @param buffer  寫入的數據緩沖
     * @exception IOException  失敗時拋出異常
     ***/
    private void write(char[] buffer)
        throws IOException
    {
        write(buffer, 0, buffer.length);
    }

    /***
     * 往SMTP服務器寫郵件正文數據的一段數據,并處理數據中“\r\n.”需轉換成“\r\n..”的情況。
     * <p>
     * @param string  寫入的數據字符串
     * @exception IOException  失敗時拋出異常
     ***/
    private void write(String string)
        throws IOException
    {
        write(string.toCharArray());
    }

    /***
     * 將SOCKET STREAM緩沖區的數據刷新,提交出去。
     * <p>
     * @exception IOException  失敗時拋出異常
     ***/
    private void flush()
        throws IOException
    {
        synchronized (lock)
        {
            sout.flush();
        }
    }

    /***
     * 往SMTP服務器寫一行數據。
     * <p>
     * @param msg  寫入的一行數據字符串
     * @exception IOException  失敗時拋出異常
     ***/
    private void sendln(String msg)
        throws IOException
    {
        if( msg == null ) msg = "";
       
        sout.println(msg);
        sout.flush();
       
        //if( log.isDebugEnabled() ) {
        //    log.debug("sendln() ==>: "+msg);
        //}
    }

    /***
     * 往SMTP服務器寫字符串數據。
     * <p>
     * @param msg  寫入的字符串
     * @exception IOException  失敗時拋出異常
     ***/
    private void send(String msg)
        throws IOException
    {
        if( msg == null ) msg = "";
       
        sout.write(msg);
        sout.flush();
       
        //if( log.isDebugEnabled() ) {
        //    log.debug("send() ==>: "+msg);
        //}
    }

    /***
     * 往SMTP服務器寫一段大字符串數據。
     * <p>
     * @param text  寫入的字符串數據
     * @exception IOException  失敗時拋出異常
     ***/
    private void sendtext(String text)
        throws IOException
    {
        if( text == null ) text = "";
       
        if( text.length() > SEND_BLOCK_SIZE ) {
            int i = 0;
            while( i <= text.length() ) {
                if( (i + SEND_BLOCK_SIZE) < text.length() )
                    write(text.substring(i, (i+SEND_BLOCK_SIZE)));
                else
                    write(text.substring(i));
                flush();
                i = i + SEND_BLOCK_SIZE;
            }
           
            //if( log.isDebugEnabled() ) {
            //    log.debug("sendtext() ==>: <Email Mesg> "+text.length()+" chars");
            //}
        }
        else {
            write(text);
            flush();
           
            //if( log.isDebugEnabled() ) {
            //    log.debug("sendtext() ==>: "+text);
            //}
        }
    }

    /***
     * 從SMTP服務器接收一行字符串數據。
     * <p>
     * @return  讀取的字符串數據
     * @exception IOException  失敗時拋出異常
     ***/
    private String receive()
        throws IOException
    {
        String rcvmsg = sin.readLine();
        //if( log.isDebugEnabled() ) {
        //    log.debug("receive() <==: " + rcvmsg);
        //}
        return rcvmsg;
    }

    /***
     * 從SMTP服務器接收一行字符串數據,并判斷是否是成功的返回值。
     * <p>
     * @param code  正確的SMTP協議代碼
     * @return  讀取的字符串數據
     * @exception IOException  失敗時拋出異常
     ***/
    private String receive(String code)
        throws IOException
    {
        String rcvmsg = receive();
        check(rcvmsg, code);
        return rcvmsg;
    }
   
    /***
     * 從SMTP服務器接收一行字符串數據,并判斷是否是成功的返回值數組的一個。
     * <p>
     * @param codes  正確的SMTP協議代碼數組
     * @return  讀取的字符串數據
     * @exception IOException  失敗時拋出異常
     ***/
    private String receive(String[] codes)
        throws IOException
    {
        String rcvmsg = receive();
        check(rcvmsg, codes);
        return rcvmsg;
    }
   
    /***
     * 連接SMTP服務器并發送用戶名和密碼認證。
     * <p>
     * @return  返回成功失敗結果
     * @exception IOException  失敗時拋出異常
     ***/
    public boolean connect()
    {
        // connect to smtp server and autherize
        try{
            // get localhost name
            localHost = InetAddress.getLocalHost().getHostName();
            //if( log.isDebugEnabled() ) {
            //    log.debug("connect() localhost: " + localHost);
            //}

            // connect to smtp server
            socketSmtp = new Socket(smtpServer, 25);
            sout       = new PrintWriter(new OutputStreamWriter(socketSmtp.getOutputStream()));
            sin        = new BufferedReader(new InputStreamReader(socketSmtp.getInputStream()));
            receive(RCV_SERVOK);

            // hello
            sendln(CMD_HELO + localHost);
            receive(RCV_HELO);
           
            if( encryptUser != null && encryptPasswd != null )
            {
                // auth login
                sendln(CMD_AUTH_LOGIN);
                receive(RCV_AUTH_LOGIN);
   
                // base64 encode end
                sendln(encryptUser);
                receive(RCV_AUTH_USER);
                sendln(encryptPasswd);
                receive(RCV_AUTH_OK);
            }
        }
        catch(IOException e) {
            onError(e);
            closeall();
            return false;
        }
       
        return true;
    }

    /***
     * 連接SMTP服務器并發送郵件。
     * <p>
     * @param to  收件人郵件地址
     * @param msg  郵件數據
     * @return  返回成功失敗結果
     * @exception IOException  失敗時拋出異常
     ***/
    public boolean sendMail(String to, String msg) {   
        return sendMail(to, msg, null);
    }
   
    /***
     * 連接SMTP服務器并發送郵件。
     * <p>
     * @param to  收件人郵件地址
     * @param msg  郵件數據
     * @param cc  CC收件人郵件地址
     * @return  返回成功失敗結果
     * @exception IOException  失敗時拋出異常
     ***/
    public boolean sendMail(String to, String msg, Vector cc)
    {
        if( socketSmtp == null || sout == null || sin == null ) {
            closeall();
            if( !connect() ) return false;
        }

        boolean retval = false;
        int count = 0;
        // try send for 3 times if error
        while( retval == false && count < 3 ) {
          try {
            // mail from
            sendln(CMD_MAIL_FROM + sender);
            receive(RCV_MAIL_FROM);
           
            // send to
            sendln(CMD_RCPT_TO + to);
            receive(RCV_RCPT_TO);
           
            // perform cc
            int ccSize = 0;
            if(cc != null && (ccSize = cc.size()) > 0){
                for(int i = 0; i < ccSize; i ++){                   
                    sendln(CMD_RCPT_TO + (String)cc.elementAt(i));
                    receive(RCV_RCPT_TO);
                }
            }
            // end cc
           
            // begain send mail data
            sendln(CMD_DATA);
            receive(RCV_DATA);
            sendtext(msg);
            sendln(END_OF_MAIL);
            receive(RCV_SEND_END);
           
            // send success
            //receive(); // I dont know why 263.net.cn need receve again
            retval = true;
          }
          catch(IOException e) {
            onError(e);
            retval = false;
            count ++;
            try{
                // reset and send again
                sendln(CMD_RSET);
                receive(RCV_RSET);
            }
            catch(Exception e2) {
                //log.error("sendMail()", e2);
                break;
            }
          }
        }

        return retval;
    }

    /***
     * 關閉與SMTP服務器連接。
     * <p>
     ***/
    private void closeall()
    {
        try {
            if( sout != null ) {
                sout.close(); sout = null;
            }
            if( sin != null ) {
                sin.close(); sin = null;
            }
            if( socketSmtp != null ) {
                socketSmtp.close(); socketSmtp = null;
            }
        }
        catch(IOException e) {
            //log.error("closeall()", e);
        }
    }

    /***
     * 關閉與SMTP服務器連接并釋放資源。
     * <p>
     ***/
    public void release()
    {
        close();
       
        this.socketSmtp     = null;    // client socket
        this.sout           = null;    // socket out printstream
        this.sin            = null;    // socket int reader
        this.smtpServer     = null;    // smtp email server address
        this.user           = null;    // email from user for smtp server
        this.passwd         = null;    // user password
        this.sender         = null;    // sender's email address
        this.encryptUser    = null;    // base64 encode
        this.encryptPasswd  = null;    // base64 encode
        this.localHost      = null;    // client localhost

        this.errorString    = "NO ERROR";
    }

    /***
     * 發送QUIT命令并關閉與SMTP服務器連接。
     * <p>
     ***/
    public boolean close()
    {
        boolean retval = true;
       
        if( sout != null && sin != null ) {
            try {
                // send finish quit
                sendln(CMD_QUIT);
                //receive();
                retval = true;
            }
            catch(IOException e) {
                retval = false;
                //log.error("close()", e);
            }
        }
        closeall();
       
        return retval;
    }

    public String toString() {
        return getClass().getName() +
                " Server: " + smtpServer + " User: " + user +
                " Passwd: " + passwd + " Sender: " + sender;
    }
       
}///:~

posted on 2005-10-03 11:48 Javen-Studio 閱讀(547) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲视频精选| 欧美成ee人免费视频| 午夜天堂精品久久久久| …久久精品99久久香蕉国产 | 亚洲欧洲精品天堂一级| 亚洲精品欧美专区| 国产视频精品免费播放| 欧美高清视频一区二区| 国产精品视频不卡| 亚洲国产中文字幕在线观看| 国产精品网曝门| 亚洲成色www8888| 国产伦精品一区二区三区视频孕妇 | 91久久久一线二线三线品牌| 欧美色视频在线| 香蕉亚洲视频| 欧美亚洲视频在线看网址| 久久激情视频久久| 国内精品久久久久影院色| 欧美区一区二| 欧美v日韩v国产v| 亚洲作爱视频| 国产精品成人aaaaa网站| 亚洲午夜激情在线| 亚洲黄网站黄| 最新热久久免费视频| 亚洲国产精品va在线看黑人动漫| 亚洲一区二区三区在线看| 国产美女精品视频| 久久久久高清| 午夜欧美大片免费观看| 亚洲日本va午夜在线电影| 亚洲一二区在线| 亚洲区中文字幕| 国产日韩欧美| 欧美另类一区| 欧美日韩国产片| 国产精品福利av| 国产精品免费电影| 国产一区二区中文| 欧美日韩在线免费观看| 欧美a级大片| 免费黄网站欧美| 欧美日韩精品一区二区三区四区| 美女啪啪无遮挡免费久久网站| 欧美一区在线视频| 久久精品免费观看| 久久久亚洲高清| 亚洲国产小视频在线观看| 欧美影院久久久| 久久久久久久999精品视频| 久久精品在这里| 欧美高清日韩| 亚洲日本国产| 亚洲午夜国产成人av电影男同| 亚洲欧美日韩精品在线| 久久久精品午夜少妇| 91久久夜色精品国产九色| 欧美国内亚洲| 日韩午夜精品| 久久成年人视频| 亚洲欧洲久久| 久久青草欧美一区二区三区| 久久亚洲国产精品一区二区| 亚洲精品一区二区三区蜜桃久 | 久久这里有精品视频| 国产精品综合av一区二区国产馆| 亚洲国产精品日韩| 久久伊人亚洲| 日韩手机在线导航| 暖暖成人免费视频| 亚洲精品在线观看免费| 欧美成人日本| 欧美日韩国产色视频| 日韩一级在线观看| 夜夜嗨av一区二区三区网站四季av | 久久久久国产精品午夜一区| 欧美精品福利在线| 性欧美超级视频| 一本色道久久综合亚洲精品按摩 | 欧美一级免费视频| 亚洲国产欧美一区| 午夜免费久久久久| 国产精品护士白丝一区av| 亚洲日本中文字幕免费在线不卡| 欧美一区二区三区日韩| 久久er精品视频| 国产欧美日韩视频一区二区三区| 亚洲一区二区欧美| 一区二区三区国产精华| 国产精品一区二区久久久久| 久久久国产亚洲精品| 可以看av的网站久久看| 亚洲美女在线观看| 日韩亚洲不卡在线| 黑丝一区二区三区| 亚洲另类自拍| 韩日成人av| 亚洲国产国产亚洲一二三| 欧美一区二区免费| 亚洲小说欧美另类社区| 欧美激情精品久久久久久黑人 | 亚洲精品免费一区二区三区| 欧美午夜大胆人体| 免费日韩av片| 国产一区二区三区网站 | 在线视频欧美日韩精品| 久久精品成人欧美大片古装| 在线亚洲伦理| 欧美麻豆久久久久久中文| 欧美阿v一级看视频| 国产精品一区二区三区成人| 日韩视频在线永久播放| 亚洲人成在线观看一区二区| 久久国内精品视频| 欧美在线免费视屏| 欧美激情黄色片| 性欧美1819性猛交| 久久国产精品久久久久久电车| 在线高清一区| 欧美视频中文字幕在线| 午夜精品av| 亚洲高清一区二区三区| 亚洲午夜性刺激影院| 国内精品免费在线观看| 欧美日韩999| 久久亚洲欧洲| 亚洲性视频网站| 99国产精品国产精品久久| 欧美电影美腿模特1979在线看 | 久久综合色天天久久综合图片| 亚洲天堂av电影| 国产日韩欧美成人| 欧美日韩另类丝袜其他| 久久中文精品| 久久九九99视频| 亚洲欧美日韩视频一区| 日韩午夜av在线| 亚洲精品国精品久久99热一| 欧美大片网址| 欧美激情一区二区三级高清视频| 久久国产精品99国产| 欧美一级成年大片在线观看| 一本久久综合| 亚洲一级高清| 亚洲视频自拍偷拍| 亚洲欧美亚洲| 国产一区91| 国产一区二区主播在线| 狠狠色狠狠色综合日日五| 在线成人免费视频| 国产精品成人一区二区三区夜夜夜 | 久久久久久一区二区| 亚洲五月六月| 黄色亚洲在线| 欧美日韩精品久久久| 久久亚洲图片| 亚洲欧美日韩视频二区| 亚洲国产欧美一区| 久久精品国产综合| 亚洲主播在线| 亚洲激情视频网| 一区二区在线观看av| 国产精品亚洲а∨天堂免在线| 欧美成人乱码一区二区三区| 亚洲国产精品欧美一二99| 久久最新视频| 久久久噜噜噜| 狼人天天伊人久久| 久久视频在线视频| 久久久国产视频91| 麻豆精品一区二区av白丝在线| 久久国产精品久久久久久电车| 亚洲免费中文字幕| 亚洲欧美在线高清| 久久久久久久久久久久久久一区 | 亚洲欧洲一区二区在线播放| 黄色成人在线观看| 亚洲丶国产丶欧美一区二区三区| 国内伊人久久久久久网站视频| 国产一区二区三区av电影| 国产欧美一区二区在线观看| 国产精品久久二区| 狠狠色丁香久久婷婷综合_中| 亚洲福利在线视频| 日韩视频永久免费| 久久精品国内一区二区三区| 久久精品官网| 日韩系列在线| 欧美影院视频| 欧美三级特黄| 国内偷自视频区视频综合| 亚洲美女在线国产| 免费高清在线一区| 亚洲一区二区av电影| 久久综合久久综合这里只有精品| 欧美成人精品| 精品成人一区二区| 亚洲欧美另类综合偷拍| 亚洲精品午夜精品|