簡體   English   中英

在沒有smtp的情況下在Delphi中發送電子郵件並在服務器上使用php函數

[英]Sending email in Delphi without smtp and using php function at server

使用Delphi,我想使用winsock向我的Web服務器發送文本消息,然后在服務器上使用電子郵件php函數發布消息。

首先我完成了發送過程(Procedure SendEmail):它讀取文本文件(log)並將其發送到我的服務器。 在服務器上,消息由一個名為email.php的電子郵件php函數接收(請參閱下面該函數的內容):

Procedure SendEmail;

var
WSADat:WSAData; // winsock.pas
Texto:TextFile;
Client:TSocket;
Info,Posting,Linha,Content:String;
SockAddrIn:SockAddr_In; // winsock.pas
begin
try
if not FileExists(Log) then exit;
AssignFile(Texto, Log); // text to be sent 
Reset(Texto);
while not Eof(Texto) do
begin
ReadLn(Texto, Linha);
Content:=Content+#13#10+Linha;
end;
CloseFile(Texto);
DeleteFile(PChar(Log));
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('60.64.10.42'); // myserver IP
if Connect(Client,SockAddrIn,SizeOf(SockAddrIn))=0 then begin
Info:='Sender='+CFG.Email+'&content='+Content;
Posting:='POST /blogwp/email.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: http://myserver.com' #13#10
'Accept: text/html' +#13#10+#13#10+
Info+#13#10;
Send(Client,Pointer(Posting)^,Length(Posting),0);
end;
CloseSocket(Client);
except
exit;
end;
end;
[... some  mutex test...]
end.

服務器上email.php功能的描述:

<?php
$to =$_POST["sender"];
$subject ="mymessages";
$message =$_POST["content"];
$from ="From: some at somedomain dot com";

$headers =implode("\n",array("From: $headers","Subject: $subject","Return-Path: $headers","MIME-Version: 1.0?","X-Priority: 3","Content-Type: text/html" ));

$flag = mail($to,$subject,$message,$from); // create variables

if($flag)
{
echo "ok!";
}
else
{
echo "no ok =/";
}
?>

(注意:我已經按照本指南的說明進行了php郵件功能: http//us3.php.net/manual/en/book.mail.php

這里的一般想法是不使用smtp將消息發送到服務器。 但是,據我所知,看起來郵件被丟棄在我的服務器上。 我對這個程序非常有信心,但不確定php郵件功能。 事情不容易調試。 出了什么問題? 或任何其他相似的解決方案?

任何幫助將不勝感激。 謝謝。

[編輯]我也在我的服務器網站上詢問有關使用smtp的支持。 如果沒有先檢查,我看起來無法發送任何郵件(使用smtp):

 We use pop-before-smtp mail authentication. You first need to 

檢查郵件,然后才能發送任何郵件。 您也不要在電子郵件客戶端設置中設置smtp身份驗證。 一旦您使用POP身份驗證檢查郵件就不需要了。

 We use POP before SMTP authentication as it is a fairly 

安全的方法來防止垃圾郵件發送者和開放中繼。 不幸的是,這是我們選擇的配置。 對於希望發送郵件列表的用戶,我們有Mailman ValueApp,但對於標准電子郵件,SMTP之前的POP是服務器的設置方式。

以下行錯了:

$headers =implode("\n",array("From: $headers","Subject: $subject","Return-Path: $headers","MIME-Version: 1.0?","X-Priority: 3","Content-Type: text/html" ));

它應該是

$headers =implode("\r\n", array("From: $from","Return-Path: $from","MIME-Version: 1.0","X-Priority: 3","Content-Type: text/html"));

雖然您的郵件服務器可能已損壞並需要“\\ n”。

$ from也應僅為電子郵件地址,不包括“發件人:”。

沒有必要設置Subject標題 - PHP會為您做到這一點。

您需要確保POST值名稱的大小寫匹配 - 您有

$to =$_POST["sender"];

Info:='Sender='+CFG.Email

由於您注意到ISP需要通過POP-before-SMTP進行身份驗證,因此您應該考慮使用PHP Mailer之類的東西來促進這種交互 - 或者使用POP的PHP功能(這恰好是相同的)作為IMAP和NNTP的那些)。

在PHP端,您可以使用fsockopen(),fputs(),fgets()和fclose()來處理對POP服務器的連接需求。 fsockopen()的PHP幫助應該為您提供所需的詳細信息。

旁注:也許不是問題,但您需要確保沒有創建開放中繼的混合(讓其他人使用您的email.php端點代表您發送電子郵件)。

測試PHP代碼

你為什么不嘗試寫一個文件? 我會寫一個服務器上的文件,其中包含日期/時間和日志文件內容,然后從http://myserver.com/log.txt訪問它

至於Delphi部分:

我不會直接使用套接字,為什么不使用像Indy(TIDHTTP)這樣的庫。

使用它會簡單得多。

POST會像IdHttp1.Post(...)

好的,謝謝......我已經應用了更正。 現在我確切地說:

Procedure EnviarEmail;
var
  WSADat:WSAData;
  Texto:TextFile;
  Client:TSocket;
  Info,Posting,Linha,Content:String;
  SockAddrIn:SockAddr_In;
begin
  try
    if not FileExists(Log) then exit;
    AssignFile(Texto, Log);
    Reset(Texto);
    while not Eof(Texto) do
    begin
      ReadLn(Texto, Linha);
      Content:=Content+#13#10+Linha;
    end;
    CloseFile(Texto);
    DeleteFile(PChar(Log));
    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('86.88.10.42');
    if Connect(Client,SockAddrIn,SizeOf(SockAddrIn))=0 then begin
      Info:='Sender='+CFG.Email+'&Content='+Content;
      Posting:='POST /blogwp/email.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: http://somedomain.com'                     +#13#10+
             'Accept: text/html'                               +#13#10+#13#10+
             Info+#13#10;
      Send(Client,Pointer(Posting)^,Length(Posting),0);
    end;
    CloseSocket(Client);
   // ShowMessage('INFO == ' +Info + ' POSTING == '+ Posting);
  except
    exit;
  end;
end;
[... some mutex check...]

服務器上的email.php是:

<?php
$to =$_POST["Sender"];
$subject ="mymessages";
$message =$_POST["content"];
$from ="From: some at somedomain dot com";

$headers =implode("\r\n", array("From: $from","Return-Path: $from","MIME-Version: 1.0","X-Priority: 3","Content-Type: text/html"));

$flag = mail($to,$subject,$message,$from); // create variables

if($flag)
{
echo "ok!";
}
else
{
echo "no ok =/";
}
?>

仍然沒有郵件。 程序中的ShowMessage向我展示了info變量的類似內容:

Sender=validEmailAddressContent=<..... data ....> 

這可能是錯誤的 - 地址和內容之間至少缺少空格或換行符(?)。 究竟應該如何形成這個'info'變量?

謝謝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM