有可能直接在php中的tcp / ip端点接收电子邮件?

如何解决有可能直接在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 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-