Делаем временные почтовые ящики на своем exim4 сервере

Многие хоть раз да пользовались службами одноразовых почтовых ящиков. Идея сама по себе прекрасна — не приходится оставлять невнятным сайтам основные ящики только ради единократного доступа к какому-либо ресурсу, не нужно тратить несколько минут на регистрацию и разгадывание капч на одном из email сервисов.

Но у таких служб все же есть кое-какие недостатки:

  • ящик действительно одноразовый — спустя 5 (10, 20) минут после последнего использования доступ к нему исчезнет навсегда. Нужно быть уверенным что сам ящик и почта на нем не понадобятся уже никогда
  • некоторые сайты не принимают регистрацию с адресом в доменах таких служб
  • про безопасность данных говорить и вовсе не стоит. Маловероятно, конечно, что на такой ящик придет письмо с чувствительной информацией. Но тем не менее, хотелось бы иметь полный контроль над происходящим

К счастью, настроить свой exim для получения подобных временных ящиков не составляет особого труда. При этом не хотелось бы постоянно куда-то лезть, нажимать какие-то кнопки, копировать полученный адрес. Хочется просто вставить заранее известный адрес, в котором уже указана дата его окончания. Например: user.20181231@domain.tld — будет работать вплоть до 31 декабря 2018 года включительно. Пусть время существования такого ящика будет измеряться не минутами, а днями, не беда — это достаточная цена за простоту. Впрочем, можно модифицировать метод для обработки адресов хоть с миллисекундами, если вам не лень при указании адреса набрать кроме даты еще и время.

Exim из коробки позволяет настроить суффиксы для адресов. То есть когда user@domain.tld и user.suffix@domain.tld считаются одним и тем же адресом. Делается это в настройках основного роутера:

primary_router:
	local_part_suffix = .*
	local_part_suffix_optional	

Этими суффиксами и можно воспользоваться для создания адресов нужного типа. Осталось только научить наш MTA отвергать почту, которая приходит на просроченные адреса. Exim имеет внутренний perl интерпретатор и позволяет подсунуть perl файл с пользовательскими подпрограммами, результат работы которых можно использовать в конфигурации. Достаточно указать в основной конфигурации путь к файлу:

	perl_startup = do '/etc/exim4/exim4.pl'

Но прежде чем писать собственно подпрограмму-парсер, настроим сам exim на отвергание писем для некоторых адресатов. Для этого есть ACL под названием 'acl_check_rcpt'. Добавляем новое условие перед финальным accept:

deny
	condition = ${perl{blockRcptByDate}{$local_part}}
    message = Unrouteable address

Для всех получателей, для которых perl-подпрограмма blockRcptByDate вернет истинное значение, почту отвергаем и делаем вид, что такого ящика не существует.

Осталось реализовать подгрограмму и дело сделано:

exim4.pl
sub blockRcptByDate{
    my $lp = shift;

    # if local part contains dot and 8 digits untill the end
    if( $lp =~ /\.\d{8}$/ ){
        my @now = localtime(time());
        my $now = sprintf("%s%02d%02d", ($now[5] + 1900) , ($now[4] + 1) , $now[3]);

        # return 1 - means block if provided date is in the past
        return (
            substr( $lp, -8, 8 ) < $now
            ? 1
            : 0
        );

    }

    return 0;
}

Теги:
exim4, perl, временный почтовый ящик

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.