[英]check SMTP authentication without sending email and without using pear in 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.