<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Java, Only Java!

    統(tǒng)計(jì)

    留言簿(20)

    積分與排名

    好友空間

    文檔技巧

    閱讀排行榜

    評(píng)論排行榜

    Apusic上用JavaMail發(fā)郵件

    Apusic上用JavaMail發(fā)郵件
    0. JavaMail基本介紹
    ?JavaMail是屬于J2EE框架中的一部分,主要是為簡(jiǎn)化Mail部分開(kāi)發(fā)工作。使用JavaMail發(fā)送郵件需要以下步驟:
    ?1)初始化Session實(shí)例;
    ?在初始化Session實(shí)例中有兩種方式:使用JNDI初始化和在代碼中自行完成初始化。
    ?★ 如果SMTP不需要認(rèn)證,則不再做其他工作;
    ?★ 如果SMTP需要認(rèn)證,則確定在Session中提供嵌入認(rèn)證信息,還是由3)Transport完成認(rèn)證過(guò)程。
    ?2)初始化Message實(shí)例,填充相關(guān)信息;
    ?3)初始化Transport實(shí)例,連接到遠(yuǎn)程SMTP服務(wù)器,發(fā)送郵件。
    ?在初始化Transport實(shí)例時(shí)也有兩種情況:
    ?★ 如果SMTP不需要認(rèn)證,可以直接調(diào)用send()函數(shù)發(fā)送郵件,應(yīng)用服務(wù)器會(huì)在后臺(tái)調(diào)用connect()函數(shù)完成誰(shuí),進(jìn)行郵件發(fā)送;
    ?★ 如果SMTP需要認(rèn)證,需要調(diào)用connect()函數(shù),并提供認(rèn)證需要的用戶(hù)名/密碼,才可以正確發(fā)送郵件。
    ?
    1. javax.mail.Session的初始化
    1.1. 使用JNDI初始化(配置JavaMail的JNDI)
    在Apusic的J2EE應(yīng)用中找到apusic-application.xml文件,增加<mail-session>部分,示例如下:
    <apusic-application>
    ?<module uri="web.war">
    ??<web />
    ?</module>
    ?<mail-session>
    ??<jndi-name>javamail/myMail</jndi-name>
    ??<property name="mail.transport.protocol" value="smtp" />
    ??<property name="mail.smtp.host" value="smtp.163.com" />
    ??<property name="mail.smtp.user" value="user" />
    ??<property name="mail.smtp.password" value="password" />
    ??<property name="mail.smtp.auth" value="true" />
    ??<property name="mail.from" value="user@163.com" />
    ?</mail-session>
    </apusic-application>

    1.1.1. 通過(guò)JNDI找到JavaMail
    1.1.1.1. 使用遠(yuǎn)程訪(fǎng)問(wèn)獲得JavaMail
    ?Hashtable env=new Hashtable();
    ?env.put(Context.INITIAL_CONTEXT_FACTORY,"com.apusic.naming.jndi.CNContextFactory");
    ?env.put(Context.PROVIDER_URL,"iiop://localhost:6888");
    ?//插入相關(guān)驗(yàn)證信息
    ?env.put(Context.SECURITY_CREDENTIALS,"admin" ) ;
    ?env.put(Context.SECURITY_PRINCIPAL,"admin");
    ?Context initCtx=new InitialContext(env);
    ?System.out.println(initCtx.PROVIDER_URL);
    ?//通過(guò)RMI 取得
    ?Session myMailSession = (Session) initCtx.lookup("javamail/myMailNoAuth");
    1.1.1.2. 使用Apusic默認(rèn)方式獲得JavaMail
    ?Context initCtx = new InitialContext();
    ?Session myMailSession = (Session) initCtx.lookup("javamail/myMailNoAuth");
    ?System.out.println(myMailSession.getProperty("mail.smtp.host"));
    ?
    1.1.2. 通過(guò)資源注入配置JavaMail
    ?@Resource(mappedName = "javamail/myMailAuth", type = javax.mail.Session.class, shareable = true, authenticationType = Resource.AuthenticationType.CONTAINER, description = "my email with auth")
    ?private Session myAuthMailSession;
    或者
    ?@Resource(mappedName = "javamail/myMailAuth")
    ?private Session myAuthMailSession;

    1.2. 在代碼中初始化
    1.2.1. 無(wú)須認(rèn)證的初始化
    ?final Properties props = new Properties();
    ?props.put("mail.transport.protocol", "smtp");
    ?props.put("mail.smtp.auth", "false");
    ?props.put("mail.smtp.host", "localhost");
    ?Session myMailSession = Session.getInstance(props);
    1.2.2. 需要認(rèn)證的初始化(Session實(shí)例構(gòu)造時(shí)提供認(rèn)證支持)
    ?final Properties props = new Properties();
    ?props.put("mail.transport.protocol", "smtp");
    ?props.put("mail.smtp.auth", "true");
    ?props.put("mail.smtp.host", "smtp.163.com");
    ?Session myMailSession = Session.getInstance(props, new Authenticator() {
    ??public PasswordAuthentication getPasswordAuthentication() {
    ???return new PasswordAuthentication("user", "password");}?});
    1.2.3. 需要認(rèn)證的初始化(Session配置參數(shù)提供認(rèn)證支持)
    ?myMailSession.setPasswordAuthentication(
    ??new URLName(props.getProperty("mail.transport.protocol")+"://"+??
    ???????????????? props.getProperty("mail.smtp.user")+"@"+??
    ???????????????? props.getProperty("mail.smtp.host")),??
    ??????? new PasswordAuthentication(props.getProperty("mail.smtp.user"),??
    ???????????????? props.getProperty("mail.smtp.password")));??

    1.2.4. 需要認(rèn)證的初始化(Transport配置參數(shù)提供認(rèn)證支持)
    ??// 發(fā)送郵件
    ??javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
    ??myTransport.connect("smtp.163.com", "user", "password");
    ??myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
    ??myTransport.close();
    ???
    1.4. 對(duì)Session調(diào)試的配置
    ●?可以在mail-session中加入<property name="mail.debug" value="true" />
    ●?可以在Session初始化前加入props.put("mail.debug", "true");
    ●?可以在Session初始化后,通過(guò)代碼控制myMailSession.setDebug(true);

    1.5. Properties的解釋
    ◆?mail.store.protocol:用于檢索郵件的協(xié)議
    ◆?mail.transport.protocol:用于傳送郵件的協(xié)議
    ◆?mail.host:默認(rèn)的主機(jī)名,默認(rèn)是本地計(jì)算機(jī)。
    ◆?mail.user:默認(rèn)的用戶(hù)名。
    ◆?mail.from:默認(rèn)的返回地址。
    ◆?mail.debug:是否輸出DEBUG信息。默認(rèn)為False。
    ◆?mail.protocol.host:指定協(xié)議的主機(jī)名,沒(méi)有指定就用mail.host。例如:mail.smtp.host=smtp.163.com
    ◆?mail.protocol.user:指定協(xié)議的用戶(hù)名,沒(méi)有指定就用mail.user。例如:mail.smtp.user=user
    ◆?mail.protocol.from:指定協(xié)議的返回地址,沒(méi)有指定就用mail.from。例如:mail.smtp.from=user@163.com
    ◆?mail.smtp.auth:如果是True,就會(huì)登錄SMTP服務(wù)器,獲得授權(quán)才能發(fā)送郵件。默認(rèn)為False。


    2. 通過(guò)JavaMail發(fā)送郵件
    2.1. 通過(guò)無(wú)須認(rèn)證的SMTP發(fā)郵件
    ??final Properties props = new Properties();
    ??props.put("mail.transport.protocol", "smtp");
    ??props.put("mail.smtp.auth", "false");
    ??props.put("mail.smtp.host", "localhost");
    ??try {
    ???Session myMailSession = Session.getInstance(props);
    ???myMailSession.setDebug(true); // 打開(kāi)DEBUG模式
    ???Message msg = new MimeMessage(myMailSession);
    ???msg.setFrom(new InternetAddress("user@163.com"));
    ???msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
    ???msg.setContent("I have a email test!", "text/plain");
    ???msg.setSentDate(new java.util.Date());
    ???msg.setSubject("Test");
    ???msg.setText("This is a test!\n");
    ???System.out.println("1.Please wait for sending one...");

    ???// 發(fā)送郵件
    ???// javax.mail.Transport.send(msg); // 與下面四行的功能一樣
    ???javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
    ???myTransport.connect();
    ???myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
    ???myTransport.close();
    ???
    ???System.out.println("2.Your message had send!");
    ??} catch (Exception error) {
    ???System.out.println("*.I am sorry to tell you the fail for " + error);
    ??}

    注:測(cè)試可以使用Microsft IIS SMTP 服務(wù),安裝好啟動(dòng)服務(wù)后,還需要進(jìn)入“IIS管理器”,增加一個(gè)“遠(yuǎn)程域”,對(duì)于“遠(yuǎn)程域”的“出站安全性”需要把用戶(hù)名和密碼加上(就是平時(shí)發(fā)郵件時(shí)登錄用的用戶(hù)名/密碼),否則郵件發(fā)不出去。

    2.2. 通過(guò)需要認(rèn)證的SMTP發(fā)郵件
    2.2.1. 需要認(rèn)證的初始化(Session實(shí)例構(gòu)造時(shí)提供認(rèn)證支持)
    ?final Properties props = new Properties();
    ?props.put("mail.transport.protocol", "smtp");
    ?props.put("mail.smtp.auth", "true");
    ?props.put("mail.smtp.host", "smtp.163.com");

    ?try {
    ??Session myMailSession = Session.getInstance(props, new Authenticator() {
    ???public PasswordAuthentication getPasswordAuthentication() {
    ????return new PasswordAuthentication("user", "password");
    ???}
    ??});
    ??myMailSession.setDebug(true);?// 打開(kāi)DEBUG模式
    ??InternetAddress address = new InternetAddress("user@163.com");
    ??String message = "I have a email test!";
    ??Message msg = new MimeMessage(myMailSession);
    ??msg.setFrom(address);
    ??msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
    ??msg.setContent(message, "text/plain");
    ??msg.setSentDate(new java.util.Date());
    ??msg.setSubject("Test");
    ??msg.setText("This is a test!\n");
    ??out.println("1.Please wait for sending...");
    ??
    ??// 發(fā)送郵件
    ??javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
    ??myTransport.connect();
    ??myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
    ??myTransport.close();
    ??// javax.mail.Transport.send(msg);?// 注釋上四行,打開(kāi)這行代碼,功能一樣
    ??out.println("2.Your message had send!");
    ?} catch (Exception error) {
    ??out.println("*.I am sorry to tell you the fail for " + error);
    ?}

    2.2.2. 需要認(rèn)證的初始化(Session配置參數(shù)提供認(rèn)證支持)
    ?final Properties props = new Properties();
    ?props.put("mail.transport.protocol", "smtp");
    ?props.put("mail.smtp.auth", "true");
    ?props.put("mail.smtp.host", "smtp.163.com");

    ?try {
    ??Session myMailSession = Session.getInstance(props);
    ??myMailSession.setDebug(true);?// 打開(kāi)DEBUG模式
    ??myAuthMailSession.setPasswordAuthentication(
    ???new URLName("smtp://user@host", new PasswordAuthentication("user","password"));?
    ??InternetAddress address = new InternetAddress("user@163.com");
    ??String message = "I have a email test!";
    ??Message msg = new MimeMessage(myMailSession);
    ??msg.setFrom(address);
    ??msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
    ??msg.setContent(message, "text/plain");
    ??msg.setSentDate(new java.util.Date());
    ??msg.setSubject("Test");
    ??msg.setText("This is a test!\n");
    ??out.println("1.Please wait for sending...");
    ??
    ??// 發(fā)送郵件
    ??javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
    ??myTransport.connect();
    ??myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
    ??myTransport.close();
    ??// javax.mail.Transport.send(msg);?// 注釋上四行,打開(kāi)這行代碼,功能一樣
    ??out.println("2.Your message had send!");
    ?} catch (Exception error) {
    ??out.println("*.I am sorry to tell you the fail for " + error);
    ?}

    2.2.3. 需要認(rèn)證的初始化(Transport配置參數(shù)提供認(rèn)證支持)
    ??final Properties props = new Properties();
    ??props.put("mail.transport.protocol", "smtp");
    ??props.put("mail.smtp.auth", "true");

    ??try {
    ???Session myMailSession = Session.getInstance(props);
    ???myMailSession.setDebug(true); // 打開(kāi)DEBUG模式
    ???Message msg = new MimeMessage(myMailSession);
    ???msg.setFrom(new InternetAddress("user@163.com"));
    ???msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("zhuyuanxiang@apusic.com"));
    ???msg.setContent("I have a email test!", "text/plain");
    ???msg.setSentDate(new java.util.Date());
    ???msg.setSubject("Test");
    ???msg.setText("This is a test!\n");
    ???System.out.println("1.Please wait for sending two...");

    ???// 發(fā)送郵件
    ???javax.mail.Transport myTransport = myMailSession.getTransport("smtp");
    ???myTransport.connect("smtp.163.com", "user", "password");
    ???myTransport.sendMessage(msg, msg.getRecipients(Message.RecipientType.TO));
    ???myTransport.close();
    ???// javax.mail.Transport.send(msg); // 這行不能使用。
    ???System.out.println("2.Your message had send!");
    ??} catch (Exception error) {
    ???System.out.println("*.I am sorry to tell you the fail for " + error);
    ??}
    ?}

    注:資源注入的Session發(fā)送郵件時(shí):
    無(wú)須認(rèn)證的SMTP,可以參考2.1.
    需要認(rèn)證的SMTP,可以參考2.2.1.

    參考:
    http://java.sun.com/products/javamail/javadocs/com/sun/mail/smtp/package-summary.html
    http://commons.apache.org/email/userguide.html
    http://m.tkk7.com/Unmi/archive/2007/06/07/124179.html
    http://unmi.blogcn.com/diary,117630488.shtml


    Apusic Stduio打包的示例工程。
    http://zhuyuanxiang.javaeye.com/topics/download/d6f5c3a9-9cd9-30be-9b64-9e311900b304

    備注:本文耗時(shí)1周完成。

    posted on 2008-09-04 12:11 zYx.Tom 閱讀(1650) 評(píng)論(7)  編輯  收藏 所屬分類(lèi): 1.Java世界

    評(píng)論

    # re: Apusic上用JavaMail發(fā)郵件 2008-09-04 12:34 隔葉黃鶯

    說(shuō)真的,Apusic 用處理 JavaMail 資源還稍欠了些,理想的狀態(tài)應(yīng)該是代碼只要寫(xiě)成如下:

    Session myMailSession = (Session)ctx.lookup("mail/mailSession");
    Message msg = new MimeMessage(myMailSession);
    ......
    Transport.send(msg);

    然后要不要驗(yàn)證,由配置屬性 mail.smtp.auth 來(lái)自行決定,Spring 是做到了這一點(diǎn)的。

    要是像上面那樣,代碼基本完成了全過(guò)程,看是用不著在 Apusic 進(jìn)行相關(guān)的配置的。我覺(jué)得這一點(diǎn)上 Apusic 應(yīng)該要有所改進(jìn)。  回復(fù)  更多評(píng)論   

    # re: Apusic上用JavaMail發(fā)郵件 2008-09-04 12:48 朱遠(yuǎn)翔-Apusic技術(shù)顧問(wèn)

    @隔葉黃鶯
    Apusic也是這樣處理的呀?
    而且是否認(rèn)證其實(shí)跟Apusic無(wú)關(guān),這個(gè)是Sun提供的JavaMail包里面決定的。
    個(gè)人感覺(jué)發(fā)送時(shí)登錄過(guò)程,無(wú)論哪個(gè)應(yīng)用服務(wù)器都需要按照上面的代碼操作吧。
    我對(duì)Spring的JavaMail了解不多,是否方便給出完整的代碼進(jìn)行討論,謝謝。
      回復(fù)  更多評(píng)論   

    # re: Apusic上用JavaMail發(fā)郵件 2008-09-04 14:19 隔葉黃鶯

    WAS5.1也是要自己登錄,而且用戶(hù)名和密碼必須以額外的屬性進(jìn)行設(shè)置,然后在程序中取出來(lái),所以我沒(méi)去用 WAS 的 MailSession 資源配置。或是自己程序處理。
    或是用 Spring 的配置,就比較輕松,Spring 會(huì)自己完成登錄過(guò)程。

    我之前寫(xiě)過(guò)一個(gè) 《JavaMail 發(fā)郵件需要 SMTP 驗(yàn)證的三種處理方式》(http://m.tkk7.com/Unmi/archive/2007/06/07/124179.html)時(shí)看過(guò) Jakarta-commons-email(如 SimpleEmail 類(lèi)) 包和 Spring 的 MailSender(如JavaMailSenderImple) 能夠自動(dòng)幫你完成驗(yàn)證過(guò)程。

    關(guān)于 Jakarta-commons-email 自動(dòng)完成驗(yàn)證發(fā)送郵件我之前也寫(xiě)過(guò)一篇,不過(guò)這里就不提了。列出如果要 Spring 自動(dòng)完成驗(yàn)證時(shí)的 bean 配置如下:

    <bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
    <property name="host" value="${mail.host}"/>
    <property name="username" value="${mail.username}"/>
    <property name="password" value="${mail.password}"/>
    <property name="javaMailProperties">
    <props>
    <prop key="mail.smtp.auth">true</prop>
    <prop key="mail.smtp.timeout">25000</prop>
    </props>
    </property>
    </bean>

    關(guān)鍵是這個(gè) mail.smtp.auth 設(shè)置為 true,然后在代碼中取到 mailSender 實(shí)例就能直接發(fā)送郵件,Spring 自動(dòng)取到配置中的用戶(hù)名和密碼幫你登錄驗(yàn)證,它采用的方法是:

    Transport transport = mailSession.getTransport();
    transport.connect(props.getProperty("mail.smtp.host"), props
    .getProperty("mail.smtp.user"), props
    .getProperty("mail.smtp.password"));

    不好意思,占用了你太多的頁(yè)面資源,僅供參考。  回復(fù)  更多評(píng)論   

    # re: Apusic上用JavaMail發(fā)郵件 2008-09-04 17:17 朱遠(yuǎn)翔-Apusic技術(shù)顧問(wèn)

    @隔葉黃鶯
    非常感謝你的回復(fù),我又去深入了解了一下JavaMail的實(shí)現(xiàn),分析認(rèn)為只要是通過(guò)J2EE標(biāo)準(zhǔn)的應(yīng)用服務(wù)器(Websphere、Weblogic、Apusic)應(yīng)該都按照上文或你寫(xiě)的《三種方式》來(lái)操作才能正確發(fā)送需要SMTP認(rèn)證的郵件,而上文的目的就是想說(shuō)清楚如何發(fā)送的機(jī)制。
    但是,如果在代碼中涉及太多與業(yè)務(wù)無(wú)關(guān)的對(duì)應(yīng)用系統(tǒng)設(shè)計(jì)和開(kāi)發(fā)都不夠友好,因此,如果使用Spring可以利用Spring+JNDI來(lái)操作,如果不用Spring那可以使用Commons-email+JNDI來(lái)簡(jiǎn)化Email操作過(guò)程。
    最后,非常感謝你對(duì)本文的關(guān)注,你的探討也讓我又有新的收獲,希望有機(jī)會(huì)多多交流。

    另:三種方式中第二種我沒(méi)有驗(yàn)證成功,我反編譯過(guò)源代碼,也看過(guò)JavaMail提供的規(guī)范說(shuō)明,個(gè)人覺(jué)得是不行的。如果你能夠成功運(yùn)行,請(qǐng)告訴我,謝謝。
    第一種方法重載了Authenticator()類(lèi),Transport調(diào)用connect()函數(shù)時(shí),會(huì)取得需要的用戶(hù)名/密碼。
    第三種方法直接將用戶(hù)名/密碼傳給Transport,而且傳送使用的是sendMessage()函數(shù),因此也能夠成功。  回復(fù)  更多評(píng)論   

    # re: Apusic上用JavaMail發(fā)郵件 2008-09-08 11:05 隔葉黃鶯

    謝謝你的提醒,原文的第二種方法確實(shí)有些問(wèn)題,現(xiàn)已改正了,其實(shí)就是 URLName 要的參數(shù)形式是:smpt://user@mail.smtp.host

    具體代碼還是詳見(jiàn)那篇日志。

    的確,像 J2EE 標(biāo)準(zhǔn)應(yīng)用服務(wù)器中配置了 MailSession,資源都是需要自己手工進(jìn)行驗(yàn)證,而只有 Spring 簡(jiǎn)化的 Email 操作,不知為何。所以我基本不用應(yīng)用服務(wù)器的 MailSession 資源。

    其實(shí)我覺(jué)得應(yīng)用服務(wù)器可以做得靈活一些,例如通過(guò)設(shè)置不同的屬性來(lái)決定驗(yàn)證方式,因?yàn)橛行┺D(zhuǎn)發(fā)協(xié)議是 smtps,驗(yàn)證方面我認(rèn)為是與具體業(yè)務(wù)無(wú)關(guān)的,應(yīng)該可由應(yīng)用服務(wù)器來(lái)承擔(dān)。  回復(fù)  更多評(píng)論   

    # re: Apusic上用JavaMail發(fā)郵件 2008-09-16 10:11 朱遠(yuǎn)翔-Apusic技術(shù)顧問(wèn)

    @隔葉黃鶯
    從功能上說(shuō),由應(yīng)用服務(wù)器完成驗(yàn)證更加合理,但是這樣的操作會(huì)帶來(lái)移植的問(wèn)題,因?yàn)槿绻_(kāi)發(fā)期采用了應(yīng)用服務(wù)器提供的模式,那么移植到其他應(yīng)用服務(wù)器時(shí)就會(huì)需要個(gè)性代碼。
    其實(shí),這塊的功能直接用Jakarta-commons-email就可以了,或者像Spring、Struts等框架自行提供,因?yàn)閿y帶這些框架就不會(huì)給應(yīng)用移植帶來(lái)麻煩了。  回復(fù)  更多評(píng)論   

    # re: Apusic上用JavaMail發(fā)郵件 2008-09-16 10:46 朱遠(yuǎn)翔-Apusic技術(shù)顧問(wèn)

    2008-09-16
    我對(duì)文章進(jìn)行了修改,受到“隔葉黃鶯”文章的啟發(fā),現(xiàn)在已經(jīng)將Session配置參數(shù)進(jìn)行認(rèn)證的方式加入其中。
    另:Apusic Studio工程沒(méi)有更新,如果自己修改代碼測(cè)試Session配置參數(shù)進(jìn)行認(rèn)證失敗,可以在此繼續(xù)交流。
    對(duì)“隔葉黃鶯”提供的無(wú)私幫助在此表示感謝。  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 亚洲综合亚洲综合网成人| 一级免费黄色大片| 亚洲精品乱码久久久久66| 久久久久久99av无码免费网站| a级黄色毛片免费播放视频| 国产成人亚洲综合无| 亚洲成AV人综合在线观看 | 亚洲老熟女@TubeumTV| 亚洲精品国产日韩无码AV永久免费网 | 少妇太爽了在线观看免费视频 | 国产精品免费视频网站| 久久国产免费福利永久| 无码国产精品一区二区免费模式| 无遮挡a级毛片免费看| 在线观看亚洲AV每日更新无码| 日韩亚洲Av人人夜夜澡人人爽 | 亚洲色大情网站www| 亚洲精品不卡视频| 亚洲av中文无码乱人伦在线咪咕 | 2020国产精品亚洲综合网| 亚洲精品综合一二三区在线| 亚洲午夜福利在线观看| 亚洲精品人成无码中文毛片| 国产在线a不卡免费视频| 午夜免费福利在线观看| 最近最好的中文字幕2019免费| 久久精品国产免费观看| 午夜视频在线免费观看| 91香蕉国产线在线观看免费| 香蕉成人免费看片视频app下载| 中文字幕在线免费看线人| 大地资源在线资源免费观看| a毛片全部播放免费视频完整18| 久久国产乱子伦精品免费午夜| 国产精品高清免费网站| caoporm碰最新免费公开视频| yy一级毛片免费视频| 亚洲一级片免费看| 久久免费观看视频| 免费在线看黄网站| 一区二区三区四区免费视频|