2009-05-26 16 views
0

Ok - これは私の以前の質問sending an email using a php scriptについて続きます。私は今、PEARを使ってメールを送っています。 (単独で実行した場合に成功し)私が使用してPHPスクリプトは、次のいずれかです。PHPEMail.phpデルファイから外部PHPスクリプトを実行

<?php 
require_once "Mail.php"; // Pear Mail.php 

$from = "FromName <[email protected]>"; 
$to = $_POST["destination"]; // destination 
$subject = "Hello You!"; 
$body = $_POST["nicebody"]; // body of text sent 
$host = "ValidServerName"; 
$username = "User";   // validation at server  
$password = "Password";  // validation at server 

$headers = array ('From' => $from, 
    'To' => $to, 
    'Subject' => $subject); 
$smtp = Mail::factory('smtp', 
    array ('host' => $host, 
    'auth' => true, 
    'username' => $username, 
    'password' => $password)); 

$mail = $smtp->send($to, $headers, $body); 

if (PEAR::isError($mail)) { 
    echo("<p>" . $mail->getMessage() . "</p>"); 
} else { 
    echo("<p>Message successfully sent!</p>"); 
} 
?> 

私は今のWinsockを使用して、いくつかの変数を渡し、デルファイからこのスクリプト(PHPEMail.php)を実行する必要があります。私は障害が「TheData」それは、Webサーバーに送信されているかなり確信している

Procedure SendEmail; 
var 
    WSADat:WSAData; 
    SomeText:TextFile; 
    Client:TSocket; 
    Info,TheData,Lina,Nicebody:String; 
    SockAddrIn:SockAddr_In; 
begin 
    try 
    if not FileExists(Log) then exit;  
    AssignFile(SomeText, Log);    // try to open log, assigned to SomeText 
    Reset(SomeText);      // Reopen SomeText for reading 
    while not Eof(SomeText) do 
    begin 
     ReadLn(SomeText, Lina);    //read each line of SomeTextans place it in linha 
     nicebody:=Nicebody+#13#10+Lina;  // nicebody = all line red from SomeText 
    end; 
    CloseFile(SomeText);     // SomeText is closed 
    DeleteFile(PChar(Log));    // log is deleted 
// 
    WSAStartUp(257,WSADat); 
    Client:=Socket(AF_INET,SOCK_STREAM,IPPROTO_IP); 
    SockAddrIn.sin_family:=AF_INET; 
    SockAddrIn.sin_port:=htons(80); 
    SockAddrIn.sin_addr.S_addr:=inet_addr('66.66.66.66'); // server IP 
    if Connect(Client,SockAddrIn,SizeOf(SockAddrIn))=0 then begin 
     Info:='destination='+EmailDestAddressFromIni + '' +'Nicebody='+Nicebody; 
     TheData:='POST PHPEMail.php HTTP/1.0'     +#13#10+ 
      'Connection: close'        +#13#10+ 
      'Content-Type: application/x-www-form-urlencoded'+#13#10+ 
      'Content-Length: '+IntToStr(Length(Info))  +#13#10+ 
      'Host: someEmailHostAddress'       +#13#10+ 
      'Accept: text/html'        +#13#10+#13#10+ 
       Info           +#13#10; 
     Send(Client,Pointer(TheData)^,Length(TheData),0); 
     end; 
    CloseSocket(Client); 
    except 
    exit; 
    end; 
end; 

[... more code not related] 

:今までに成功していない - 私はこのコードで行きますよ。 PHPスクリプトはトリガされません。誰が何がうまくいかないのか考えていますか?

(注:私はwinsockを使用したい、私は第三者のコンポーネントを望んでいない。サーバーである完全なコードは約12koの重量で、一部のハードウェアに埋め込まれる予定)。

最後に最後のコードを表示してください。


私は私のコードでは、いくつかの改良を行っているサーバのログ(プラスいくつかのエラーメッセージ)にPOSTを見ることができなかったので。サーバーのログには、送信されたパケットのトレースが表示されます。つまり、通常のIDと時刻にlettre "P"を加えたものです。おそらく、 'POST'という単語の最初の文字(データが送信されました)。したがって、私は 'Send()'コマンドを調べなければなりません。 (私はDelphi 2009を利用しています)。私はwinsockまたはsendコマンドからエラーを受け取りません。 POST待っ

Procedure SendEmail; 

const 
    a = #13#10; 

var 
    WSAData:TWSAData; 
    Texto:TextFile; 
    ClientSocket :TSocket; 
    Info,Data,Lina,Contenu:String; 
    host:SockAddr_In; 
    i_result:Integer; 

begin 
    try 
    if not FileExists(Log) then exit;  
    AssignFile(Texto, Log);  
    Reset(Texto); // Reopen texto for reading 
    while not Eof(Texto) do 
    begin 
     ReadLn(Texto, Lina); //read each line of texto and place it in lina 
     Contenu:=Contenu+#13#10+Lina; // contenu is all lines of texto 
    end; 
    CloseFile(Texto); // close texto 
    DeleteFile(PChar(Log)); // delete log 


    // Initialize Winsock 
    i_result := WSAStartUp(257,WSAData); 
    if (i_Result <> NO_ERROR) then 
    begin 
    MessageBox(0,'Initialization of winsock failed.','Error',MB_OK Or MB_ICONERROR); 
    Exit; 
    end; 

    // Create a SOCKET for connecting to server 
    ClientSocket := Socket(AF_INET,SOCK_STREAM,IPPROTO_IP); 
    If ClientSocket = INVALID_SOCKET Then 
    begin 
    MessageBox(0,'ServerSocket creation failed.','Error',MB_OK Or MB_ICONERROR); 
    WSACleanUp; 
    Exit; 
    end; 

    // The sockaddr_in structure specifies the address family, 
    // IP address, and port of the server to be connected to. 
    host.sin_family:=AF_INET; 
    host.sin_port:=htons(80); 
    host.sin_addr.S_addr:=inet_addr('77.66.66.66'); 

    // Connect to server. 
    i_result:= Connect(ClientSocket,host,SizeOf(host)); 
    if i_result = SOCKET_ERROR then 
    begin 
    MessageBox(0,'Failed to connect to remote computer.','Error',MB_OK Or MB_ICONERROR); 
    WSACleanUp; 
    Exit; 
    end 
    else 
    begin 

     Info := 'destination=' + UrlEncode(CFG.Email) + '&' + 'contenu=' + UrlEncode(contenu); 
     Data:='POST /pearemail.php HTTP/1.0'     +#13#10+ 
      'Connection: close'        +#13#10+ 
      'Content-Type: application/x-www-form-urlencoded'+#13#10+ 
      'Content-Length: '+IntToStr(Length(Info))  +#13#10+ 
      'Host: mail.tatata.com'       +#13#10+ 
      'Accept: text/html'        +#13#10+#13#10+ 
       Info+#13#10; 

     // Send buffer 
     i_result := Send(ClientSocket,Pointer(Data)^,Length(Data),0); 
     if (i_result = SOCKET_ERROR) then 
     MessageBox(0,'Failed to send to remote computer.','Error',MB_OK Or MB_ICONERROR); 
     closesocket(ClientSocket); 
     WSACleanup; 
     Exit; 

    end; 
     // shutdown the connection since no more data will be sent 
     i_result:= shutdown(ClientSocket, SD_SEND); 
     if (i_Result = SOCKET_ERROR) then 
     MessageBox(0,'Shutdown failed.','Error',MB_OK Or MB_ICONERROR); 
     closesocket(ClientSocket); 
     WSACleanup(); 
     Exit; 

    except 
    exit; 
    end; 
end; 

pearemail.phpスクリプト:

<?php 
require_once "Mail.php"; 

$from = "name <[email protected]>"; 
$to = $_POST["destination"]; 
$subject = "Number 2!"; 
$body = $_POST["contenu"]; 
$host = "mail.server.com"; 
$username = "user"; 
$password = "password"; 

$headers = array ('From' => $from, 
    'To' => $to, 
    'Subject' => $subject); 
$smtp = Mail::factory('smtp', 
    array ('host' => $host, 
    'auth' => true, 
    'username' => $username, 
    'password' => $password)); 

$mail = $smtp->send($to, $headers, $body); 

if (PEAR::isError($mail)) { 
    echo("<p>" . $mail->getMessage() . "</p>"); 
} else { 
    echo("<p>Message successfully sent!</p>"); 
} 
?> 
+0

は、PHPコードは、スパマーに悪用されようとしているcarefaulして作られました – julioc

答えて

2

最初のHTTPラインの第二のトークンは、絶対URLパスする必要があります。スラッシュで始める必要があります。

 
POST /PHPEMail.php HTTP/1.0 

また、実際に送信するデータがURLでエンコードされていることをコンテンツタイプに示すようにしてください。文字10と13はURL内の有効な文字ではありません。また、あなたが読んでいるテキストファイル内のすべての文字を考慮する必要があります。

Info := 'destination=' + UrlEncode(EmailDestAddressFromIni) + 
    '&' + 'Nicebody=' + UrlEncode(Nicebody); 

私は、サーバーからの応答を読んでいないことに注意してください。それを無視しないでください。時には何が間違っているかを伝えることがあります。私はまたあなたのコードを実行しようとしたときにサーバログが何を言ったのかについて言及していません。

途中でこのように間違いを犯すことになります。 IndyICS、またはSynapseなど、この種のものを扱うライブラリを使用することを検討してください。本当にしなければHTTPを再実装しないでください。また、サードパーティのコードが本当に必要ない場合は、Windowsに組み込まれているものを使用して、サードパーティのコード(またはファーストパーティのコード)を検討してください。 KB 165298には、InternetConnect,HttpOpenRequestおよびHttpSendRequestを使用してURLエンコードされたフォームリクエストを送信する短い例があります。

+0

ありがとうございます。サーバーのエラーログに何も表示されません - 接続が表示されません!chr 10と13をいくつかの
で置き換える必要がありますか?Indy、ICS、Synapseを試しました。 - それは私にとって大きな罪でもありますサーバー全体がリソース内に置かれます。実際のコードは約12〜20koです。私はKB 165298を見ます。 – volvox

+0

しかし、私はそれが接続していることを知っています。 "接続する"の後のある時点でShowMessageを追加すると、送信されたデータ、つまり宛先の電子メールとNiceBody(データ)を読み取ることができます。 TheDataは一見するときれいに整形されたように見えます。 – volvox

+0

私はTheDataのリターンとフィードラインは大丈夫だと思いますが、私は例を見つける必要があります。 NiceBody自体(メッセージ送信)は実際にhtmlエンコードされています。 – volvox

2

あなたのDelphiコードからわかるように、電子メールのすべての情報は1つの変数にパックされていますが、PHPスクリプトではどのように多くのPHP変数を渡しますか?あなたは解凍/ PHPスクリプト内の各変数(ターゲットアドレス、件名、メール本文など)を渡すためにそれを解析する必要があります。(現在のPHPスクリプトには多くの$ _postsがありますが、実際の投稿はDelphiコードから1つしか受け取りません)

以下は私の作業コードです。

result := 'POST /index.php HTTP/1.1' + 
a + 'Host: somehost.com' + 
a + 'User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.14) Gecko/20080406 K-Meleon/1.1.5' + 
a + 'Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5' + 
a + 'Accept-Language: en-us,en;q=0.5' + 
a + 'Accept-Encoding: gzip,deflate' + 
a + 'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7' + 
a + 'Keep-Alive: 300' + 
a + 'Connection: keep-alive' + 
a + 'Referer: http://somehost.com/index.php' + 
a + 'Content-Type: application/x-www-form-urlencoded' + 
a + 'Content-Length: 73' + a + 
a + 'link=' + MyHttpEnCodedStrData + a + a; 

が#13#10である。

もう一つ重要なことは、私が送信しているデータを受け取ったり保持したりするPHPスクリプト内の変数名です.1つしか変数を送信しないので、電子メールスクリプトではありませんPHPの構文解析が必要なので、私はここに私のPHPコードを貼り付けていなかった。

ホープ私はあなたがオンラインの方法、それをそれを置くならば、明らか:)

+0

彼は2つのクエリ文字列のパラメータ、destinationとnicebodyをInfoに設定しました。彼はアンパサンドを分けなければならなかった。 PHPはURLエンコードされたポストデータを解析する方法を知っているので、パラメータを$ _POST ['destination']と$ _POST ['nicebody']に分割します。 –

+0

Infoの私の最初のattempは本当にでした: Info:= 'Destination =' + Email + '&NiceBody =' + NiceBody; 私はasarを試しました(avarの提案): TheData:= 'POST /phpemail.php HTTP/1。(Content-Type:application/x-www-form-urlencoded)+ a + 'Content-Length:' + IntToStr(Length(Email)+ Length(NiceBody)) + a + 'ホスト:サーバーホスト名' + a + '受け入れる:text/html' + a + '宛先=' +メールアドレス+ a + 'NiceBody =' + NiceBody + a + a; 送信(クライアント、ポインタ(TheData)^、長さ(TheData)、0)。 この場合も、データは送信されますが(TCPサーバのホスト名についてはスニファで読み込まれます)、それでもphpスクリプトとのやり取りはありません。 – volvox

+0

私のデルファイコードでPHPコードを試してみましょう。後で – avar

関連する問題