Если совсем страшно - используйте ссылку из qr кода, в эмуляторе андроида на ПК.
Вообще да. Странно... У меня работало.
<?php
// Конфигурация почты (IMAP)
const IMAP_HOST = '{imap.example.com:993/imap/ssl}INBOX';
const IMAP_USER = 'inbox@example.com';
const IMAP_PASS = 'PASSWORD';
// SMTP для отправки ответа (используем PHPMailer)
const SMTP_HOST = 'smtp.example.com';
const SMTP_USER = 'inbox@example.com';
const SMTP_PASS = 'PASSWORD';
const SMTP_PORT = 587; // или 465
// Конфигурация внешних утилит для скачивания
// Формат: 'name' => ['cmd' => '/path/to/bin', 'default_args' => '...']
// В теле письма можно указывать имя утилиты в строке вида: "#tool: wget" (необязательно)
const DOWNLOAD_TOOLS = [
// по умолчанию - wget: одна страница с картинками и вложенность 1
'wget' => [
'cmd' => '/usr/bin/wget',
'default_args' => '--page-requisites --convert-links --adjust-extension --span-hosts -r -l 1 -P %s %s'
// %s: destination dir, %s: URL
],
// пример другой утилиты (httrack)
'httrack' => [
'cmd' => '/usr/bin/httrack',
'default_args' => '-O %s %s'
],
];
// Общие временные директории
$tempBase = sys_get_temp_dir() . '/mail_url_processor';
if (!is_dir($tempBase)) mkdir($tempBase, 0700, true);
// Вспомогательные функции
function logmsg($s) { echo "[" . date('Y-m-d H:i:s') . "] $s\n"; }
function connect_imap() {
$mailbox = IMAP_HOST;
$inbox = @imap_open($mailbox, IMAP_USER, IMAP_PASS);
if (!$inbox) {
throw new Exception("Cannot connect to IMAP: " . imap_last_error());
}
return $inbox;
}
function extract_urls_and_tool($body) {
$lines = preg_split("/\r\n|\n|\r/", $body);
$urls = [];
$tool = null;
foreach ($lines as $line) {
$line = trim($line);
if ($line === '') continue;
// tool directive: #tool: name
if (preg_match('/^#tool:\s*([a-z0-9_-]+)/i', $line, $m)) {
$tool = strtolower($m[1]);
continue;
}
// url detection (simple)
if (preg_match('/https?:\/\/[^\s<>"]+/i', $line, $m)) {
$urls[] = trim($m[0]);
continue;
}
// если строка выглядит как bare domain/path, можно попытаться дополнять (опционально)
}
return [$urls, $tool];
}
function download_url_with_tool($toolKey, $url, $destDir) {
if (!isset(DOWNLOAD_TOOLS[$toolKey])) {
throw new Exception("Tool not configured: $toolKey");
}
$tool = DOWNLOAD_TOOLS[$toolKey];
$cmdPath = $tool['cmd'];
$argsTemplate = $tool['default_args'];
// экранируем путь и url
$destEsc = escapeshellarg($destDir);
$urlEsc = escapeshellarg($url);
$args = sprintf($argsTemplate, $destEsc, $urlEsc);
$fullCmd = escapeshellcmd($cmdPath) . ' ' . $args . ' 2>&1';
// запуск
$output = [];
$ret = 0;
exec($fullCmd, $output, $ret);
return ['code' => $ret, 'output' => implode("\n", $output)];
}
// Отправка письма с вложением ZIP (используем PHPMailer)
require_once __DIR__ . '/vendor/autoload.php'; // предполагаем установленный PHPMailer через Composer
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
function send_reply_with_zip($toEmail, $subject, $bodyText, $zipPath) {
$mail = new PHPMailer(true);
$mail->isSMTP();
$mail->Host = SMTP_HOST;
$mail->SMTPAuth = true;
$mail->Username = SMTP_USER;
$mail->Password = SMTP_PASS;
$mail->SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS;
$mail->Port = SMTP_PORT;
$mail->setFrom(SMTP_USER, 'URL Downloader');
$mail->addAddress($toEmail);
$mail->Subject = $subject;
$mail->Body = $bodyText;
$mail->addAttachment($zipPath, basename($zipPath));
$mail->send();
}
// Основная обработка
try {
$inbox = connect_imap();
// Ищем письма с темой "url" (без учёта регистра)
$search = 'SUBJECT "url" UNSEEN';
$emails = imap_search($inbox, $search, SE_UID);
if (!$emails) {
logmsg("No matching emails.");
imap_close($inbox);
exit(0);
}
foreach ($emails as $uid) {
$overview = imap_fetch_overview($inbox, $uid, FT_UID)[0];
$header = imap_headerinfo($inbox, imap_msgno($inbox, $uid));
$from = isset($overview->from) ? $overview->from : null;
// get sender email
$fromAddress = '';
if (isset($header->from) && is_array($header->from) && isset($header->from[0])) {
$a = $header->from[0];
$fromAddress = (isset($a->mailbox) && isset($a->host)) ? ($a->mailbox . '@' . $a->host) : '';
}
// get body (try text/plain first)
$body = '';
$structure = imap_fetchstructure($inbox, $uid, FT_UID);
if (!isset($structure->parts) || count($structure->parts) == 0) {
$body = imap_body($inbox, $uid, FT_UID);
} else {
// walk parts
$parts = $structure->parts;
foreach ($parts as $idx => $part) {
$partno = $idx+1;
$partData = imap_fetchbody($inbox, $uid, $partno, FT_UID);
if ($part->encoding == 3) $partData = base64_decode($partData);
if ($part->encoding == 4) $partData = quoted_printable_decode($partData);
if ($part->subtype == 'PLAIN' || stripos($part->type, 'text') !== false) {
$body .= $partData . "\n";
}
}
if ($body === '') {
// fallback
$body = imap_body($inbox, $uid, FT_UID);
}
}
list($urls, $toolFromBody) = extract_urls_and_tool($body);
if (empty($urls)) {
logmsg("UID $uid: no URLs found, marking seen.");
imap_setflag_full($inbox, $uid, "\\Seen", ST_UID);
continue;
}
$toolKey = $toolFromBody ?? 'wget';
if (!isset(DOWNLOAD_TOOLS[$toolKey])) $toolKey = 'wget';
$jobDir = $tempBase . '/job_' . time() . '_' . mt_rand(1000,9999);
mkdir($jobDir, 0700, true);
$downloadReports = [];
foreach ($urls as $i => $url) {
$urlSafe = preg_replace('/[^a-z0-9._-]/i', '_', parse_url($url, PHP_URL_HOST) . '_' . $i);
$destDir = $jobDir . '/' . $urlSafe;
mkdir($destDir, 0700, true);
logmsg("Downloading $url with $toolKey into $destDir");
$res = download_url_with_tool($toolKey, $url, $destDir);
$downloadReports[] = [
'url' => $url,
'tool' => $toolKey,
'code' => $res['code'],
'output' => $res['output'],
'dest' => $destDir
];
}
// Создаём ZIP
$zipPath = $jobDir . '/download_' . time() . '.zip';
$zip = new ZipArchive();
if ($zip->open($zipPath, ZipArchive::CREATE) !== true) {
throw new Exception("Cannot create zip at $zipPath");
}
// рекурсивно добавляем файлы из jobDir
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($jobDir, RecursiveDirectoryIterator::SKIP_DOTS));
foreach ($files as $file) {
if ($file->isDir()) continue;
$filePath = $file->getRealPath();
// не добавляем сам zip (если попадёт)
if ($filePath === $zipPath) continue;
$localName = substr($filePath, strlen($jobDir)+1);
$zip->addFile($filePath, $localName);
}
$zip->close();
// Формируем тело ответа с кратким отчётом
$bodyText = "Attached ZIP contains downloaded content.\n\nReport:\n";
foreach ($downloadReports as $r) {
$bodyText .= "- URL: {$r['url']}\n tool: {$r['tool']}\n exit: {$r['code']}\n";
}
// Отправляем ответ отправителю
if ($fromAddress) {
send_reply_with_zip($fromAddress, 'Downloaded URLs', $bodyText, $zipPath);
logmsg("Sent reply to $fromAddress with zip.");
} else {
logmsg("No sender address; skipping send.");
}
// Пометить письмо как прочитанное
imap_setflag_full($inbox, $uid, "\\Seen", ST_UID);
// Очистка временных файлов — оставляем на всякий случай; можно удалить:
// recursive delete
$it = new RecursiveDirectoryIterator($jobDir, RecursiveDirectoryIterator::SKIP_DOTS);
$files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($files as $file) {
if ($file->isDir()) rmdir($file->getRealPath());
else unlink($file->getRealPath());
}
@rmdir($jobDir);
}
imap_close($inbox);
} catch (Exception $e) {
logmsg("Error: " . $e->getMessage());
exit(1);
} За 5 секунд что-либо скачать вряд ли возможно, письмо может банально у почтовых сервисов отмораживаться не одну минуту.
Это специфическая задача с конкретными условиями. Лучше всего самому такой скрипт написать
<?
require "PHPMailer\\Exception.php";
require "PHPMailer\\PHPMailer.php";
require "PHPMailer\\SMTP.php";
require "PHPMailer\\OAuthTokenProvider.php";
require "PHPMailer\\OAuth.php";
use PHPMailer\PHPMailer\PHPMailer;
use PHPMailer\PHPMailer\Exception;
use PHPMailer\PHPMailer\SMTP;
//Create an instance; passing `true` enables exceptions
$mail = new PHPMailer(true);
// TEST SEND!!!!!!!
try {
//Server settings
$mail->Mailer = 'smtp';
$mail->SMTPDebug = SMTP::DEBUG_SERVER; //Enable verbose debug output
$mail->isSMTP(); //Send using SMTP
$mail->Host = 'ssl://smtp.yandex.ru'; //Set the SMTP server to send through
$mail->SMTPAuth = true; //Enable SMTP authentication
$mail->Username = 'blablablablablablablablablabla@yandex.ru'; //SMTP username
$mail->Password = 'blablablablablablablablablabla'; //SMTP password
$mail->SMTPSecure = PHPMailer::ENCRYPTION_SMTPS; //Enable implicit TLS encryption
$mail->Port = 465; //TCP port to connect to; use 587 if you have set `SMTPSecure = PHPMailer::ENCRYPTION_STARTTLS`
//Recipients
$mail->setFrom('blablablablablablablablablablablabla@yandex.ru', 'blablablablablablablablablablablabla@yandex.ru');
$mail->addAddress('blablablablablablablablablablablabla@yandex.ru', 'blablablablablablablablablablablabla@yandex.ru'); //Add a recipient
//Attachments
$mail->addAttachment('1.zip'); //Add attachments
//Content
$mail->isHTML(false); //Set email format to HTML
$mail->Subject = 'reurl';
$mail->Body = 'url:fsdfsdfdf';
$mail->AltBody = 'This is the body in plain text for non-HTML mail clients';
$mail->send();
echo 'Message has been sent';
} catch (Exception $e) {
echo "Message could not be sent. Mailer Error: {$mail->ErrorInfo}";
}
die;
$mbox = imap_open("{imap.yandex.ru:993/imap/ssl/novalidate-cert}INBOX", "blablablablablablablablablablablabla@yandex.ru", "blablablablablablablablablablablabla")
;
if ($mbox ==false){
$errors = imap_errors();
echo implode("\n", $errors);
die;
}
// or die("Не получилось подключиться: " . imap_last_error());
$MC = imap_check($mbox);
//
// Получаем обзор каждого письма в папке INBOX
$result = imap_fetch_overview($mbox, "1:{$MC->Nmsgs}", 0);
$body = imap_body($mbox, count($result));
$s.="TEXT: $body \n\n\n";
/*
foreach ($result as $overview) {
$s.= "#{$overview->msgno} ({$overview->date}) — От: {$overview->from}
{$overview->subject}\n";
}*/
foreach ($result as $overview)
if (trim($overview->subject)=="url")
if (stripos($overview->from, "blablablablablablablablablablablabla@yandex.ru")!==false){
$body = str_ireplace("<div>", "\n<div>", $body);
$body = imap_body($mbox, $overview->msgno);
//$s.="TEXT: $body \n\n\n";
$body = strip_tags($body);
$body = explode("\n", $body);
foreach($body as $url) if (($body=trim($body))!==""){
$text = file_get_contents($url);
}
//$s.="TEXT: $body \n\n\n";
}
file_put_contents("out.txt", $s);
imap_close($mbox);
?> Приобрести дешёвый mikrotik/keenetic/другой wrt совместимый роутер с USB или встроенным модемом.
Завернуть его в WG vpn и также заходить на веб-морду модема.
В случае в keenetic насколько могу помнить всё совсем просто, из коробки есть сервис переадресации смс в фирменного ТГ-бота.
root@WIN-KPVSBPAFD7R:/mnt/c/Users/user# uname -r
4.4.0-19041-Microsoft
root@WIN-KPVSBPAFD7R:/mnt/c/Users/user# cd /lib/modules/6.6.87.2-1
-bash: cd: /lib/modules/6.6.87.2-1: No such file or directory
root@WIN-KPVSBPAFD7R:/mnt/c/Users/user# cd /lib/modules/
-bash: cd: /lib/modules/: No such file or directory
root@WIN-KPVSBPAFD7R:/mnt/c/Users/user# cd /lib/
root@WIN-KPVSBPAFD7R:/lib# ls
X11 dbus-1.0 groff networkd-dispatcher python3.12 ubuntu-advantage
apparmor dhcpcd init openssh rsyslog ubuntu-release-upgrader
apt dpkg kernel openvpn sasl2 udev
binfmt.d environment.d landscape os-release snapd valgrind
byobu file locale pam.d software-properties wsl
cloud-init girepository-1.0 lsb pcrlock.d ssl x86_64-linux-gnu
cnf-update-db git-core man-db pm-utils sysctl.d
command-not-found gnupg mime policykit-1 systemd
compat-ld gnupg2 modprobe.d polkit-1 sysusers.d
console-setup gold-ld netplan python3 tmpfiles.d 1) ставит apline virt на virtualbox по гайдам
2) Чтоб заработал 3proxy и openvpn
Первая проблема: при установке надо будет добиться ручного указания DNS - можно указать 8.8.8.8, предлагаемый
по дефолту не работал.
Далее и вовсе прибил гвозядми файл
командой chattr +i /etc/resolv.conf
внеся в него 8.8.8.8
3) Далее: не устанавливались дополнения гостевой ОС, чтоб сделать общую папку с хостом и закинуть ovpn файлы.
4) Затем, openVPN установился командой apk add
5) а 3proxy не установился - нужно сначала добавить репозиторий тестинг :
добавь /etc/apk/repositries репозитории /alpine/edge/testing
6) затем ставь apk add 3proxy
7) затем apk add openvpn
8) apk add virtualbox-guest-additions linux-virtmkdir
mkdir -p /mnt/outside
reboot
затем в гуи virtualbox создаем папку общую с имемнем vbox_shared
затем:
modprobe -a vboxsf
mount -t vboxsf vbox_shared /mnt/outside
копируем на хосте ovpn файлы в vbox_shared
затем на виртуалке из /mnt/outside куданибудь в ~
запускаем сначала 3proxy: nohup 3proxy /etc/3proxy/3proxy.cfg
жмём ctrl+c
чтоб снова вернуться в консоль и запускаем openvpn <имя файла>.ovpn
ещё раз напомню что прибил гвозядми файл
командой chattr +i /etc/resolv.conf
внеся в него 8.8.8.8 предварительно, а то DNS резолвинг не работал chattr +i /etc/resolv.conf