Smtp olmadan Delphi e-posta gönderme ve sunucuda php fonksiyonunu kullanarak

6 Cevap php

Delphi kullanarak, ben winsock kullanarak benim web sunucusuna bir kısa mesaj göndermek ve ardından mesajı göndermek için sunucu üzerinde bir e-posta php işlevi kullanmak istiyorum.

Öncelikle ben gönderme prosedürü (Prosedür SendEmail) yaptım: Bir metin dosyasını okur (log) ve benim sunucuya POST. Sunucuda, mesaj (aşağıda bu işlevin içeriğini görmek) email.php adında aa email php işlevi tarafından alınan:

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.

Sunucuda email.php işlevinin açıklaması:

<?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 =/";
}
?>

(Not: ben php mail fonksiyonu için bu kılavuzu takip adres: http://us3.php.net/manual/en/book.mail.php)

Burada genel bir fikir smtp kullanarak değil sunucuya mesaj göndermektir. Posta benim sunucuda bırakılır gibi Ancak kadarıyla ben gördüğünüz gibi, görünüyor. Ben güzel prosedürün güvenen, ancak php mail fonksiyonu hakkında emin değilim. Şey ayıklamak kolay değildir. Ne yanlış HERHANGİ fikir oluyor? OR diğer herhangi benzer bir çözüm görünüyor?

Herhangi bir yardım takdir edilecektir. Teşekkürler.

[EDIT] I have also ask support at my server site concerning use of smtp. Looks like i cannot send any mail (using smtp) if no check is done first:

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

check the mail before you can send any. You also do not set smtp authentication in your e-mail client settings. Once you have checked the mail with POP authentication is not needed.

We use POP before SMTP authentication as it is a fairly

secure way to prevent spammers and open relays. Unfortunately, this is the configuration that we have chosen. For users who wish to send out mailing lists, we have the Mailman ValueApp, but for standard emailing, POP before SMTP is how the server is setup.

6 Cevap

Aşağıdaki satırı yanlıştır:

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

Bu olmalı

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

posta sunucusu kırık ve "\ n" gerektirir olabilir rağmen.

Ayrıca dan $, sadece e-posta adresi ve "Kimden:" içermemelidir.

Bir Konu başlığı ayarlamak için gerek yok - PHP sizin için yapacak.

Eğer var - POST değeri isimlerin durumda eşleşen emin olmak gerekir

$to =$_POST["sender"];

ve

Info:='Sender='+CFG.Email

Eğer ISP POP-before-SMTP ile kimlik doğrulaması gerektiren kaydetti olduğundan, PHP Mailer etkileşimi bu tür kolaylaştırmak hangi gibi bir şey kullanarak içine bakmak gerekir - veya {[(1 için PHP fonksiyonları kullanarak kendi rulo )]} (ki) IMAP ve NNTP için olanları tam olarak aynı olmak olur.

PHP tarafta bağlantı POP sunucusuna ihtiyacı işlemek için (), fputs (), fgets () ve fclose () fsockopen kullanabilirsiniz. Fsockopen () için PHP yardım size ihtiyacınız ayrıntıları vermelidir.

Yan not: Belki de bir sorun değil ama size (başkalarının adına e-posta göndermek için email.php bitiş noktası kullanmanıza izin) bir açık geçiş bir melez oluşturduk değil emin olmak isteyeceksiniz.

To test your PHP code

Why don't you try writing to a file? I would write to a file on the server with the date/time and the logfile contents, then access it from http://myserver.com/log.txt

As for the Delphi part:

Eğer Indy (TIDHTTP) gibi kütüphaneleri kullanmayın Neden ben, doğrudan yuva kullanmak olmaz.

Bunu kullanarak çok daha basit olurdu.

POST IdHttp1.Post gibi bir şey (...) olacak

Tamam teşekkürler ... Ben düzeltmeleri uyguladık. Şimdi ben tam olarak var:

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...]

Sunucuda email.php olduğunu:

<?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 =/";
}
?>

Hala posta alıyorum. Prosedüründe ShowMessage bilgi değişkeni için bana böyle bir şey gösteriyor:

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

Bu yanlış olabilir - (?) En azından bir boşluk veya satır besleme adresi ve içerik arasındaki eksik. Tam olarak nasıl bu 'bilgi' değişkeni format olmalıdır?

Teşekkürler.