Автоматизируем создание почтовых ящиков в FreeBSD

Некоторое время назад, случилось так, что мне пришлось поднимать почтовый сервер. До этого почтовым сервером для нашего подразделения занимались администраторы из головного офиса, но для того чтобы уменьшить время от подачи заявки до собственно получения почтовой учетки нужно было перевести сервис под наш контроль. Сначала я начал искать возможные бесплатные варианты для Windows. Даже вспомнил как-то один достаточно интересный вариант, но он увы к этому моменту стал стоить денег. Посреди года, никто естественно незапланированных пару килобаксов выделять не будет. Начал советоваться с ребятами из головного офиса, мол как быть и что делать. Посоветовали поставить FreeBSD, а там уже на выбор. Должен заметить, что на тот момент с *nix подобными системами я не общался. Но даже дело не в этом. Погуглил нашел сайты, материалы. Поставил на гипервизоре от Microsoft FreeBSD. Время уже поджимало и нужно было запускать почтовичок. Начал читать на тему sendmail, разобравшись - это будет слишком конечно сказано, поняв как оно работает :). Итогом стала связка sendmail+cucipop.

И настало время переносить ящики пользователей со старого сервера и создавать новые. Перенести нужно было порядка 40 ящиков, и порядка 80 создать новых. После переноса первых 3 учетных записей руками переносить все остальные мне стало откровенно влом. Поэтому как говорится, "Лучше один день потерять, а потом за пять минут долететь". Получилось у меня несколько скриптов с помощью которых можно было заносить учетки скормив одному из них файл заполненный определенным образом (tomail):

Фамилия1 Имя1 Отчество1 должность1 отдел1 т.городской1 т.местный1 ip1
Фамилия2 Имя2 Отчество2 должность2 отдел2 т.городской2 т.местный1 ip2
Фамилия3 Имя3 Отчество3 должность3 отдел3 т.городской3 т.местный1 ip3
...
ФамилияN ИмяN ОтчествоN должностьN отделN т.городскойN т.местныйN ipN
Данный скрипт отправляет письмо с данными о почтовом ящике (sendm.sh).
#!/bin/sh
 
#вроде тоже не совсем мой скриптик
#автору тоже спасибо :)
 
TMPF=tempfile
EMAILF=$1 # тело письма newuser.eml
sendmail="/usr/sbin/sendmail"
email_to="$2" # адрес получателя "asu@local.lan"
email_from="postmaster@local.lan"
 
subject="Новому пользователю электронной почты."
echo $subject > $TMPF
subject=`uuencode -m $TMPF /dev/stdout | sed -n '2p;2q'`
telo=`uuencode -m $EMAILF /dev/stdout | sed -e '1d'`
 
boundary='simple boundary'
( cat <<EOF;
To: $email_to
From: $email_from
Subject: =?koi8-r?B?$subject?=
Content-Type: multipart/mixed; boundary="$boundary"
 
This is a multi-part message in MIME format.
--$boundary
Content-Type: text/html; charset="koi8-r"
Content-Transfer-Encoding: base64
 
$telo
EOF
) | $sendmail -t -oi
Скрипт транслитерации, переводит русские ФИО в транслит (translit.sh).
#!/bin/sh
 
#сам скрипт не мой
#выкусил из какого-то модуля, уже даже не помню где и немного дополнил
#автору спасибо :)
 
NAME=""
TRANSLIT=""
 
TRTBL_l="s/ай/ai/g; s/ей/ei/g; s/жё/zho/g; s/ий/y/g; s/ой/oi/g; s/уй/ui/g; s/чё/cho/g; s/шё/sho/g; s/щё/shcho/g; s/ый/yi/g;
         s/ье/ye/g; s/ъе/ye/g; s/ъи/yi/g; s/ъо/yo/g; s/й/y/g; s/щ/shch/g; s/х/kh/g; s/ч/ch/g; s/ш/sh/g; s/ё/yo/g; s/ж/zh/g;
         s/э/e/g; s/ц/ts/g; s/ю/yu/g; s/я/ya/g; s/ь//g"
TRTBL_h="s/АЙ/ai/g; s/ЕЙ/EI/g; s/ЖЁ/ZHO/g; s/ИЙ/Y/g; s/ОЙ/OI/g; s/УЙ/UI/g; s/ЧЁ/CHO/g; s/ШЁ/sho/g; s/ЩЁ/SHCHO/g; s/ЫЙ/YI/g;
         s/ЬЕ/YE/g; s/ЪЕ/YE/g; s/ЪИ/YI/g; s/ЪО/YO/g; s/Й/Y/g; s/Щ/SHCH/g; s/Х/KH/g; s/Ч/CH/g; s/Ш/SH/g; s/Ё/YO/g; s/Ж/ZH/g;
         s/Э/E/g; s/Ц/TS/g; s/Ю/YU/g; s/Я/YA/g; s/Ь//g"
 
translit()
{
       local cnm
       cnm="$NAME"
 
       cnm=`echo -n $cnm | sed "$TRTBL_l"`
       cnm=`echo -n $cnm | sed "$TRTBL_h"`
       cnm=`echo -n $cnm | tr "абвгдезиклмнопрстуфы" "abvgdeziklmnoprstufy"`
       cnm=`echo -n $cnm | tr "АБВГДЕЗИКЛМНОПРСТУФЫ" "ABVGDEZIKLMNOPRSTUFY"`
       TRANSLIT="$cnm"
}
 
rename_file()
{
       NAME="$1"
       if [ "x$NAME" != "x" ] ; then
               translit
               echo "$TRANSLIT"
       fi
}
 
rename_file "$1"
Генерируем пароль (passgen.sh).
#!/bin/sh
LANG=en_EN.KOI8-U
x=`tr -cd [:alnum:] < /dev/urandom | head -c13`
echo $x
Ну, а это основной скрипт, который в нужные моменты вызывает предыдущие (addusr.sh):).
#!/bin/sh
# $1 - начальное значение UID
# $2 - путь к файлу содержащему описание пользователя
# Файл должен иметь следующий формат
#Фамилия Имя Отчество должность кабинет телефон_город телефон_местный ip-адрес
 
#задаем начальное значение счетчика UID пользователя
iUID=$1
#Устанавливаем переменные
  tomail=$2
  sdir=`pwd`
  DOMAIN=external.ru
  DOMAINL=local.lan
  SMTP=smtp.local.lan
  POP3=pop3.local.lan
  SUBJECT="Новому пользователю электронной почты"
  ADMIN=asu@external.ru
  edir=emails/ #Дирректория в которой лежат файлы-письма
#Читаем строки из файла с пользователями
cat $tomail | while read FNAME LNAME MNAME JOB KAB TNUMBER1 TNUMBER2 IPADDRESS
do
# Задаем пароль новому пользователю
  PASSWORD=`sh passgen.sh`
 
# Транслируем русские имена в латиницу
  TFNAME=`sh translit.sh $FNAME`
  TLNAME=`sh translit.sh $LNAME`
  TMNAME=`sh translit.sh $MNAME`
 
#Делаем логин
  LOGINNAME=$TFNAME"."`printf "%0.1s" $TLNAME``printf "%0.1s" $TMNAME`"-uptk"
 
#Делаем адрес почты
  EMAIL=$TFNAME"."`printf "%0.1s" $TLNAME``printf "%0.1s" $TMNAME`"@"$DOMAIN
  EMAILL=$TFNAME"."`printf "%0.1s" $TLNAME``printf "%0.1s" $TMNAME`"@"$DOMAINL
#Переводим логин и почту в нижний регистр
  LOGINNAME=`echo $LOGINNAME | tr A-Z a-z`
  EMAIL=`echo $EMAIL | tr A-Z a-z`
  EMAILL=`echo $EMAILL | tr A-Z a-z`
  LOGINNAME=`echo $LOGINNAME | head -c 16`
  echo $LOGINNAME
#Добавляем пользователя в систему
echo $LOGINNAME:$iUID:20000:russian:0:0:$FNAME $LNAME $MNAME:/home/$LOGINNAME:/bin/sh:$PASSWORD | adduser -f || exit
 
#Добавляем пользователя в virtusertable
cp /etc/mail/virtusertable vut
cp vut vut.bak
echo "$EMAILL	$LOGINNAME" >> vut
echo "$EMAIL	$LOGINNAME" >> vut
cp vut /etc/mail/virtusertable
 
#Заносим в переменную текст шаблона письма
  MAILTEXT=`cat newuser.eml` 
 
#  echo $FNAME $LNAME $MNAME $JOB $KAB $TNUMBER1 $TNUMBER2 $IPADDRESS $iUID
#  echo $TFNAME $TLNAME $TMNAME $LOGINNAME $PASSWORD
 
#  FULLNAM=FULLNAME
 
#Заменяем метки в шаблоне на данные  
  MAILTEXT=`echo $MAILTEXT | sed 's,%FULLNAME%,'"$FNAME $LNAME $MNAME"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%LASTNAME%,'"$LNAME"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%MIDLNAME%,'"$MNAME"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%EMAILP%,'"$EMAIL"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%EMAILJ%,'"$EMAIL"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%EMAILJ%,'"$EMAIL"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%EMAILJ%,'"$EMAIL"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%SMTP%,'"$SMTP"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%POP3%,'"$POP3"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%LOGINNAME%,'"$LOGINNAME"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%MESTO%,'"$KAB"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%TNUMBER1%,'"$TNUMBER1"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%TNUMBER2%,'"$TNUMBER2"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%PASSWORD%,'"$PASSWORD"','`
  MAILTEXT=`echo $MAILTEXT | sed 's,%MIDLENAME%,'"$MNAME"','`
 
#Сохраняем текст готового письма в файл tmp
  echo $MAILTEXT >emails/$EMAIL #|  mail -s "$SUBJECT" $ADMIN
 
#Отправляем письмо tmp на адрес хранящийся в ADMIN  
#  sh sendm.sh tmp $ADMIN
#  echo $LOGIN_NAME:$i:20000:russian:0:0:$FNAME $LNAME $MNAME:/home/$LOGIN_NAME:/bin/sh:$PASSWORD >>mailusers
 
#Увеличиваем счетчик UID'а пользователя
  let iUID=iUID+1
done
#Перезапускаем sendmail
cd /etc/mail
make && make install && make restart
cd $sdir
#Отправляем письма адресатам
ls -1 $edir | while read EADDRESS
do
  echo $EADDRESS
  sh sendm.sh $edir$EADDRESS $ADMIN
  sh sendm.sh $edir$EADDRESS $EADDRESS
done
rm $edir*local.lan*
Используем:
./adusr UID tomail

UID - это собственно UID :) первого пользователя из списка, остальные будут прибавляться, для себя я решил, что пользователи созданные для ящиков начинаются у меня с 20001. Ну вот и все :).