Perl и base64

Есть такой скрипт:

#!/usr/bin/perl
# Copyright(C) Victor Vislobokov, 2011
# Under GNU GPL 2 License
use DB_File;
use Net::POP3;
# имя и пароль для доступа к почтовому ящику
$username = "username";
$password = "password";
# POP3 сервер
$server = "pop.yandex.ru";
# номер сотового куда отправлять SMS
$num = 'XXXXXXXXXX';
# База данных для хранения идентификаторов писем
$db_file = "/var/tmp/sms/id.db";
# Файл журнала для протоколирования действий
$logfile = "/var/tmp/sms/emailtosms.log";
$pop = Net::POP3->new($server, Timeout => 60);
$rc = $pop->login($username, $password);
if ($rc > 0) {
# Открываем БД сохранённых сообщений
$DB = tie(%hash_id, "DB_File", $db_file);
# Получаем список сообщений
$msgnums = $pop->list;
foreach my $msgnum (keys %$msgnums) {
# Получаем уникальный ID сообщения
$uid = $pop->uidl($msgnum);
# Отмечаем это сообщение в хеше текущих в данной сессии
$msgs{$uid} = 1;
# Проверяем не было ли уже обработано данное сообщение
# Если обработано, идём дальше
if (defined $hash_id{$uid}) {
writeLog($logfile, "$uid already processed");
next;
}
# Если нет, обрабатываем
$hash_id{$uid} = 1;
$msg = $pop->get($msgnum);
foreach $line (@$msg) {
if (index($line, "Subject: ") == 0) {
$sms = substr($line, 9, 50);
chomp($sms);
$stamp = getCurrentDateTime();
writeLog($logfile, "SMS '$sms' sended");
system("/usr/bin/smssend \"$num\" \"$stamp $sms\"");
}
}
# $pop->delete($msgnum);
}
} elsif ($rc == 0) {
writeLog($logfile, "No messages in mailbox");
} else {
writeLog($logfile, "Login failed");
}
$pop->quit;
# Удаляем из базы старые ID
foreach $uid (keys %hash_id) {
# Если ID из базы есть в текущей сессии, оставляем
next if (defined $msgs{$uid});
DB_File::DELETE($DB, $uid);
writeLog($logfile, "$uid was been deleted");
}
untie(%hash_id);
# ----------------------------------------------------------------------------
# Получение текущей даты и времени
# ----------------------------------------------------------------------------
sub getCurrentDateTime {
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime(time());
$mon++;
$year=$year-100+2000;
return(sprintf("%.4d-%.2d-%.2d %.2d:%.2d:%.2d", $year, $mon, $mday, $hour, $min, $sec));
}
# ----------------------------------------------------------------------------
# Запись в лог
# ----------------------------------------------------------------------------
sub writeLog {
my ($logfile, $msg) = @_;
if (!defined $logfile) {
$logfile = "/dev/null";
}
my ($datetime, $fd, $rc);
$datetime = getCurrentDateTime();
$rc = open($fd, ">>$logfile");
if (!defined $rc) {
if ($main::config{'DEBUG'} > 0) {
# При невозможности вывода в файл, выводим на стандартный ввод
print "$msg\n";
}
} else {
print($fd "$datetime ");
print($fd "$msg");
print($fd "\n");
close($fd);
}
}

Автор скрипта описывает его работу так:

Работа скрипта проста. Вы запускаете его по cron с нужной вам периодичностью. Скрипт лезет в почтовый ящик на сервере и забирает оттуда письма. Для каждого письма у POP3 сервера есть свой уникальный идентификатор, мы его получаем и проверяем нет ли у нас его в базе. Если есть, пропускаем письмо, так как считаем, что оно уже обработано, если идентификатора в базе нет, то мы сохраняем его туда. Затем получаем с сервера само сообщение, но используем только его тему (Subject:) для отправки по SMS. При этом не всю тему, а только 50 знаков, чтобы не превысить размер SMS. Затем отправяем SMS, предварительно сформировав текущее время, чтобы при получении было ясно, когда была отправка. После осуществления отправок всех SMS, чистим базу от старых идентификаторов сообщений, если сообщений с такими идентификаторами в ящике уже нет. Скрипт не удаляет само сообщение из ящика - этот вызов закомментирован.

Скрипт работает, но проблема в том, что тему письма он получает в кодировке base64 такого вида:

=?UTF-8?B?RGF2aWQgS3VyZXh5YW4g0L/RgNC40LPQu9Cw0YjQsNC10YIg0JLQsNGBINGB?=

Декодер от Лебедева - https://www.artlebedev.ru/decoder/ - расшифровывает условно правильно, в итоге результат такой:

?Q1-??David Kurexyan приглашает Вас с?

Но в самом скрипте дешифровка не предусмотрена и в смс уходит изначальной кодированный текст. На Тостере пишут, что

Это base64. Декодировать надо то, что после после «=?UTF-8?B?»
Ответ: «David Kurexyan приглашает Вас с»

Это декодируется с помощью Encode::MIME::Header

Вопрос: как изменить скрипт, чтобы тема письма декодировалась из base64 перед отправкой смс? Сам ни разу не программист, пытался по аналогии сделать, но нужного результата не добился.

Лига программистов

1.5K постов11.4K подписчиков

Добавить пост

Правила сообщества

- Будьте взаимовежливы, аргументируйте критику

- Приветствуются любые посты по тематике программирования

- Если ваш пост содержит ссылки на внешние ресурсы - он должен быть самодостаточным. Вариации на тему "далее читайте в моей телеге" будут удаляться из сообщества