On 02.06.11 23:44, Goncharov Yuri wrote:
Спасибо большое за комментарии
Да я наверное был не до конца точен. Прошу прощение. Задача быстрее
скормить MTA, все остальное уже не так важно и регулируется успешно.
Независимо от способа вливания в МТА, просто надо использовать
queue_only = yes

Однако, вливать в МТА нужно не одно письмо, а N писем по M адресатов в каждом.

Мой скриптик, который эрзац-bulk_mailer, приложен. Главная часть в нём:
  [ "$1" = "debug" ] && echo "==> $MSG"
  RCPT_LIST=''
  NUMRCPT=$MAXRCPT
  for RCPT in `cat ${MSG%.eml}.lst | sort -t@ -k2`; do
    [ "$RCPT_LIST" = "" ] \
      && RCPT_LIST="$RCPT" \
      || RCPT_LIST="$RCPT_LIST,$RCPT"
    NUMRCPT=$((NUMRCPT - 1))
    if [ $NUMRCPT = 0 ]; then
      cat $MSG | /usr/bin/sendmail "$RCPT_LIST"
      [ "$1" = "debug" ] && echo "$RCPT_LIST"
      RCPT_LIST=''
      NUMRCPT=$MAXRCPT
    fi
  done
  if [ "$RCPT_LIST" != "" ]; then
    cat $MSG | /usr/bin/sendmail "$RCPT_LIST"
    [ "$1" = "debug" ] && echo "$RCPT_LIST"
  fi
  mv $MSG ${MSG%.eml}.lst $SENT
done


Здесь file.eml - тело письма со всеми заголовками, file.lst - список адресов, на которые это письмо надо отправить.
#! /bin/sh

MSGDIR="/path/to/my/spool"
LSTDIR="/path/to/another/spool"
SENT="$MSGDIR/.SENT"
LOCK="$MSGDIR/.LOCK"
DOMAIN="domain.for.bulkmailer.tld"
MAXRCPT="10"
OWNER="[email protected]"
REPLY="[email protected]"
FROM="[email protected]"

cd $MSGDIR

mv $LSTDIR/{automatic,periodic,single}/* .

have_any_files=`ls -1 | wc -l`
[ "$have_any_files" = 0 ] && exit

[ -f "$LOCK" ] && exit
touch "$LOCK"

[ -d "$SENT" ] || mkdir "$SENT"
for MSG in *.eml; do
  if [ ! -f ${MSG%.eml}.lst ]; then
    grep '^To:.*<.*>' $MSG | head -1 | sed 's,^.*<\(.*\)>.*$,<\1>,' > 
${MSG%.eml}.lst
  fi

  sed \
    -e '/^$/d' \
    -e '/^[[:space:]]*$/d' \
    -e 's/^[[:space:]]*//' \
    -e 's/[[:space:]]*$//' \
    -e 's/^\([^<]\)/\1/' \
    -e 's/\([^>]\)$/\1/' \
  < ${MSG%.eml}.lst \
  > ${MSG%.eml}.lst.tmp \
  && mv ${MSG%.eml}.lst.tmp ${MSG%.eml}.lst

  [ "$1" = "debug" ] && echo "==> $MSG"
  RCPT_LIST=''
  NUMRCPT=$MAXRCPT
  for RCPT in `cat ${MSG%.eml}.lst | sed 's/@/ /' | sort -k2 | sed 's/ /@/'`; do
    [ "$RCPT_LIST" = "" ] && RCPT_LIST="$RCPT" || RCPT_LIST="$RCPT_LIST,$RCPT"
    NUMRCPT=$((NUMRCPT - 1))
    if [ $NUMRCPT = 0 ]; then
      cat $MSG | /usr/bin/sendmail "$RCPT_LIST"
      [ "$1" = "debug" ] && echo "$RCPT_LIST"
      RCPT_LIST=''
      NUMRCPT=$MAXRCPT
    fi
  done
  if [ "$RCPT_LIST" != "" ]; then
    cat $MSG | /usr/bin/sendmail "$RCPT_LIST"
    [ "$1" = "debug" ] && echo "$RCPT_LIST"
  fi
  mv $MSG ${MSG%.eml}.lst $SENT

#  bulk_mailer \
#    -v \
#    -domain "$DOMAIN" \
#    -maxrcpts "$MAXRCPT" \
#    -owner "$OWNER" \
#    +reply-to "$REPLY" \
#    "$FROM" \
#    ${MSG%.eml}.lst \
#  < $MSG \
#  && mv $MSG ${MSG%.eml}.lst $SENT
done

rm "$LOCK"

_______________________________________________
Exim-users mailing list
[email protected]
http://mailground.net/mailman/listinfo/exim-users

Ответить