liujia 发布的文章

通过浏览器访问网址 - 使用imap协议 - 获取邮件内容 - 关键词搜索 - php-imap-reader

需求:通过URL,提交邮箱的用户名和密码,获取到邮件内容。通过关键字搜索邮件。

尝试:用 php-imap-reader 试试。

<?php
date_default_timezone_set('Asia/Shanghai');

require 'src/phpImapReader/Email.php';
require 'src/phpImapReader/EmailAttachment.php';
require 'src/phpImapReader/Reader.php';

use benhall14\phpImapReader\Email;
use benhall14\phpImapReader\EmailAttachment;
use benhall14\phpImapReader\Reader;

// define('IMAP_USERNAME', 'postmaster@lan.anqun.org');
// define('IMAP_PASSWORD', 'mima');
define('IMAP_MAILBOX', '{127.0.0.1:993/imap/ssl/novalidate-cert}'); // For example: {outlook.office365.com:993/imap/ssl/novalidate-cert}
define('ATTACHMENT_PATH', __DIR__ . '/attachments/');

define('IMAP_USERNAME', $_REQUEST['n']);
define('IMAP_PASSWORD', $_REQUEST['p']);

// echo $_REQUEST['n'];
// echo $_REQUEST['p'];
// echo $_SERVER["QUERY_STRING"];

try {
    $imap = new Reader(IMAP_MAILBOX, IMAP_USERNAME, IMAP_PASSWORD, ATTACHMENT_PATH);
    
    $imap->limit(2)->get();

    foreach ($imap->emails() as $email) {
        echo '<div>';
            
        echo '<div>' . $email->fromEmail() . '</div>';
            
        echo '<div>' . $email->subject() . '</div>';
            
        echo '<div>' . $email->date('Y-m-d H:i:s') . '</div>';

        if ($email->hasAttachments()) {
            foreach ($email->attachments() as $attachment) {
                echo '<div>' . $attachment->filePath() . '</div>';
            }
        }
        
        #print_r($email->plain());
        #print_r($email->html());

        #$plainText = $email->plain();
        #$extractedText = substr($plainText, 0, 100); // 提取前100个字符
        #echo $extractedText;

        // 假设 $email 是一个包含邮件信息的对象
        $plainText = $email->plain(); // 获取 plain 属性内容

       // 使用正则表达式来匹配并提取所需文本内容
       // $pattern = '/Password: \w{8}/'; // 用你的实际匹配模式替换 YourPatternHere
        $pattern = '/\b\d{6}\b/'; // 用你的实际匹配模式替换 YourPatternHere
       if (preg_match($pattern, $plainText, $matches)) {
        $extractedText = $matches[0]; // 提取匹配到的文本内容
        echo "Extracted text: " . $extractedText;
    } else {
        echo "Pattern not found in plain text.";
    }

        echo '</div><br/><br/><hr />';
    }
} catch (Exception $e) {
    die($e->getMessage());
}

或者:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>My Web Page</title>
</head>
<body>

<?php
date_default_timezone_set('Asia/Shanghai');

require 'src/phpImapReader/Email.php';
require 'src/phpImapReader/EmailAttachment.php';
require 'src/phpImapReader/Reader.php';

use benhall14\phpImapReader\Email;
use benhall14\phpImapReader\EmailAttachment;
use benhall14\phpImapReader\Reader;

// define('IMAP_USERNAME', 'postmaster@lan.anqun.org');
// define('IMAP_PASSWORD', 'mima888');
define('IMAP_MAILBOX', '{localhost/imap/ssl/novalidate-cert}'); // For example: {outlook.office365.com:993/imap/ssl/novalidate-cert}
define('ATTACHMENT_PATH', __DIR__ . '/attachments/');

define('IMAP_USERNAME', $_REQUEST['n']);
define('IMAP_PASSWORD', $_REQUEST['p']);

// echo $_REQUEST['n'];
//  echo $_REQUEST['p'];
// echo $_SERVER["QUERY_STRING"];

echo "默认显示未读邮件列表及其内容。如果列表为空,可能是没有收到新邮件。";

try {
    $mark_as_read = true;
    $imap = new Reader(IMAP_MAILBOX, IMAP_USERNAME, IMAP_PASSWORD, ATTACHMENT_PATH);
    
   $imap->limit(2)->get();
//    $imap->unseen()->get();

    foreach ($imap->emails() as $email) {
        echo '<div>';
            
        echo '<div>' . $email->fromEmail() . '</div>';

//    echo '<div>' . $email->to() . '</div>';
        $emailsString = implode(', ', array_column($email->to(), 'email'));
        echo $emailsString;
    

            
        echo '<div>' . $email->subject() . '</div>';
            
        echo '<div>' . $email->date('Y-m-d H:i:s') . '</div>';

        if ($email->hasAttachments()) {
            foreach ($email->attachments() as $attachment) {
                echo '<div>' . $attachment->filePath() . '</div>';
            }
        }
        
        print_r($email->plain());
        #print_r($email->html());

        #$plainText = $email->plain();
        #$extractedText = substr($plainText, 0, 100); // 提取前100个字符
        #echo $extractedText;


        echo '</div><br/><br/><hr />';
    }
} catch (Exception $e) {
    die($e->getMessage());
}

?>

</body>
</html>
<?php
header('Content-Type: application/json; charset=UTF-8');
date_default_timezone_set('Asia/Shanghai');

require 'src/phpImapReader/Email.php';
require 'src/phpImapReader/EmailAttachment.php';
require 'src/phpImapReader/Reader.php';

use benhall14\phpImapReader\Email;
use benhall14\phpImapReader\EmailAttachment;
use benhall14\phpImapReader\Reader;

define('IMAP_MAILBOX', '{mail.iredmail.demo.anqun.org/imap/ssl/novalidate-cert}'); // For example: {outlook.office365.com:993/imap/ssl/novalidate-cert}
define('ATTACHMENT_PATH', DIR . '/attachments/');

define('IMAP_USERNAME', $_REQUEST['n']);
define('IMAP_PASSWORD', $_REQUEST['p']);

// echo $_REQUEST['n'];
// echo $_REQUEST['p'];
// echo $_SERVER["QUERY_STRING"];

try {
$mark_as_read = true;
$imap = new Reader(IMAP_MAILBOX, IMAP_USERNAME, IMAP_PASSWORD, ATTACHMENT_PATH);

$imap->limit(5)->get();
// $imap->unseen()->get();

// 创建一个空数组来存储所有邮件的信息
$emailsData = [];

foreach ($imap->emails() as $email) {
// 为当前邮件创建一个关联数组
$emailData = [
'from' => $email->fromEmail(),
'to' => $email->to(),
'subject' => $email->subject(),
'date' => $email->date('Y-m-d H:i:s'),
// 'plainText' => $email->plain(),
'verificationCode' => null // 初始化验证码为 null
];

// 使用正则表达式搜索6位的数字或字母组成的序列
$plainText = $email->plain();
preg_match('/[A-Za-z0-9]{6}/', $plainText, $matches);

// 将当前邮件的信息添加到 $emailsData 数组中
$emailsData[] = $emailData;
}

// 使用 json_encode() 将整个数组转换为 JSON 格式的字符串
$jsonData = json_encode($emailsData, JSON_PRETTY_PRINT);

// 输出 JSON 数据
echo $jsonData;

} catch (Exception $e) {
die($e->getMessage());
}

?>

参考:
https://github.com/benhall14/php-imap-reader

IRedMail - 批量创建用户 - urandom

需求:随机创建100个邮箱用户和密码。

尝试:可使用 /dev/urandom 生成随机字符的用户名和密码(八位),然后通过 create_mail_user_SQL.sh 生成SQL语句,最后导入到数据库。

#!/bin/bash
#For Loop to Read Three-expression

rm -rf /tmp/iredmail-users.txt
rm -rf /tmp/iredmail-users.sql

for ((i=1; i<=100; i++))
do
USER=$(strings /dev/urandom |tr -dc a-z0-9 | head -c8)
PWD=$(strings /dev/urandom |tr -dc a-z0-9 | head -c8)
DOMAIN="lan.anqun.org"

echo $USER@$DOMAIN $PWD >> /tmp/iredmail-users.txt
bash create_mail_user_SQL.sh $USER@$DOMAIN $PWD >> /tmp/iredmail-users.sql
done

参考:
https://docs.iredmail.org/sql.create.mail.user.html
https://www.runoob.com/linux/linux-shell-process-control.html

接收到的邮件 - Received Mails - 为空 - No incoming mails - content_filter - postfix - iRedMail

现象:用户将iRedMail升级到Pro版本后,在邮局管理后台面板里,“活动” --> “接收到的邮件”页面中,列表是空的。但“发送的邮件”页面却有。

尝试:检查postfix的配置文件main.cf,是否注释了 content_filter = smtp-amavis:[127.0.0.1]:10024 这一行。

“接收到的邮件”页面为空
“接收到的邮件”页面有内容了

感谢张老板指导。

物业费涨不涨谁说了算

2023年10月12日晚上,我到楼下倒垃圾,回楼时看到玻璃门上贴着纸,是通知。我粗略地看了一下,大概是说物业公司在2023-09-26日向业主委员会提出涨物业费的申请,申请每平方涨0.25元;业委会在2023-10-10日回复说每平方可以涨0.2元。我有点懵,当前计价是每平方1元,涨0.2元是每平方涨20%,按140平方面积计的话,每月要多出28元。且涨价的事情看起来好像已经被决定了。涨不涨价,涨多少,都不用问我意见直接就通过了的吗?

我把疑问发到微信的业主交流群里,群友们也是觉得这件事情莫名其妙的,纷纷议论。甚至,有的业主说,业主委员是谁,都不认识的。我读了两遍通知,觉得涨价、涨多少的原因和依据不合道理。

先说物业公司为什么要涨管理费,他说去年账面亏了11万,之前八年还共垫了约60万,涨价后每年可多收20万,可以逐年回收资金。这是不合理的,物业公司赚不赚到钱,得靠它自己,业主不能包物业能赚到钱。如果说物业公司和小区是雇佣的合同关系,那么按市场自由买卖的原则,物业公司如果觉得亏本,那可以不接桩这生意的。且不说通知里公布的账务数值真不真,光凭“既然物业公司年年亏钱,连亏了八年,为什么还情愿续物业合同”,这个简单的逻辑,我就想不通。

再说业委会同意涨价的依据,他依据的是2021年7月的《河源市市区住宅物业服务收费政府指导价标准》。和平县是县城,不是市区,两者的工资收入和生活环境是有差别的。且群友指出,当前物业公司的服务水平达不到指导标准里的三级服务水平,不匹配。更受不了的是,通知里的“经小区业主委会成员、楼长会议研究广泛听取业主意见”这句话,刺激了不少人。谁呀,这是谁问过我们关什么事的意见了?多数业主都被蒙在鼓里。微信业主群里明明有物业公司和业委会的人,但关于涨物业费的事,既不预先通知,也不收集意见,更是在众多讨论声中沉默。甚至是通过给有不同意见的业主家里老人打电话,想通过其它方式来施压,强行推进涨物业费的事情。

我在2023-10-13日打政务热线12345,说小区涨物业费的事不合理。同日,我在微信业主群里,发了一份不记名的调查问卷,简要列了几个问题,看看业主们的意见。截止到目前(一周后),没有收到有关部门对12345电话反馈问题的答复。匿名的在线调查问卷,收到97份答卷。答卷大概表明:超过九成的业主事先没从楼长、物业或业委会收到征询,没机会表达意见;同样超过九成的人不认同物业涨价的理由,不认同业委会同意涨价的依据;全部人都觉得物业公司和业委会“一唱一和”地完成申请和答复的做法,伤了业主的心。他们问都不问一下,就要直接把价格给涨了。八成的业主表示,拒绝缴纳涨价部分的物业费是最简单、最省事的“抗议”行为。

我在我们这栋里的微信群里收集意见和看法,当天至少有7个人表示不支持涨物业费。如果按这栋楼20户来算,那么反对涨价的是超过三分之一了。但也有邻居表示,物业公司和业委会必须经过与业主充分的交流和沟通,合理的涨价可以接受,但整个过程要合规合法,不能不顾事实情况和业主的感情就强行涨价。物业费涨不涨价,涨多少?​就简单地反问一句,“钱是谁出的?”

在 Windows PE 里使用 rsync 上传文件

需求:使用 WinPE 启动,连上互联网后,能将机子硬盘上的文件上传到别的机子。
步骤:

  1. wget https://itefix.net/dl/free-software/cwrsync_6.2.10_x64_free.zip # 下载 cwrsync 软件,如果国内访问失败,请用其它方法下载
  2. xcopy bin x:\Windows\system32\ # 将 cwrsync 的 bin 目录文件复制到WinPE的system32目录中
  3. cwrsync.cmd # 执行 cwrsync 软件包中的脚本,设置环境参数
  4. rsync.exe -av --progress /cygdriver/x/test/cwrsync/ liujiatemp@example.com:/home/liujiatemp/rtest/ # 将本机的X:\test\cwrsync目录中的文件上传到远程Linux机的/home/liujiatemp/rtest目录中

参考:https://itefix.net/https://itefix.net/cwrsync

cwrsync