使用Delphi,我想使用winsock 向我的Web 服务器发送一条文本消息,然后使用服务器上的电子邮件php 函数来发布该消息。
首先,我完成了发送过程(Procedure SendEmail):它读取文本文件(日志)并将其发布到我的服务器。在服务器上,消息由名为 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 邮件功能的指南:https://www.php.net/manual/en/book.mail.php https://www.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,
但对于标准电子邮件,POP 之前
SMTP 是服务器的设置方式。