Pull to refresh

Делаем временные почтовые ящики на своем 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;
}

Tags:
Hubs:
You can’t comment this publication because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author’s username will be hidden by an alias.