Отправка электронной почты в Delphi без smtp и использование функции php на сервере - PullRequest
3 голосов
/ 17 мая 2009

Используя Delphi, я хочу отправить текстовое сообщение на мой веб-сервер с помощью winsock, а затем использовать функцию php электронной почты на сервере, чтобы опубликовать сообщение.

Сначала я выполнил процедуру отправки (процедура SendEmail): он читает текстовый файл (журнал) и отправляет его на мой сервер. На сервере сообщение принимается функцией php электронной почты с именем email.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 mail: http://us3.php.net/manual/en/book.mail.php)

Основная идея здесь - отправить сообщение на сервер, не используя smtp. Однако, насколько я вижу, похоже, что почта сбрасывается на мой сервер. Я довольно уверен в процедуре, но не уверен насчет функции php mail. Вещи не легко отладить. ЛЮБАЯ идея, что идет не так? ИЛИ любое другое похожее решение?

Любая помощь будет оценена. Спасибо.

[EDIT] Я также прошу поддержки на моем сайте сервера по поводу использования 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, но для стандартной рассылки, POP перед SMTP - это способ настройки сервера.

Ответы [ 6 ]

1 голос
/ 22 мая 2009

Для проверки вашего кода PHP

Почему бы вам не попробовать записать файл? Я хотел бы написать в файл на сервере с датой / временем и содержимым файла журнала, а затем получить доступ к нему с http://myserver.com/log.txt

Что касается части Delphi:

Я бы не использовал сокеты напрямую, почему бы вам не использовать такие библиотеки, как Indy (TIDHTTP).

Использовать его было бы намного проще.

POST будет что-то вроде IdHttp1.Post (...)

1 голос
/ 19 мая 2009

На стороне PHP вы можете использовать fsockopen (), fputs (), fgets () и fclose () для обработки потребностей вашего соединения с POP-сервером. Справка PHP для fsockopen () должна дать вам необходимую информацию.

Примечание: возможно, это не проблема, но вам нужно убедиться, что вы не создали гибрид открытого ретранслятора (позволяя другим использовать вашу конечную точку email.php для отправки электронной почты от вашего имени).

1 голос
/ 19 мая 2009

Поскольку вы отметили, что провайдеру требуется аутентификация через POP-before-SMTP, вам следует использовать что-то вроде PHP Mailer , которое может упростить такого рода взаимодействие, или выполнить свою собственную, используя функции PHP для POP (которые в точности совпадают с аналогичными для IMAP и NNTP).

1 голос
/ 17 мая 2009

Вы должны убедиться, что регистр имен значений POST совпадает - у вас есть

$to =$_POST["sender"];

и

Info:='Sender='+CFG.Email
1 голос
/ 17 мая 2009

Следующая строка неверна:

$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 сделает это за вас.

0 голосов
/ 18 мая 2009

ОК, спасибо ... Я применил исправления. Теперь у меня точно:

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'?

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...