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

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 閱讀(540) 評論(0)  編輯 收藏 引用
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            国产一区二区日韩| 国产精品久久久久久久久免费樱桃| 久久伊伊香蕉| 欧美影院久久久| 亚洲欧美综合v| 亚洲免费在线视频| 亚洲一区二区三区影院| 亚洲综合社区| 久久成人综合视频| 久久久午夜精品| 欧美电影电视剧在线观看| 亚洲全部视频| 欧美福利一区| 亚洲第一在线| 亚洲精品乱码| 亚洲一区二区三区在线| 亚洲综合另类| 欧美一区二区三区在线视频| 久久亚洲精品视频| 亚洲影院色在线观看免费| 国产精品美女一区二区在线观看| 国产精品毛片va一区二区三区| 国产精品国产三级国产aⅴ入口| 国产精品免费电影| 在线精品亚洲| 亚洲免费在线电影| 另类欧美日韩国产在线| 亚洲精品乱码视频| 久久成人资源| 欧美日韩午夜精品| 国产视频丨精品|在线观看| 亚洲高清不卡av| 亚洲欧美中文日韩v在线观看| 久久成人精品| 亚洲卡通欧美制服中文| 久久久www| 欧美色欧美亚洲另类二区| 黄色成人在线网址| 一区二区高清在线| 免费观看成人| 欧美在线观看视频一区二区| 欧美午夜不卡| 亚洲人成7777| 久久这里有精品视频| 一区二区三区色| 免费人成网站在线观看欧美高清| 国产精品久在线观看| 99这里只有精品| 麻豆精品在线视频| 欧美一级久久久| 国产精品久久久一区二区三区| 日韩视频久久| 欧美激情精品久久久六区热门| 午夜一区不卡| 国产九九视频一区二区三区| 亚洲免费黄色| 亚洲电影免费观看高清完整版在线观看| 亚洲永久免费精品| 国产精品久久看| 亚洲欧美日韩爽爽影院| 亚洲黄网站黄| 欧美96在线丨欧| 91久久久一线二线三线品牌| 美女图片一区二区| 欧美亚洲在线播放| 国产在线精品自拍| 久久在线免费视频| 噜噜爱69成人精品| 亚洲日本电影在线| 亚洲欧洲另类| 欧美日韩1区| 一区二区精品在线观看| 日韩视频久久| 欧美视频一区二区三区| 亚洲女同性videos| 性8sex亚洲区入口| 国内一区二区在线视频观看| 久久久久久69| 欧美大片免费观看在线观看网站推荐| 亚洲片在线观看| 欧美激情视频在线免费观看 欧美视频免费一 | 欧美三级视频| 亚洲图色在线| 亚洲一区三区电影在线观看| 欧美日韩精品一区视频| 亚洲视频日本| 亚洲欧美国产高清| 在线观看国产欧美| 亚洲精品在线看| 欧美色偷偷大香| 欧美在线地址| 久久一区欧美| 日韩视频中文| 亚洲精品久久久久| 欧美日韩日本视频| 性欧美大战久久久久久久免费观看| 99亚洲视频| 黄色精品一区| 日韩午夜在线观看视频| 国产精品女人网站| 欧美大片免费观看| 国产精品久久国产三级国电话系列 | 蜜臀久久久99精品久久久久久| av成人激情| 久久久久国产一区二区| 亚洲视频在线观看三级| 性做久久久久久免费观看欧美| 亚洲精品欧美精品| 亚洲欧美日韩国产精品| 亚洲国产日韩在线一区模特| 亚洲视频免费观看| 亚洲大胆av| 亚洲综合大片69999| 日韩亚洲欧美精品| 久久久www免费人成黑人精品 | 欧美国产日韩a欧美在线观看| 午夜精品视频在线观看一区二区 | 亚洲精品国精品久久99热一| 狠狠色综合一区二区| 制服丝袜亚洲播放| 亚洲老板91色精品久久| 欧美在线观看一区二区| 亚洲一区二区在线看| 欧美成人精品在线视频| 久久综合激情| 国产亚洲一区精品| 亚洲一区日韩在线| 亚洲欧美在线视频观看| 欧美性开放视频| 亚洲国产日韩欧美综合久久| 亚洲国产成人不卡| 欧美xx69| 久久午夜羞羞影院免费观看| 亚洲一区二区免费视频| 欧美另类视频| 亚洲高清成人| 91久久精品www人人做人人爽| 久久成人在线| 老司机精品视频一区二区三区| 国产精品一二一区| 亚洲伊人伊色伊影伊综合网| 亚洲一区二区三区欧美| 欧美日韩中文字幕综合视频| 日韩午夜av在线| 国产精品99久久久久久久久久久久| 欧美激情精品久久久六区热门 | 最新日韩av| 亚洲免费观看视频| 国产精品福利在线| 国产精品99久久久久久久久| 亚洲欧美不卡| 狠狠色狠狠色综合日日91app| 久久久国产精彩视频美女艺术照福利 | 在线成人免费观看| 免费久久99精品国产自| 亚洲国产精品一区二区www| 亚洲国产另类久久精品| 免费一区视频| 亚洲深夜影院| 久久视频一区| 夜夜精品视频一区二区| 国产精品大片免费观看| 亚洲欧美大片| 免费观看成人| 夜夜嗨av一区二区三区| 国产精品久久久久av| 欧美在线一区二区三区| 亚洲第一中文字幕在线观看| 亚洲新中文字幕| 国产一区二区精品久久| 美女性感视频久久久| 一区二区福利| 久久一日本道色综合久久| 亚洲国产一区二区三区高清 | 亚洲国产精品999| 亚洲一卡久久| 亚洲高清影视| 国产精品男女猛烈高潮激情| 久久九九热免费视频| 日韩亚洲精品在线| 久久免费观看视频| 亚洲视频狠狠| 尤物精品在线| 国产精品毛片| 欧美精品电影| 欧美亚洲免费| 亚洲精品专区| 免费日韩一区二区| 欧美亚洲尤物久久| 亚洲日本激情| 狠狠色综合网| 国产欧美日韩亚州综合| 欧美激情国产日韩| 猛干欧美女孩| 99综合在线| 亚洲激情一区二区| 欧美日韩高清区| 久久久天天操| 亚洲免费伊人电影在线观看av| 亚洲国产综合91精品麻豆|