是否可以在php中的tcp/ip端点直接接收电子邮件?
我正在研究imap和smtp,发现了一些有趣的东西 通过SSL或TLS使用端点/套接字TCP/IP接收和发送消息,有趣的是,php能够创建套接字并通过它接收和发送数据,我可以修改域的dns并指向端点。主要的IMAP命令是LOGIN和SELECT,当然还有其他命令,但更有趣的是,本教程介绍了IMAP服务器的工作原理: 基于此,可以模拟并轻松替换服务器,数据库和一些认证技术是必不可少的,在标题中不难找到“登录”,也可以在文本中搜索单词,因此不再需要命令行终端,我只需要知道客户做什么,验证什么,谁知道如何交付 可能有与我相反的观点,关于如何使用Devecot或不重新发明轮子的建议,我已经有了一个服务器,但它是无用的,我需要基于web的东西来实现更大的集成,我可以使用cpanel提供的其中一个API,但不,这不是我想要的 我在这里试图理解的是该交易是如何进行的,请参见装运代码:是否可以在php中的tcp/ip端点直接接收电子邮件?,php,http,websocket,tcp,imap,Php,Http,Websocket,Tcp,Imap,我正在研究imap和smtp,发现了一些有趣的东西 通过SSL或TLS使用端点/套接字TCP/IP接收和发送消息,有趣的是,php能够创建套接字并通过它接收和发送数据,我可以修改域的dns并指向端点。主要的IMAP命令是LOGIN和SELECT,当然还有其他命令,但更有趣的是,本教程介绍了IMAP服务器的工作原理: 基于此,可以模拟并轻松替换服务器,数据库和一些认证技术是必不可少的,在标题中不难找到“登录”,也可以在文本中搜索单词,因此不再需要命令行终端,我只需要知道客户做什么,验证什么,谁知
// 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);
重要的是要注意,仅仅因为电子邮件被接受
交付,这并不意味着电子邮件将达到预期的目标
目的地
这是没有道理的,但是,好吧,让我们考虑一下他通过了几十个服务器,其中一个心情不好,顺便说一下,这并不是什么新鲜事,所以他决定用电子邮件消失,就这样。这里最令人困惑的是,电子邮件通过一个或多个传输代理,这些代理可以对邮件进行上诉,他们甚至阅读邮件以查看是否符合要求,在这个过程中隐私已被消除。。。因此,在实践中,有一个主管负责接收,如果它符合您的标准,则搜索并交付给接收者,此外,文档中还讨论了很多关于“命令”、“命令注入”的内容
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程序负责进行传递。有几个lib不依赖sendmail,直接使用套接字发送电子邮件。您提供的是此类LIB之一。请注意,这些lib是客户端,而不是服务器。他们不接收邮件,只发送邮件 为了能够使用纯php接收电子邮件,您需要创建一个在默认电子邮件端口中侦听的套接字。此服务器必须能够理解并回复SMTP协议中描述的命令
HTTP头与电子邮件传递无关。您提到的命令是遵循传输数据协议中描述的一组规则和过程的关键字。您似乎对邮件传递的工作原理缺乏基本了解 php mail()函数调用sendmail程序,该程序通常由系统管理员配置,允许您发送电子邮件。在这种情况下,sendmail程序负责进行传递。有几个lib不依赖sendmail,直接使用套接字发送电子邮件。您提供的是此类LIB之一。请注意,这些lib是客户端,而不是服务器。他们不接收邮件,只发送邮件 为了能够使用纯php接收电子邮件,您需要创建一个在默认电子邮件端口中侦听的套接字。此服务器必须能够理解并回复SMTP协议中描述的命令
HTTP头与电子邮件传递无关。您提到的命令是遵循传输数据协议中描述的一组规则和过程的关键字。我发现了一种不那么痛苦的方法,在github上有6个软件包打算充当电子邮件接收器,其中一个遵循与我相同的逻辑,创建一个套接字并尝试了解客户试图做什么,验证和交付(如果适用),根据黑名单制作一个过滤器,这里使用的是一个非常简单的json配置文件,这对于使用javascript框架的人来说非常好,特别是在我的情况下,它将不会有用,我将不得不把它切成小块,使它成为我理想化的方式,但它将帮助那些未来需要它的人,它非常小,它有3个php文件和1个json文件,它还有另一个更有文档记录的json文件 PHPMailServ一种SMTP电子邮件接收服务器,用PHP编写。 它指定您需要下载项目,提供777权限,并在终端中运行此行:
screen php run.php
原因很简单,您需要在发出请求之前启动套接字,一旦完成,它将在http://localhost 端口25
虽然存在争议,但您可以指定所需的端口,现在使用585发送和端口25接收是标准的,最新的电子邮件客户端应提供高级配置选项,但如果不可能,则有数百个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, 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();
}
}
}
}
}
}
?>