PHP IMAP 推送电子邮件通知到 iPhone

2024-04-12

我正在编写一个 PHP 脚本,该脚本通过 IMAP 定期检查用户收件箱中是否有新消息。该脚本与 IMAP 服务器保持开放连接,并每 5 秒获取最新消息的 UID。如果 UID 大于最初记录的比较 UID,脚本会向用户的 iPhone 发送推送通知,通知他/她有新消息可用,将新 UID 记录为比较 UID,并继续检查新消息以这种方式。这是脚本:

<?php
$server = '{imap.gmail.com:993/ssl}';
$login = '[email protected] /cdn-cgi/l/email-protection';
$password = 'my_email_password';
$connection = imap_open($server, $login, $password) OR die ("can't connect: " . imap_last_error());

$imap_obj = imap_check($connection);
$number = $imap_obj->Nmsgs;
$uid = imap_uid($connection, $number);


//infinite loop, need to add some sort of escape condition...
for(;;){

$imap_obj = imap_check($connection);
$number = $imap_obj->Nmsgs;

    //if there is a new message send push notification
    if(imap_uid($connection, $number) > $uid){

    $uid = imap_uid($connection, $number);
    

$result = imap_fetch_overview($connection,$number,0);

$message = $result[0]->subject;
                

                $deviceToken = 'xxxxxxxxxxxxxxxxxx';
                $passphrase = 'my_secret_password';

                $ctx = stream_context_create();
                stream_context_set_option($ctx, 'ssl', 'local_cert', 'ck.pem');
                stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
                
                $fp = stream_socket_client(
                    'ssl://gateway.sandbox.push.apple.com:2195', $err,
                    $errstr, 60, STREAM_CLIENT_CONNECT|STREAM_CLIENT_PERSISTENT, $ctx);
                
                if (!$fp)
                    exit("Failed to connect: $err $errstr" . PHP_EOL);
                
                echo 'Connected to APNS' . PHP_EOL;
                
                // Create the payload body
                $body['aps'] = array(
                    'alert' => $message,
                    'sound' => 'default'
                    );
                
                // Encode the payload as JSON
                $payload = json_encode($body);
                
                // Build the binary notification
                $msg = chr(0) . pack('n', 32) . pack('H*', $deviceToken) . pack('n', strlen($payload)) . $payload;
                
                // Send it to the server
                $result = fwrite($fp, $msg, strlen($msg));
                
                if (!$result)
                    //echo 'Message not delivered' . PHP_EOL;
                else
                    //echo 'Message successfully delivered' . PHP_EOL;
                
                // Close the connection to the server
                fclose($fp);
                
    }

sleep(5);
}

imap_close($connection);
?>

这有效。但这对我来说似乎效率非常低。每个额外的用户都会与 IMAP 服务器保持无限期的连接,并每隔几秒钟检查一次新消息,这看起来很愚蠢。

有一个更好的方法吗?


你不能使用类似 CRON 的东西来安排一个脚本每 30 秒运行一次,它会保留每个用户最后一个 UID 的数据库记录,然后在本地搜索每个用户的邮箱(通过本地 shell 而不是 imapd 连接),如果特定用户有一条新消息,推送通知并更新数据库中该用户的最新 UID...

这是假设 PHP 脚本位于邮件服务器上并且您具有 root 访问权限。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP IMAP 推送电子邮件通知到 iPhone 的相关文章

  • Metallib:读取模块时出错:无效的位码签名

    我有以下 Filter metal 文件 include
  • 每次打开应用程序时运行动画

    我在 viewDidLoad 中有一个动画 该动画在应用程序第一次启动时运行 如果退出应用程序 然后再次启动它 动画将不会播放 我该如何让动画在每次打开应用程序时播放 谢谢你的帮助 在 iOS 4 中 按主页按钮不会终止应用程序 而是将其挂
  • StrRev() 不支持 UTF-8 [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个代码来替换非阿拉伯支持的程序中支持的阿拉伯文本因为我需要在替换后反转文本 但它显示一些垃圾内容而不是想要的结果 这是代码 结果 After Reverse 我需要它是原来的样子 但相反 不是垃圾
  • core-plot:仍然不明白如何拥有自定义标签和刻度

    我有这个问题很长时间了 但我找不到任何东西可以解决这个问题 我阅读了几个论坛 但无法找到可行的解决方案 我有以下代码 Adjust graph using above data CPXYPlotSpace plotSpace CPXYPlo
  • 递归树遍历 - 如何跟踪递归级别?

    我基本上试图从表示树结构的多维数组构建 html ul li 嵌套列表 下面的代码工作正常 但我想改进它 我需要一种方法来跟踪递归级别 以便我可以将不同的类应用于不同的级别 向生成的输出添加缩进等 function buildTree tr
  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • S3 上上传文件的 MIME 类型

    如何更改 Amazon S3 上上传文件的 MIME 类型 我尝试过http docs amazonwebservices com AWSSDKforPHP latest m Amazon S3 更改内容类型 http docs amazo
  • parse_str():jwage/purl 中不推荐调用不带结果参数的 parse_str()

    public function postIndex url new Url https www dropbox com 1 oauth2 authorize url gt query gt setData response type gt
  • numberOfRowsInSection:重新加载数据时未调用

    我有一个UITableView使用数组来列出数据 这很好用 我也有一个UISearchBar用于搜索那个tableview 当 tableviews 数组中的数据匹配时 这些行将添加到另一个可变数组中 并且cellForRowAtIndex
  • 避免刷新时上传图片

    我正在使用最简单的图像上传形式 我非常希望保持这种方式 只需要一些 php 代码看起来像这样
  • iOS:自动调整大小不适用于 UIImageView

    我正在制作一个非常简单的应用程序来学习 Objective C 和 Xcode 该应用程序有一个 UIButton 和一个 UIImageView 当用户点击按钮时 图像从右到左以对角线运动向下移动 当它到达屏幕中的某个点时 它会重新生成以
  • 如何重置(即取消缩放)UIScrollView?

    我有一个 UIScrollView 其中包含图像和分段控件 该控件允许用户在 ScrollView 内切换图像 如果我只是将图像交换到 UIImageView 内部 它将以放大状态显示新图像 如何将 UIScrollView 重置回未放大状
  • 在表中滚动时,“EXC_BAD_ACCESS”、“-[CFString release]:发送到已释放实例的消息”

    滚动时出现以下错误UITableview EXC BAD ACCESS CFString keep 发送到已释放实例的消息 我怎样才能找到已解除分配的实例 这是我的 noOfRowsinsection 代码 for int i 0 i
  • 美化html输出

    我想知道是否有类或类似的东西可以包含在我的 PHP 页面中以美化 HTML 输出 例如在标签后添加新行并正确缩进 以便我的源代码不仅仅是一行 我知道对于浏览器来说这并不重要 但我希望这样做 我听说过http www php net manu
  • 为简单应用程序生成 PHAR

    我正在尝试使用 Symfony2 控制台库构建 CLI 工具 我已经有了一些基本的工作 现在我想将其打包为一个 Phar 我读过一些示例 但我看到的示例非常简单 3 个文件 没有命名空间等 In my src 目录我有以下内容 Above
  • 如何确定网站的语言

    我有一个网站的网址 需要找出该网站使用哪种语言 无论是西班牙语 法语 意大利语等 该网站的顶级域名是 com 这根本没有帮助 我无法简单地检查字符串是否包含 de fr 或任何其他国家 地区代码 我试图得到lang的属性html标签 但有很
  • 从 array_map 匿名函数内部调用类方法

    我正在尝试从一个对象中调用我的对象的方法之一array map匿名函数 到目前为止 我收到了预期的错误 致命错误 不在对象上下文中时使用 this 我知道为什么我会收到此错误 我只是不知道如何实现我想要的目标 有人有任何建议吗 这是我当前的
  • PHP:如何使用 nl2br() 和 HTML Purifier 保持换行?

    Issue 使用时HTML 净化器 http htmlpurifier org 为了处理用户输入的内容 换行符不会被转换为 br tags 考虑以下用户输入的内容 Lorem ipsum dolor sit amet This is ano
  • 在线和离线管理 iPhone 应用程序

    我被困在一个点上 我也在离线管理我的应用程序 第一次我从网络服务获取所有配置文件数据并将其路径存储到 sqlite 中时 我在更新这些数据时遇到问题 例如如果图像发生更改 我应该如何通知我的应用程序 我在 Google 上搜索了它 唯一的解
  • cUrl 在本地主机上工作正常,但在服务器上不起作用,仅显示空白页面

    当我在服务器上运行以下代码时 它只显示空白页面并突然停止进一步执行 我还检查了已安装的服务器上的 cUrl 这是我的代码 ftp server ftps server Voorraadtonen link csv ch curl init

随机推荐