線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:8231
推到 Plurk!
推到 Facebook!

IdSMTP 與 IdConnectionIntercept 合作的問題

尚未結案
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-11-09 17:16:06 IP:140.117.xxx.xxx 未訂閱
我在單獨使用IdSmtp元件時,執行 IdSMTP.Connect後很快就可以連上伺服器,可是當我放上IdConnectionIntercept元件,將IdSmtp.Intercept 指向IdConnectionIntercept後,再執行IdSMTP.Connect時卻會出現"Connection Closed Gracefully"的錯誤訊息,IdConnectionIntercept元件一拿掉就又正常了。我參考了以下的連結: http://www.swissdelphicenter.ch/en/showarticle.php?id=1 及indy in Depth電子書仍然找不出會有這種情形的原因,上面的連結有說到在client端出現這個錯誤就是一個Error,但是卻沒有說為甚麼會在Client端出現這個錯誤,這個情況看起來不是server端強破關閉連線,因為我單獨用Idsmtp就可以正常連線。 我的indy 版本是v9.0.14,有人知道如何解決這個問題嗎?
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#2 引用回覆 回覆 發表時間:2004-11-09 19:17:51 IP:210.58.xxx.xxx 未訂閱
會這樣嗎? 我剛剛有試過,應該是沒問題的... 你的IdConnectionIntercept裡頭事件有寫程式碼嗎?
mine
中階會員


發表:28
回覆:129
積分:56
註冊:2004-03-31

發送簡訊給我
#3 引用回覆 回覆 發表時間:2004-11-09 19:34:59 IP:61.221.xxx.xxx 未訂閱
我測也沒錯 能post錯誤部分的程式上來可能比較知道原因吧 delphi7.0 indy 9.00.10 win2000 pro 搞不懂!搞不懂!永遠都搞不懂!!
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#4 引用回覆 回覆 發表時間:2004-11-09 20:50:48 IP:219.80.xxx.xxx 未訂閱
很奇怪,回到家單獨寫一個只有SMTP功能的專案,放上IdConnectionIntercept元件,沒有寫任何事件。也沒問題,可以正常連線。    而我的專案中在IdConnectionIntercept中的send事件我寫了artist1002 教我的一個處理IdMessage.Body 使用 quoted-printable編碼的事件,程式碼如下:    
procedure TEMailForm.IdConnectionIntercept1Send(
  ASender: TIdConnectionIntercept; AStream: TStream);
var temp : TStringList;
    i : integer;
    tmpstr, zeroLength : pchar;
begin
  temp := TStringList.Create;
  temp.LoadFromStream(AStream); //將寄送內容讀到StringList中
  if temp.Count > 0 then
  begin
    for i:= 0 to temp.Count - 1 do
    begin
      if (temp.Strings[i]= 'Content-Transfer-Encoding: XQPENCODE') then //判斷傳送內容
      begin
        temp.Strings[i] := 'Content-Transfer-Encoding: quoted-printable';
      end;
    end;
      AStream.Position := 0;
      AStream.Size := 0;
      if (temp.Count > 0) then //寫回AStream
      begin
        tmpstr := PAnsiChar(temp.Text);
        AStream.Write( tmpstr , Length(temp.Text) )
      end
      else
      begin
        zeroLength := #0;
        AStream.Write(zeroLength,1);
      end;
  end;
  temp.Free;
end;
以上程式碼是改自artist1002寫的C Builder版,不曉得改的對不對。 我有追蹤過,問題是發生在IdSmtp.connect時,不是發生在IdSmtp.send。 我的專案中有用到remobjects sdk 3.0,而remobjects中的通訊元件是以indy 的通訊元件為基礎的,如果remobjects sdk 3.0的元件中已經封裝了IdConnectionIntercept元件,一個專案中可以放兩個以上的IdConnectionIntercept元件嗎? 真的是很奇怪,單獨一個SMTP專案可以正常使用IdConnectionIntercept,但是在配有DataModual(其中有remobjects的通訊元件)的專案就無法使用IdConnectionIntercept。 我曾經把專案中的EMAIL模組分離出來,也可以正常使用IdConnectionIntercept。這真是傷腦筋了,問題不曉得出在那裡?
artist1002
高階會員


發表:2
回覆:155
積分:151
註冊:2002-09-26

發送簡訊給我
#5 引用回覆 回覆 發表時間:2004-11-10 05:54:42 IP:210.58.xxx.xxx 未訂閱
引言: 很奇怪,回到家單獨寫一個只有SMTP功能的專案,放上IdConnectionIntercept元件,沒有寫任何事件。也沒問題,可以正常連線。 而我的專案中在IdConnectionIntercept中的send事件我寫了artist1002 教我的一個處理IdMessage.Body 使用 quoted-printable編碼的事件,程式碼如下:
procedure TEMailForm.IdConnectionIntercept1Send(
  ASender: TIdConnectionIntercept; AStream: TStream);
var temp : TStringList;
    i : integer;
    tmpstr, zeroLength : pchar;
begin
  temp := TStringList.Create;
  temp.LoadFromStream(AStream); //將寄送內容讀到StringList中
  if temp.Count > 0 then
  begin
    for i:= 0 to temp.Count - 1 do
    begin
      if (temp.Strings[i]= 'Content-Transfer-Encoding: XQPENCODE') then //判斷傳送內容
      begin
        temp.Strings[i] := 'Content-Transfer-Encoding: quoted-printable';
      end;
    end;
      AStream.Position := 0;
      AStream.Size := 0;
      if (temp.Count > 0) then //寫回AStream
      begin
        tmpstr := PAnsiChar(temp.Text);
        AStream.Write( tmpstr , Length(temp.Text) )
      end
      else
      begin
        zeroLength := #0;
        AStream.Write(zeroLength,1);
      end;
  end;
  temp.Free;
end;
以上程式碼是改自artist1002寫的C Builder版,不曉得改的對不對。 我有追蹤過,問題是發生在IdSmtp.connect時,不是發生在IdSmtp.send。 我的專案中有用到remobjects sdk 3.0,而remobjects中的通訊元件是以indy 的通訊元件為基礎的,如果remobjects sdk 3.0的元件中已經封裝了IdConnectionIntercept元件,一個專案中可以放兩個以上的IdConnectionIntercept元件嗎? 真的是很奇怪,單獨一個SMTP專案可以正常使用IdConnectionIntercept,但是在配有DataModual(其中有remobjects的通訊元件)的專案就無法使用IdConnectionIntercept。 我曾經把專案中的EMAIL模組分離出來,也可以正常使用IdConnectionIntercept。這真是傷腦筋了,問題不曉得出在那裡?
原來是要解決這個問題喔~ 我也不清楚為什麼你在Connect的時候會出現Connection Closed Gracefully的問題 可能是有通訊被擋住沒送出去導致TimeOut吧~ 至於你原本要解決CSS的問題,我有新的發現,已經不用IdConnectionIntercept來修正編碼問題。 回在原來的文章中http://delphi.ktop.com.tw/topic.php?TOPIC_ID=59329
Gorden Peng
一般會員


發表:11
回覆:11
積分:4
註冊:2002-03-18

發送簡訊給我
#6 引用回覆 回覆 發表時間:2004-11-10 22:06:55 IP:219.81.xxx.xxx 未訂閱
測試了一天,知道問題在那裡了:    1.我原先依照artist1002 的 BC++Builder 版修改的IdConnectionIntercept1Send之Delphi版出了問題,我原先的程式碼如下:
procedure TEMailForm.IdConnectionIntercept1Send(
  ASender: TIdConnectionIntercept; AStream: TStream);
var temp : TStringList;
    i : integer;
    tmpstr, zeroLength : pchar;
begin
  temp := TStringList.Create;
  temp.LoadFromStream(AStream); //將寄送內容讀到StringList中
  if temp.Count > 0 then
  begin
    for i:= 0 to temp.Count - 1 do
    begin
      if (temp.Strings[i]= 'Content-Transfer-Encoding: XQPENCODE') then //判斷傳送內容
      begin
        temp.Strings[i] := 'Content-Transfer-Encoding: quoted-printable';
      end;
    end;
      AStream.Position := 0;
      AStream.Size := 0;
      if (temp.Count > 0) then //寫回AStream
      begin
        tmpstr := PAnsiChar(temp.Text);
        AStream.Write( tmpstr , Length(temp.Text) )
      end
      else
      begin
        zeroLength := #0;
        AStream.Write(zeroLength,1);
      end;
  end;
  temp.Free;
end;
以上的程式碼會讓程式在執行IdSMTP.Connect時當掉,而出現"Connection Closed Gracefully"的錯誤訊息,正確的寫法如下:
procedure TForm1.IdConnectionIntercept1Send(
  ASender: TIdConnectionIntercept; AStream: TStream);
var temp : TStringList;
    tmpstr : pchar;
begin
  temp := TStringList.Create;
  temp.LoadFromStream(AStream); //將寄送內容讀到StringList中
  if trim(temp.Text) = 'Content-Transfer-Encoding: XQPENCODE' then
  begin
    tmpstr := 'Content-Transfer-Encoding: quoted-printable';
    AStream.Position := 0;
    AStream.Size := 0;
    AStream.Write( 'Content-Transfer-Encoding: quoted-printable' , Length(tmpstr));
  end;
  temp.Free;
end;
因為AStream 從IdMessage.body.text所接收的資料不是一次全部傳送過來,而是一次只傳送一行,因此只要判斷每次傳進來的資料是否等於'Content-Transfer-Encoding: XQPENCODE'?如果是則將其替換成'Content-Transfer-Encoding: quoted-printable'即可。其他的資訊完全不需加以理會。底下是我記錄AStream接收到資料的次數及其內容,列出供大家參考。
0 : EHLO mail.nsysu.edu.tw
1 : RSET
2 : MAIL FROM:
3 : RCPT TO:
4 : DATA
5 : From: janetchao@anet.net.tw
6 : Subject: =?Big5?B?SFRNTF9DU1Ou5qahq0il87T6uNU=?=
7 : To: peng@mail.nsysu.edu.tw
8 : Content-Type: multipart/alternative;
9 :  boundary="=_NextPart_2rfkindysadvnqw3nerasdf";
10 :         charset="big5"
11 : MIME-Version: 1.0
12 : Date: Wed, 10 Nov 2004 21:28:26  0800
13 : 
14 : This is a multi-part message in MIME format
15 : 
16 : --=_NextPart_2rfkindysadvnqw3nerasdf
17 : Content-Type: text/plain
18 : Content-Transfer-Encoding: quoted-printable
19 : 
20 : 
21 : --=_NextPart_2rfkindysadvnqw3nerasdf
22 : Content-Type: text/html;
        charset="big5"
23 : Content-Transfer-Encoding: XQPENCODE
24 : 
25 : <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
26 : <HTML><=
27 : HEAD><TITLE>=AD=AB=ADn=A4=BD=A4=E5=B3q=AA=BE=A1i=A4=BD=A4=E5=B8=B9=A1G=A4=
28 : =A4(92)=B9q=A6r=B2=C4007=B8=B9=A1j</TITLE>
29 : <META HTTP-EQUIV=3D"Content-=
30 : Type"  CONTENT=3D"text/html; CHARSET=3Dbig5">
31 : <STYLE type=3D"text/css">=
.
.
.
.
1051 : 

</BODY></HTML>    1053 :     1054 : --=_NextPart_2rfkindysadvnqw3nerasdf--    1055 : .    1056 : QUIT
我們要替換的是第 23 次傳進來的字串。 要再一次的謝謝artist1002的幫忙。
Ktop_Robot
站務副站長


發表:0
回覆:3511
積分:0
註冊:2007-04-17

發送簡訊給我
#7 引用回覆 回覆 發表時間:2007-04-26 13:51:24 IP:000.000.xxx.xxx 未訂閱
提問者您好:


以上回應是否已得到滿意的答覆?


若已得到滿意的答覆,請在一週內結案,否則請在一週內回覆還有什麼未盡事宜,不然,
將由版主(尚無版主之區域將由副站長或站長)自由心證,選擇較合適之解答予以結案處理,
被選上之答題者同樣會有加分獎勵同時發問者將受到扣 1 分的處分。不便之處,請見諒。


有問有答有結案,才能有良性的互動,良好的討論環境需要大家共同維護,感謝您的配合。

------
我是機器人,我不接受簡訊.
系統時間:2024-05-03 12:26:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!