Beispiel #1
0
 //接続
 public bool Connect()
 {
     if (Status != SmtpClientStatus.Idle)
     {
         SetLastError("Connect() Status != Idle");
         return(false);
     }
     if (_ip.InetKind == InetKind.V4)
     {
         _sockTcp = Inet.Connect(new Kernel(), _ip, _port, _sec + 3, null);
     }
     else
     {
         _sockTcp = Inet.Connect(new Kernel(), _ip, _port, _sec + 3, null);
     }
     if (_sockTcp.SockState == SockState.Connect)
     {
         //220受信
         if (!RecvStatus(220))
         {
             return(false);
         }
         Status = SmtpClientStatus.Helo;
         return(true);
     }
     SetLastError("Faild in SmtpClient Connect()");
     return(false);
 }
Beispiel #2
0
 //接続確認
 void ConfirmConnect()
 {
     //既に切断されている場合
     if (_sockTcp.SockState != SockState.Connect)
     {
         Status = SmtpClientStatus.Idle;
     }
 }
Beispiel #3
0
        public SmtpClient(Ip ip, int port, int sec, ILife iLife)
        {
            _ip    = ip;
            _port  = port;
            _sec   = sec;
            _iLife = iLife;

            Status = SmtpClientStatus.Idle;
        }
Beispiel #4
0
 public bool Helo()
 {
     //切断中の場合はエラー
     if (Status != SmtpClientStatus.Helo)
     {
         SetLastError("Helo() Status != Helo");
         return(false);
     }
     //HELO送信
     if (!SendCmd(String.Format("HELO 1")))
     {
         return(false);
     }
     //250受信
     if (!RecvStatus(250))
     {
         return(false);
     }
     Status = SmtpClientStatus.Transaction;
     return(true);
 }
Beispiel #5
0
 public bool Rcpt(String mailAddress)
 {
     //トランザクションでない場合エラー
     if (Status != SmtpClientStatus.Transaction)
     {
         SetLastError("Rcpt() Status != Transaction");
         return(false);
     }
     //RCPT送信
     if (!SendCmd(String.Format("RCPT TO: {0}", mailAddress)))
     {
         return(false);
     }
     //250受信
     if (!RecvStatus(250))
     {
         return(false);
     }
     Status = SmtpClientStatus.Transaction;
     return(true);
 }
Beispiel #6
0
 public bool Quit()
 {
     //トランザクションでない場合エラー
     if (Status == SmtpClientStatus.Idle)
     {
         SetLastError("Quit() Status == Idle");
         return(false);
     }
     //QUIT送信
     if (!SendCmd("QUIT"))
     {
         return(false);
     }
     //221受信
     if (!RecvStatus(221))
     {
         return(false);
     }
     //切断
     _sockTcp.Close();
     _sockTcp = null;
     Status   = SmtpClientStatus.Idle;
     return(true);
 }
Beispiel #7
0
        public bool Auth(SmtpClientAuthKind kind,String user, String pass)
        {
            //トランザクションでない場合エラー
            if (Status != SmtpClientStatus.Transaction) {
                SetLastError("Auth() Status != Transaction");
                return false;
            }
            //AUTH送信
            var authStr="";
            switch (kind){
                case SmtpClientAuthKind.Login:
                    authStr = "AUTH LOGIN";
                    break;
                case SmtpClientAuthKind.Plain:
                    authStr = "AUTH PLAIN";
                    break;
                case SmtpClientAuthKind.CramMd5:
                    authStr = "AUTH CRAM-MD5";
                    break;
            }
            if (!SendCmd(authStr)){
                return false;
            }
            //334受信
            if (!RecvStatus(334)){
                return false;
            }
            //ユーザ・パスワード送信
            switch (kind){
                case SmtpClientAuthKind.Plain:
                    //ユーザ名送信
                    var str = String.Format("{0}\0{1}\0{2}", user, user, pass);
                    if (!SendCmd(String.Format(Base64.Encode(str)))) {
                        return false;
                    }
                    break;
                case SmtpClientAuthKind.Login:
                    //ユーザ名送信
                    if (!SendCmd(String.Format(Base64.Encode(user)))) {
                        return false;
                    }
                    //334受信
                    if (!RecvStatus(334)) {
                        return false;
                    }
                    //パスワード送信
                    if (!SendCmd(String.Format(Base64.Encode(pass)))) {
                        return false;
                    }
                    break;
                case SmtpClientAuthKind.CramMd5:
                    //MD5送信
                    var timestamp = _recvStr.Split(' ')[1];
                    var s = string.Format("{0} {1}", user, Md5.Hash(pass, Base64.Decode(timestamp)));
                    if (!SendCmd(Base64.Encode(s))) {
                        return false;
                    }
                    break;

            }
            //235受信
            if (!RecvStatus(235)) {
                return false;
            }
            Status = SmtpClientStatus.Transaction;
            return true;
        }
Beispiel #8
0
 //接続確認
 void ConfirmConnect()
 {
     //既に切断されている場合
     if (_sockTcp.SockState != SockState.Connect) {
         Status = SmtpClientStatus.Idle;
     }
 }
Beispiel #9
0
 public bool Rcpt(String mailAddress)
 {
     //トランザクションでない場合エラー
     if (Status != SmtpClientStatus.Transaction) {
         SetLastError("Rcpt() Status != Transaction");
         return false;
     }
     //RCPT送信
     if (!SendCmd(String.Format("RCPT TO: {0}", mailAddress))) {
         return false;
     }
     //250受信
     if (!RecvStatus(250)) {
         return false;
     }
     Status = SmtpClientStatus.Transaction;
     return true;
 }
Beispiel #10
0
 public bool Quit()
 {
     //トランザクションでない場合エラー
     if (Status == SmtpClientStatus.Idle) {
         SetLastError("Quit() Status == Idle");
         return false;
     }
     //QUIT送信
     if (!SendCmd("QUIT")) {
         return false;
     }
     //221受信
     if (!RecvStatus(221)) {
         return false;
     }
     //切断
     _sockTcp.Close();
     _sockTcp = null;
     Status = SmtpClientStatus.Idle;
     return true;
 }
Beispiel #11
0
 public bool Helo()
 {
     //切断中の場合はエラー
     if (Status != SmtpClientStatus.Helo) {
         SetLastError("Helo() Status != Helo");
         return false;
     }
     //HELO送信
     if (!SendCmd(String.Format("HELO 1"))) {
         return false;
     }
     //250受信
     if (!RecvStatus(250)) {
         return false;
     }
     Status = SmtpClientStatus.Transaction;
     return true;
 }
Beispiel #12
0
 //接続
 public bool Connect()
 {
     if (Status != SmtpClientStatus.Idle) {
         SetLastError("Connect() Status != Idle");
         return false;
     }
     if (_ip.InetKind == InetKind.V4) {
         _sockTcp = Inet.Connect(new Kernel(), _ip, _port, _sec + 3, null);
     } else {
         _sockTcp = Inet.Connect(new Kernel(), _ip, _port, _sec + 3, null);
     }
     if (_sockTcp.SockState == SockState.Connect) {
         //220受信
         if (!RecvStatus(220)) {
             return false;
         }
         Status = SmtpClientStatus.Helo;
         return true;
     }
     SetLastError("Faild in SmtpClient Connect()");
     return false;
 }
Beispiel #13
0
        public bool Auth(SmtpClientAuthKind kind, String user, String pass)
        {
            //トランザクションでない場合エラー
            if (Status != SmtpClientStatus.Transaction)
            {
                SetLastError("Auth() Status != Transaction");
                return(false);
            }
            //AUTH送信
            var authStr = "";

            switch (kind)
            {
            case SmtpClientAuthKind.Login:
                authStr = "AUTH LOGIN";
                break;

            case SmtpClientAuthKind.Plain:
                authStr = "AUTH PLAIN";
                break;

            case SmtpClientAuthKind.CramMd5:
                authStr = "AUTH CRAM-MD5";
                break;
            }
            if (!SendCmd(authStr))
            {
                return(false);
            }
            //334受信
            if (!RecvStatus(334))
            {
                return(false);
            }
            //ユーザ・パスワード送信
            switch (kind)
            {
            case SmtpClientAuthKind.Plain:
                //ユーザ名送信
                var str = String.Format("{0}\0{1}\0{2}", user, user, pass);
                if (!SendCmd(String.Format(Base64.Encode(str))))
                {
                    return(false);
                }
                break;

            case SmtpClientAuthKind.Login:
                //ユーザ名送信
                if (!SendCmd(String.Format(Base64.Encode(user))))
                {
                    return(false);
                }
                //334受信
                if (!RecvStatus(334))
                {
                    return(false);
                }
                //パスワード送信
                if (!SendCmd(String.Format(Base64.Encode(pass))))
                {
                    return(false);
                }
                break;

            case SmtpClientAuthKind.CramMd5:
                //MD5送信
                var timestamp = _recvStr.Split(' ')[1];
                var s         = string.Format("{0} {1}", user, Md5.Hash(pass, Base64.Decode(timestamp)));
                if (!SendCmd(Base64.Encode(s)))
                {
                    return(false);
                }
                break;
            }
            //235受信
            if (!RecvStatus(235))
            {
                return(false);
            }
            Status = SmtpClientStatus.Transaction;
            return(true);
        }