如何解决有可能直接在php中的tcp / ip端点接收电子邮件?
我正在研究imap和smtp,发现了有趣的东西...
使用终结点/套接字基于SSL或TLS的TCP / IP来接收和发送消息,有趣的是php能够创建套接字并通过它接收和发送数据,我可以修改域的dns并指向终结点。 IMAP的主要命令是LOGIN和SELECT,当然还有其他命令,但是这些命令更有趣,本教程说明了IMAP服务器的工作方式:
https://www.toptal.com/php/building-an-imap-email-client-with-php
基于此,可以模仿服务器并轻松替换它,数据库和某些身份验证技术必不可少,在标头中找到“登录”并不困难,还可以在文本中搜索单词,因此不再需要命令行终端,我只需要知道客户的工作,验证以及谁知道交付方式即可。
可能有与我相反的论点,关于如何使用Devecot或不重新发明轮子的建议,我已经有一台服务器,但是它没有用,我需要基于Web的东西来进行更大的集成,我可以使用一个这些来自cpanel的APIS,但不是,不是我想要的。
在这里我要了解的是如何进行此交易,请参见运输代码:
// The message
$message = "Line 1\r\nLine 2\r\nLine 3";
// In case any of our lines are larger than 70 characters,we should use wordwrap()
$message = wordwrap($message,70,"\r\n");
// Send
mail('caffeinated@example.com','My Subject',$message);
请务必注意,仅因为接受电子邮件是为了 发送,并不意味着电子邮件将达到预期 目的地。 https://www.php.net/manual/en/function.mail.php
这没有道理,但是好吧,让我们考虑一下他经历了数十台服务器,其中一个服务器心情不好,顺便说一句,这并不是什么新鲜事,所以他决定随电子邮件消失,而已。这里最令人困惑的是,电子邮件通过一个或多个传输代理,这些代理可以对邮件提出上诉,他们甚至阅读以查看邮件是否合规,在此过程中消除了隐私……因此在实践中存在一个接收者(如果符合您的条件的话)主管,搜索并发送给接收者,再加上文档中有关“命令”,“命令注入”的话题很多 1-这些电子邮件如何到达收件人服务器? 2-这里的所有内容都是命令,还是文本? 3-如何捕获这些请求?例如:服务器A向服务器B(“代理”)发送了一条发给服务器C的消息,因此服务器C需要对其进行处理并回复它接受该消息。同时文档坚持使用“命令”来讨论注入命令,这意味着服务器B会将命令注入服务器C,因此从现在开始它不再是http,现在应该是ssh或telnet之类的(希望不是) ,http标头在哪里结束?
$headers = array(
'From' => 'webmaster@example.com','Reply-To' => 'webmaster@example.com','X-Mailer' => 'PHP/' . phpversion()
);
解决方法
您似乎对邮件传递的工作方式缺少基本的了解。
php mail()函数调用通常由系统管理员配置的sendmail程序,该程序允许您发送电子邮件。在这种情况下,sendmail程序负责执行传递。那里有几个不依赖sendmail并直接使用套接字发送电子邮件的库。您提供的link是此类库之一。请注意,这些库是客户端,而不是服务器。他们不接收邮件,仅发送邮件。
要能够使用纯PHP接收电子邮件,您需要创建一个侦听默认电子邮件端口的套接字。该服务器必须能够理解并回复SMTP协议中描述的命令。
HTTP标头与电子邮件传递无关。您提到的命令是遵循协议中描述的一组规则和过程的关键字,用于传输数据。
,我发现了一种更轻松的方法,在github上有6个打算充当电子邮件接收者的软件包,其中一个遵循与我相同的逻辑,创建一个套接字并尝试了解客户的尝试做,验证和提供(如果适用),基于黑名单创建过滤器,这里使用的是一个非常简单的json配置文件,这对于使用javascript框架的用户来说非常好,在我的情况下,它将无用,我必须将其切成碎片以使其达到我理想化的方式,但是它将为将来需要它的人提供帮助,它非常小,它具有3个php文件和1个json文件,还具有另一个已记录的json文件。
PHPMailServ 用PHP编写的SMTP电子邮件接收服务器。 https://github.com/timmyRS/PHPMailServ
它指定您需要下载项目,提供权限777并在终端上运行以下行:screen php run.php
原因很简单,您需要在发出请求之前启动套接字,一旦完成,它将在http:// localhost端口25可用
尽管存在争议,但您可以指定所需的端口,现在标准使用585发送和使用端口25接收,最低限度的现代电子邮件客户端应提供高级配置选项,但是如果无法实现,有数百个php库通过imap和pop3访问邮箱,此外,许多电子邮件客户端使用端口发现,其中之一是gmail。
run.php
<?php
if(empty($argv))
{
die("ERROR: Please run this script using the `php run.php`-command in your shell.");
}
echo "Initiating...\n";
set_time_limit(0);
error_reporting(E_ALL);
require "src/Client.class.php";
$config=json_decode(file_get_contents("config.json"),true);
if($config==null)
{
if(function_exists("json_last_error_msg"))
{
die("ERROR: Couldn't load config.json - ".json_last_error_msg()."\n");
} else
{
die("ERROR: Couldn't load config.json - JSON error #".json_last_error()."\n");
}
}
require "src/EmailAddr.class.php";
if(empty($config["users"]))
{
die("ERROR: `users` is not defined in config.json\n");
}
if(empty($config["motd"]))
{
$config["motd"] = "You've reached a PHPMailServ server. (Ohh no!)";
}
if(empty($config["hostname"]))
{
$config["hostname"] = "localhost";
}
if(empty($config["size"]))
{
$config["size"] = 10240000;
}
if(empty($config["sender_blacklist"]))
{
$config["sender_blacklist"] = ["wildcard@localhost"];
}
$addrs = [];
foreach($config["users"] as $name => $data)
{
$arr = explode("@",$name);
if(count($arr) == 2)
{
$addr = new EmailAddr($name,$data);
array_push($addrs,$addr);
} else
{
echo "Skipped invalid user {$name}\n";
}
}
unset($config["users"]);
echo "Loaded ".count($addrs)." addresses.\n";
$sSocket = socket_create(AF_INET,SOCK_STREAM,0) or die();
socket_set_option($sSocket,SOL_SOCKET,SO_REUSEADDR,1) or die();
socket_bind($sSocket,"0.0.0.0",25) or die();
socket_listen($sSocket) or die();
echo "Listening on <0.0.0.0:25>...\n";
$connections = [];
while(true)
{
$sReader = [$sSocket];
foreach($connections as $x => $c)
{
if($c->closed)
{
unset($connections[$x]);
$c->log("~ disconnected");
continue;
}
array_push($sReader,$c->socket);
}
$null = null;
$num_changed_sockets = socket_select($sReader,$null,null);
if($num_changed_sockets === false)
{
echo "ERROR: ".socket_strerror(socket_last_error())."\n";
exit;
}
if($num_changed_sockets > 0)
{
if(in_array($sSocket,$sReader))
{
$c = new Client(socket_accept($sSocket));
array_push($connections,$c);
$c->log("~ connected");
$c->send("220 ".$config["motd"]);
} else
{
foreach($connections as $c)
{
if(in_array($c->socket,$sReader))
{
$data = socket_read($c->socket,1);
if($data)
{
if($data != "")
{
if($data == "\n")
{
$c->line = trim($c->line);
if($c->line != "")
{
$c->log("> ".$c->line)->handle()->line="";
}
} else if($data != "\r")
{
$c->line .= $data;
}
}
} else
{
$c->disconnect();
}
}
}
}
}
}
?>
更正:由于垃圾邮件数量,某些国家/地区已关闭端口25,SMTP中最常用的端口是585、587和465
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。