2015-06-01 57 views
1

我花了一些時間,試圖理解爲什麼這根本不起作用,沒有成功;(發送私人消息,亞歷克 - 德爾福

我想用我的Delphi應用程序發送私人郵件

。 。

我可以登錄,讀取和刪除的郵件,但我不能設法發送郵件(我的論壇使用。中文)

分析後的數據,我得到這個:

Post URL: http://example.com/ucp.php?i=pm&mode=compose&action=post&sid=xxxxx 

Post Data: 
username_list= 
icon=0 
subject=assunto 
message=texto 
address_list[u][2]=to 
lastclick=xxxx 
status_switch=0 
post=Submit 
attach_sig=on 
creation_time=xxxx 
form_token=xxx 

的我需要在發送之前獲得xxx值。我手動檢查了這些值,它們是正確的。

我的代碼:

procedure Envia(); 
var 
    form_token, cr_time, sid: string; 
    pp: TStringList; 
begin 
    //download the page to get the values (token, sid...) 
    FPageSource.Text := FCon.Get('http://example.com/ucp.php?i=pm&mode=compose&u=2'); 

    //form token 
    form_token := TRegEx.Match(FPageSource.Text, 'form_token" value="(\w+)"').Groups[1].Value; 

    //creation time 
    cr_time := TRegEx.Match(FPageSource.Text, 'creation_time" value="(\w+)"').Groups[1].Value; 

    //sid 
    sid := TRegEx.Match(FPageSource.Text, 'sid=(\w+)').Groups[1].Value; 

    //data 
    pp := TStringList.Create; 
    pp.Add('username_list='); 
    pp.Add('icon=0'); 
    pp.Add('subject=assunto'); 
    pp.Add('message=mensagem'); 
    pp.Add(HttpEncode('address_list[u][2]') + '=to'); 
    pp.Add('lastclick=' + cr_time); 
    pp.Add('status_switch=0'); 
    pp.Add('post=Submit'); 
    pp.Add('attach_sid=on'); 
    pp.Add('creation_time=' + cr_time); 
    pp.Add('form_token=' + form_token); 

    //send 
    FPageSource.Text := FCon.Post('http://example.com/ucp.php?i=pm&mode=compose&action=post&sid=' + sid, pp); 

    //The result in FPageSource is my inbox, my post data was 
    //ignored by phpbb ;(

end; 

注:

  • FCON = TIdHttp
  • FPageSource =的TStringList
  • HttpEncode =在HttpApp單元功能
  • 用Delphi XE6

- 我用Opera發送了一條消息,並使用Fiddler,here the image捕獲了發佈數據。正如你所看到的,數據結構是一樣的,爲什麼不工作?

+0

您捕獲從歌劇的請求;你的程序的等價捕獲在哪裏?他們匹配嗎?換句話說,你怎麼知道你真的在發送你認爲你發送的東西? –

+0

@RobKennedy發佈的數據是一樣的,但返回代碼是302,如果仔細觀察,您會看到身體大小爲0.檢查新圖像:[New Image](http://i.imgur .com/HngHvEj.png) - 編輯:HandleRedirects = true,結果相同>< –

+0

頭文件怎麼樣?發送和接收。他們也一樣嗎? –

回答

0

主要問題將很簡單 - 等待時間(垃圾郵件保護)。另外,您應該首先添加用戶 - 另外一個請求。

此代碼應該工作正常

s:=FCon.Get('http://.../ucp.php?i=pm&mode=compose'); 

    pp.Add('username_list=UserToADd'); 
    pp.Add('add_to=Add'); 
    pp.Add('icon=0'); 
    pp.Add('subject='); 
    pp.Add('addbbcode20=100'); 
    pp.Add('message='); 
    pp.Add('lastclick='+...); 
    pp.Add('status_switch=0'); 
    pp.Add('creation_time='+...); 
    pp.Add('form_token='+...); 

    s:=FCon.Post('http://.../ucp.php?i=pm&mode=compose&action=post&sid=...', pp); 

    Sleep(2000); // <-- wait here 

    pp.Clear; 
    pp.Add('username_list='); 
    pp.Add('icon=0'); 
    pp.Add('subject=XX'); 
    pp.Add('addbbcode20=100'); 
    pp.Add('message=YY'); 
    pp.Add('address_list[u][2]=to'); 
    pp.Add('lastclick='+...); 
    pp.Add('status_switch=0'); 
    pp.Add('post=Submit'); 
    pp.Add('attach_sid=on'); 
    pp.Add('creation_time='+...); 
    pp.Add('form_token='+...); // new one 

    s:=FCon.Post('http://.../ucp.php?i=pm&mode=compose&action=post&sid=...', pp); 
+0

OMG,工作就像一個魅力!但是我已經把睡眠移到了FCon.Post之上。謝謝。 –

+0

只是請不要垃圾論壇現在:) – smooty86