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

隨筆-145  評論-173  文章-70  trackbacks-0
      五一放假了,沒有到哪里去玩,雖然說還是很多事情要做,不過先做做這個再說。于是花了大概一天半的時間,搞定了這個小的程序,也算是回報吧!以后會繼續(xù)完善和補充的。
      話說上次騰訊2面的時候我表現(xiàn)太不好了,傷心啊~~~所以從現(xiàn)在起,要在忙中抽時間來繼續(xù)Coding,增強實力。估計過段時間的百度和其他實習(xí)不會去了,研究生真的很重要,所以要好好準備考研了,加油!
       不說廢話了,上筆記:


SMTP郵件發(fā)送剖析

封裝之后的類如下:



// MySmtp.cpp: implementation of the MySmtp class.
//
/**/
//////////////////////////////////////////////////////////////////////
 
#include 
"stdafx.h"
#include 
"MailExam.h"
#include 
"MySmtp.h"
#include 
"ZBase64.h"
 
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
 
 
#define COPYRIGHT "Smtp Client"         // 版權(quán)信息
#define BOUNDARY "www.hust.edu.cn"                                // 邊界字符串
/**///////////////////////////////////////////////////////////////////////
// Construction/Destruction
/**/
//////////////////////////////////////////////////////////////////////
 
MySmtp::MySmtp()
{
 
}
 
MySmtp::
~MySmtp()
{
 
}
 
bool MySmtp::CreateSocket()        //創(chuàng)建一個Socket
{
         
if(WSAStartup(0x0101&m_WSADATA) != 0)        //至此socket版本是2.2,第一個參數(shù)也可以是MAKEWORD( 2, 2 )
         {
                  ReleaseSocket();
                  
return false;             //創(chuàng)建失敗
         }
         
if( (m_SOCKET= socket(AF_INET,SOCK_STREAM, 0)) == INVALID_SOCKET){
                  ReleaseSocket();
                  
return false;
         }
         
return true;
}
 
//通過和比較碼比較來發(fā)現(xiàn)是否響應(yīng)成功
bool MySmtp::CheckResponse(const char* RecvCode)
{
         
//將收到的和對應(yīng)的碼字比較,判斷是否發(fā)生錯誤
         char buf[1024= {0};
         
if(recv(m_SOCKET,buf,1024,0== SOCKET_ERROR)
                  
return false;
         
else 
         {
                  
return buf[0== RecvCode[0&& buf[1== RecvCode[1]
                  
&&buf[2== RecvCode[2? true : false;
         }
}
 
bool MySmtp::Connect(const string SmtpAddr,const int Port)
{
         
if(!CreateSocket())
                  
return false;
         
//得到主機(要發(fā)送給的SMTP地址如smtp.sina.com.cn)地址,并將相應(yīng)的信息寫入m_HOSTENT,
         
//就是在那個字符串中查找到相應(yīng)信息并且構(gòu)造一個結(jié)構(gòu)體HOSTENT(這個記錄了很多信息,不僅僅是地址)
         if((m_HOSTENT = gethostbyname((SmtpAddr.c_str()))) == NULL) //將傳入的主機參數(shù)給m_HOSTENT
                  return false;
//    AfxMessageBox(m_HOSTENT->h_name);    //調(diào)試用的,找到HOSTENT的結(jié)構(gòu)內(nèi)容
//    AfxMessageBox(*m_HOSTENT->h_aliases);
         if(m_HOSTENT->h_addr_list[0== NULL)     //地址列表為空
         {
                  ReleaseSocket();
                  
return false;
         }
//    AfxMessageBox(m_HOSTENT->h_addr_list[0]);
//    AfxMessageBox(m_HOSTENT->h_addr_list[1]);
         memset(&m_SOCKADDR_IN,0,sizeof(m_SOCKADDR_IN));
         
//將這個SOCKET和主機地址聯(lián)系起來,其實WinSoket中,m_HOSTENT 和m_SOCKADDR_IN都是表示的主機地址,也就是目的地的地址
         
//
         m_SOCKADDR_IN.sin_family = AF_INET;
         m_SOCKADDR_IN.sin_addr.S_un.S_addr 
= *(ULONG *) m_HOSTENT->h_addr_list[0];
         m_SOCKADDR_IN.sin_port 
= htons(Port);
//    u_long tmp = *(ULONG *) m_HOSTENT->h_addr_list[0];
//     char newstring[30];
//    sprintf(newstring,"%d",tmp);
//    AfxMessageBox(newstring);
 
         
//進行連接
         if(connect(m_SOCKET,(sockaddr *)&m_SOCKADDR_IN,sizeof(m_SOCKADDR_IN)) == SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("220")) return false;                 //服務(wù)準備就緒
         
         
//向服務(wù)器發(fā)送"HELO "+服務(wù)器名
         string strTmp="HELO "+SmtpAddr+"\r\n";
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR) 
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;                 //請求操作就緒
         
         
return true;
}
 
void MySmtp::ReleaseSocket()
{
         shutdown(m_SOCKET,SD_BOTH);
         closesocket(m_SOCKET);
         WSACleanup();
 
}
bool MySmtp::SendData(const string SendFrom, const string SendToList, 
                                              
const string SenderName, const string ReceiverName, 
                                              
const string Subject, const string Content )
{
         
if(SendFrom.empty())
                  
return false;    //源地址是空的
         if(SendToList.empty()) 
                  
return false;    //目的地址為空
         
         
string strTmp;
         ZBase64 base64;
         
         
//發(fā)送MAIL FROM:<abc@xyz.com>
         strTmp="MAIL FROM:<"+SendFrom+">\r\n";
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;
         
         
//發(fā)送RCPT To:<abc@xyz.com>
         strTmp="RCPT To:<"+SendToList+">\r\n";
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;
 
         
         
//發(fā)送"DATA\r\n"
         if(send(m_SOCKET,"DATA\r\n",strlen("DATA\r\n"),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("354")) return false;
         
         
//"Mail From:SenderName<xxx@mail.com>\r\n"
         strTmp="From:"+SenderName+"<"+SendFrom+">\r\n";
         
         
//"Subject: 郵件主題\r\n"
         strTmp+="Subject:"+Subject+"\r\n";
         
         
//"MIME_Version:1.0\r\n"
         strTmp+="MIME_Version:1.0\r\n";
         
         
//"X-Mailer:Smtp Client By xxx"//版權(quán)信息
         strTmp+="X-Mailer:"; strTmp+=COPYRIGHT; strTmp+="\r\n";
         
         
//"MIME_Version:1.0\r\n"
         strTmp+="MIME_Version:1.0\r\n";
         
         
//"Content-type:multipart/mixed;Boundary=xxx\r\n\r\n";
         strTmp+="Content-type:multipart/mixed;Boundary=";
         strTmp
+=BOUNDARY;
         strTmp
+="\r\n\r\n";
         
         
//先將HEADER部分發(fā)送過去
         if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;    
         }
         
         
//郵件主體
         strTmp="--";
         strTmp
+=BOUNDARY;
         strTmp
+="\r\n";
         strTmp
+= "Content-type:text/plain;Charset=gb2312\r\n";
         strTmp
+="Content-Transfer-Encoding:8bit\r\n\r\n";
         
         
//郵件內(nèi)容
         strTmp+=Content+"\r\n\r\n";
         
         
//將郵件內(nèi)容發(fā)送出去
         if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;    
         }
         strTmp
="--";
         strTmp
+=BOUNDARY;
         strTmp
+="--\r\n.\r\n";
         
         
if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("250")) return false;
         
         
//退出
         if(send(m_SOCKET,"QUIT\r\n",strlen("QUIT\r\n"),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("221")) return false;
         
         ReleaseSocket();
         
return true;
}
bool MySmtp::Validate(const string Username,const string Password)
{
         ZBase64 base64;
         
         
//發(fā)送"AUTH LOGIN"
         if(send(m_SOCKET,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("334")) return false;
         
         
//發(fā)送經(jīng)base64編碼的用戶名
         string strUserName=base64.Encode((unsigned char *)Username.c_str(),Username.length())+"\r\n";
         
if(send(m_SOCKET,strUserName.c_str(),strUserName.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("334")) return false;
         
         
//發(fā)送經(jīng)base64編碼的密碼
         string strPassword=base64.Encode((unsigned char *)Password.c_str(),Password.length())+"\r\n";
         
if(send(m_SOCKET,strPassword.c_str(),strPassword.length(),0== SOCKET_ERROR)
         {
                  ReleaseSocket();
                  
return false;
         }
         
if(!CheckResponse("235")) return false;
         
         
return true;
}

 

 

 

具體如何調(diào)用的是用這個實現(xiàn):


void CMailExamDlg::OnOK() 
{
         
// TODO: Add extra validation here
         MySmtp smtp;
         CString strSmtpAddr,strAccount,strPasswrod;
         GetDlgItemText(IDC_EDIT1,strSmtpAddr);
         GetDlgItemText(IDC_EDIT2,strAccount);
         GetDlgItemText(IDC_EDIT3,strPasswrod);
         
if(!smtp.Connect((LPSTR)(LPCTSTR)strSmtpAddr,25)){
                  AfxMessageBox(
"連接服務(wù)器失敗!"); return ;    
         }
         
         
//驗證用戶名密碼
         if(!smtp.Validate((LPSTR)(LPCTSTR)strAccount,(LPSTR)(LPCTSTR)strPasswrod)){
                  AfxMessageBox(
"用戶名或密碼失敗!"); return ;        
         }
         CString SendFrom,SendToList,SenderName,RecevierName,Subject,Content;
         GetDlgItemText(IDC_EDIT4,SendFrom);
         GetDlgItemText(IDC_EDIT5,SendToList);
         GetDlgItemText(IDC_EDIT6,Content);
         GetDlgItemText(IDC_EDIT7,SenderName);
         GetDlgItemText(IDC_EDIT8,RecevierName);
         GetDlgItemText(IDC_EDIT9,Subject);
         
//發(fā)送
         if(!smtp.SendData((LPSTR)(LPCTSTR)SendFrom,
                  (LPSTR)(LPCTSTR)SendToList,
                  (LPSTR)(LPCTSTR)SenderName,
                  (LPSTR)(LPCTSTR)RecevierName,
                  (LPSTR)(LPCTSTR)Subject,
                  (LPSTR)(LPCTSTR)Content))
         {
                  AfxMessageBox(
"郵件發(fā)送失敗!"); 
                  
return ;
         }
         AfxMessageBox(
"郵件發(fā)送成功!");
//     CDialog::OnOK();
}

 

實際上本質(zhì)就是,1,連接Connect,2,驗證賬戶密碼Validate,3,發(fā)送數(shù)據(jù)

 

 

最核心的部分:如何實現(xiàn)MySmtp?

首先看看類視圖,看看這個封裝的類到底實現(xiàn)了哪些功能:

                               

 

 

在這個部分,關(guān)鍵的是:connect,Validate,checkResponse,SendData,CreateSocket這些函數(shù),分別來說明:

CreateSocket: 創(chuàng)建Socket,利用Socket來編寫郵件客戶端,就是需要利用到Socket來作為一個門戶啊,關(guān)于socket的解釋,這里不再多說,由于是用的Windows下面的平臺,所以需要用到的WinSock來編寫,對應(yīng)的就需要一定的規(guī)則。具體來說就是需要WSAStartup來

這個函數(shù)是應(yīng)用程序應(yīng)該第一個調(diào)用的Winsock API 函數(shù),以完成一系列初始化的工作。必不可少!

其次,就是需要完成真正的創(chuàng)建,所以調(diào)用Socket函數(shù)來實現(xiàn),創(chuàng)建后的返回值就是一個SOCKET對象,需要保存它,因此專門定義一個類成員m_SOCKET來保存這個變量,使得以后不管是發(fā)送還是接受,都可以用這個變量來實現(xiàn)(前面已經(jīng)說了,socket對象就是一個門戶,需要通過它來發(fā)送和接收)

 

 

checkResponse :需要通過這個函數(shù)來實時的檢查狀態(tài),比如發(fā)送是否成功,并且可以得到相應(yīng)的錯誤信息,也便于調(diào)試。

驗證從服務(wù)器返回的前三位代碼和傳遞進來的參數(shù)是否一樣

                           備注:

                           211 幫助返回系統(tǒng)狀態(tài)

                           214 幫助信息

                           220 服務(wù)準備就緒

                           221 關(guān)閉連接

                           235 用戶驗證成功

                           250 請求操作就緒

                           251 用戶不在本地,轉(zhuǎn)寄到其他路徑

                           334 等待用戶輸入驗證信息

                           354 開始郵件輸入

                           421 服務(wù)不可用

                           450 操作未執(zhí)行,郵箱忙

                           451 操作中止,本地錯誤

                           452 操作未執(zhí)行,存儲空間不足

                           500 命令不可識別或語言錯誤

                           501 參數(shù)語法錯誤

                           502 命令不支技

                           503 命令順序錯誤

                           504 命令參數(shù)不支持

                           550 操作未執(zhí)行,郵箱不可用

                           551 非本地用戶

                           552 中止存儲空間不足

                           553 操作未執(zhí)行,郵箱名不正確

                           554 傳輸失敗

為此,需要從socket接收數(shù)據(jù),然后和標準的這些碼字,比如554來進行比較,通過比較的結(jié)果來決定是否響應(yīng)正確,確定后面是否傳輸!具體的函數(shù)實際上就是一個recv來實現(xiàn)。而接收的結(jié)果,需要存放下來,然后手動比較,就有了

return buf[0] == RecvCode[0] && buf[1] == RecvCode[1]&&buf[2] == RecvCode[2] ? true : false;

The recv function receives data from a connected or bound socket.

 

 

Connect:連接部分其實也是一個很簡單的功能,就是要發(fā)送一個HELO + 服務(wù)器名,但是注意這個之前,需要完成一些操作。首先,就是要建立連接,讓它知道我要連接它,用connect函數(shù)。向?qū)Ψ街鲃犹岢鲞B接請求。其次就是如何發(fā)送?當(dāng)然是通過socket發(fā)送,調(diào)用send函數(shù)來實現(xiàn)了(都是底層的API),但是,由于是第一次發(fā)送,所以需要創(chuàng)建socket,所以調(diào)用了前面的CreateSocket來創(chuàng)建,(注意,代碼中多出用到了判斷語句,因為網(wǎng)絡(luò)中很容易就出現(xiàn)錯誤,所以需要實時的進行if判斷,及時定位錯誤,否則后面的編碼就容易出錯而不知道如何編寫),然后就是要根據(jù)send函數(shù)的參數(shù)來調(diào)用了。對于connect函數(shù),根據(jù)API原型,需要SOCKADDR_IN類型的參數(shù),也就是記錄了遠程主機(服務(wù)器)的地址信息的東西。我們可以知道的就只用smtp.sina.com.cn(這里以新浪郵箱為例),所以需要的操作就是,首先獲取主機名,得到一個HOSTENT的結(jié)構(gòu)體,調(diào)用gethostbyname,這個函數(shù)的作用就是傳入一個主機名,如上面的smtp.sina.com.cn,它會自動的創(chuàng)建一個HOSTENT結(jié)構(gòu)體,并用相應(yīng)的主機信息來填充它。當(dāng)然,這個還不夠,需要對于SOCKADDR_IN的其它部分賦值,所以需要其它的操作,對于類變量m_SOCKADDR_IN進行初始化,完成之后,就可以調(diào)用connect函數(shù)了,如果建立成功…………否則…………

一般的SOCKADDR_IN初始化是:

         m_SOCKADDR_IN.sin_family = AF_INET;

         m_SOCKADDR_IN.sin_addr.S_un.S_addr = *(ULONG *) m_HOSTENT->h_addr_list[0];

         m_SOCKADDR_IN.sin_port = htons(Port);

 

完成上面的一步之后,剩下來的就是發(fā)送第一個數(shù)據(jù)報文HELO來“打個招呼”了,這個很簡單,因為是有具體的規(guī)定,所以不難得到://向服務(wù)器發(fā)送"HELO "+服務(wù)器名

send(m_SOCKET,strTmp.c_str(),strTmp.length(),0)

注意完成之后可以及時的調(diào)用CheckResponse來檢測結(jié)果!

 

 

 

Validate:驗證密碼的正確性是一個很重要的步驟。首先發(fā)送一個報文請求服務(wù)器響應(yīng),根據(jù)得到的信息,決定服務(wù)器是否可以連接,從而下一步操作才有可行性。如果連接失敗,那么即使用戶名和密碼都正確,也會出現(xiàn)問題。如何驗證正確性?就是發(fā)送賬號和密碼。但是注意的是,在網(wǎng)絡(luò)SMTP傳輸中,需要使用編碼來傳輸,也就是說不是直接用的字面值,所以需要調(diào)用編碼函數(shù),先編碼,在傳輸。這里引用了外部庫ZBase64庫來實現(xiàn)編碼,解碼。先不討論這部分。發(fā)送賬號和密碼很簡單,先調(diào)用加密函數(shù)編碼,然后發(fā)送,只是在這個之前,需要調(diào)用send(m_SOCKET,"AUTH LOGIN\r\n",strlen("AUTH LOGIN\r\n"),0)來發(fā)送一個報文,說是要發(fā)送賬號密碼,注意就相當(dāng)于加了一個label驗證的作用。實際上在后面的發(fā)送數(shù)據(jù)的時候,也是按照它定義的格式,先在前面有l(wèi)abel,如Mail From,然后加上發(fā)送的內(nèi)容,注意按照標準的格式來,才能實現(xiàn)穩(wěn)定傳輸。

 

 

 

SendData:這部分也許是最復(fù)雜的。我先來討論最簡單的,就是發(fā)送文本文件,而沒有帶附件的。其實,發(fā)送數(shù)據(jù)的過程和前面的Connect是一樣的(特別是第一個HELO報文的發(fā)送),但是,要具體根據(jù)RFC文檔(SMTP對應(yīng))的來決定發(fā)送的報文頭和正文格式。如果格式不正確,那么,發(fā)送也是枉然。(注意發(fā)送的數(shù)據(jù)不需要用Base64來編碼),只是,需要用一定的個數(shù),比如:

         strTmp="MAIL FROM:<"+SendFrom+">\r\n";

         if(send(m_SOCKET,strTmp.c_str(),strTmp.length(),0) == SOCKET_ERROR)

         {

                  ReleaseSocket();

                  return false;

         }

來實現(xiàn)而已。

這部分最好的資料就是RFC文檔,其中講到了很多實際的例子和格式要求,其它的內(nèi)容就是重復(fù)上面的代碼,很簡單。

(當(dāng)然,這部分很容易出錯,造成發(fā)送說成功,但是收不到!我開始的時候沒QUIT部分報文,所以就出現(xiàn)發(fā)送提示成功但是沒有接收到的情況!)(待續(xù)……)

 

posted on 2010-05-02 15:59 deercoder 閱讀(3015) 評論(0)  編輯 收藏 引用 所屬分類: MFC程序設(shè)計入門
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            中文欧美在线视频| 欧美国产欧美亚州国产日韩mv天天看完整 | 欧美77777| 免费成人美女女| 久久精品观看| 欧美ab在线视频| 欧美日韩国产页| 国产精品久久久久久久久久久久| 欧美精品日韩www.p站| 欧美日韩另类视频| 欧美性一区二区| 韩国欧美国产1区| 亚洲国产精品va| 亚洲精品在线三区| 国产午夜精品理论片a级大结局 | 一区二区三区高清不卡| 一本色道久久综合狠狠躁的推荐| 亚洲韩国日本中文字幕| 日韩一级在线观看| 亚洲影院色无极综合| 久久九九国产精品| 麻豆成人av| 亚洲高清免费视频| 欧美福利精品| 亚洲午夜羞羞片| 久久一区中文字幕| 欧美天天视频| 伊人影院久久| 性欧美激情精品| 亚洲片区在线| 久久成人免费网| 欧美视频中文一区二区三区在线观看 | 欧美激情一区二区三区在线视频| 国产精品黄视频| 91久久精品国产| 久久久av毛片精品| 一本色道久久综合亚洲二区三区| 久久久夜色精品亚洲| 国产精品毛片a∨一区二区三区| 激情一区二区三区| 午夜免费久久久久| 亚洲精品一区二区三| 久久人人爽人人爽爽久久| 国产精品亚洲成人| 一区二区欧美日韩视频| 欧美国产日本韩| 久久成人羞羞网站| 国外成人网址| 久久精品道一区二区三区| 一区二区三区高清视频在线观看 | 亚洲小说欧美另类社区| 欧美日韩国产电影| 亚洲精品国产精品国自产观看浪潮| 午夜精品一区二区三区四区| 亚洲欧洲一二三| 欧美高清不卡| 亚洲精品久久久久久久久久久| 久久久久综合| 欧美一区亚洲| 亚洲天堂免费观看| 亚洲国产综合91精品麻豆| 久久久久久国产精品mv| 国内外成人免费激情在线视频| 欧美伊人精品成人久久综合97| 一区二区三区导航| 欧美日韩一区成人| 一区二区91| 99riav1国产精品视频| 欧美日韩黄色大片| 一区二区三区日韩欧美| 亚洲国产视频一区二区| 免费亚洲视频| av72成人在线| 一区二区三区日韩在线观看| 国产精品高精视频免费| 欧美亚洲在线观看| 欧美中文字幕第一页| 在线观看福利一区| 亚洲欧洲日产国产综合网| 欧美吻胸吃奶大尺度电影| 亚洲欧美第一页| 欧美一区二区精品久久911| 黄色精品一区二区| 亚洲国产婷婷香蕉久久久久久| 欧美日韩无遮挡| 欧美在线视频a| 久久一区二区三区四区| 国产精品99久久久久久有的能看| 亚洲一区在线直播| 在线观看国产精品网站| 99re热这里只有精品视频| 国产精品午夜春色av| 麻豆免费精品视频| 欧美日韩免费高清一区色橹橹| 欧美一区二区国产| 久久久精彩视频| 中文日韩在线视频| 久久精品国产清自在天天线| 亚洲精品一区在线| 午夜精品久久久久久久| 91久久国产精品91久久性色| 一本大道av伊人久久综合| 国自产拍偷拍福利精品免费一| 亚洲福利专区| 国产一区二区三区日韩欧美| 亚洲高清在线视频| 欧美精品www| 欧美在线视频网站| 欧美成人在线免费观看| 午夜精品视频一区| 欧美久久久久久久久久| 欧美影院视频| 欧美精品一区二区三区久久久竹菊| 欧美在线观看视频在线 | 欧美 日韩 国产 一区| 欧美日韩精品欧美日韩精品 | 久久久久国产成人精品亚洲午夜| 亚洲精品一区中文| 久久久久久精| 欧美在线视频观看| 欧美午夜精品久久久久久孕妇| 久久精品视频在线看| 国产精品vip| 亚洲国产va精品久久久不卡综合| 国产日韩精品久久久| 中文一区字幕| 一本色道久久综合亚洲精品不 | 久久成人免费网| 午夜欧美精品| 国产精品99免费看| 亚洲激情黄色| 亚洲国产精品一区二区www在线| 欧美一区二区三区在线视频| 亚洲一区二区三区精品动漫| 欧美激情精品久久久久| 女同性一区二区三区人了人一| 国产美女精品免费电影| 一区二区三区回区在观看免费视频 | 久久久久久久尹人综合网亚洲| 午夜精品美女自拍福到在线| 欧美午夜精品久久久久久浪潮 | 亚洲国产精品va在看黑人| 久久久久久夜| 久久美女性网| 激情文学一区| 久久久青草婷婷精品综合日韩| 久久久精品动漫| 经典三级久久| 久久久久久高潮国产精品视| 可以免费看不卡的av网站| 韩国在线视频一区| 久久久综合网站| 亚洲成色999久久网站| 亚洲精品日产精品乱码不卡| 欧美日产一区二区三区在线观看| 亚洲伦理网站| 午夜精品一区二区在线观看 | 国产精品欧美精品| 午夜精品理论片| 久久精品视频在线观看| 伊人久久大香线| 欧美成人在线网站| 亚洲精品中文字幕在线| 亚洲欧美国产另类| 国产亚洲女人久久久久毛片| 久久裸体艺术| 亚洲狠狠婷婷| 欧美在线免费视频| 在线日韩欧美| 欧美色网一区二区| 久久精品欧美| 亚洲免费观看高清在线观看 | 国产有码一区二区| 久久久久国产精品麻豆ai换脸| 欧美电影在线免费观看网站| 亚洲美洲欧洲综合国产一区| 国产精品ⅴa在线观看h| 久久国产毛片| 亚洲精品久久久一区二区三区| 亚洲欧美乱综合| 在线观看亚洲视频啊啊啊啊| 欧美日韩国产综合新一区| 久久精品五月婷婷| 国产精品v日韩精品| 久久久一区二区三区| 一本一本久久| 欧美xx视频| 欧美尤物巨大精品爽| 亚洲国产欧美一区二区三区久久| 欧美日韩色一区| 久久天天躁狠狠躁夜夜av| 亚洲视频www| 亚洲欧洲视频| 欧美成人精品激情在线观看| 欧美一区二区三区在线免费观看| 91久久黄色| 激情丁香综合| 国产欧美日韩亚洲精品| 欧美午夜视频在线| 欧美成人中文|