Назад | Перейти на главную страницу

Настройте sendmail для клонирования всей исходящей электронной почты

есть ли способ настроить Отправить почту похожий на постфикс'

always_bcc=bcc@localhost.localdomain

?

Взгляните на этот milter: http://www.five-ten-sg.com/sm-archive/

Вы можете использовать MIMEDefang, ищите: add_recipient

MIMEDefang находится на http://www.mimedefang.org/

Я надеялся найти решение, для которого не нужен milter, но, похоже, это невозможно. Для простого клонирования электронной почты в конкретный почтовый ящик (возможно, удаленный) вы можете использовать milters, предложенные здесь другими; Мне нужно было фактически создать клон SMTP-потоков для другого MTA. Лучшее решение, которое я нашел, было mailforward milter. К сожалению, в нашей среде Sendmail это не работает (может быть, это связано с серыми списками?)

Более полный список возможных решений можно найти на milter.org, включая коммерческий milter-bcc (90 долларов США), но поскольку milter API предоставляет механизм для добавления получателей конверта (без внесения каких-либо других изменений в сообщение), я смог просто написать очень минимальный milter, который добавляет фиксированного получателя ко всем сообщениям, а затем принимает их:

/*
 * Sendmail milter to add an additional (bcc) envelope recipient
 */

#include <stdio.h>
#include <stdlib.h>
#include <sysexits.h>
#include <unistd.h>
#include <sys/stat.h>

#include "libmilter/mfapi.h"

#ifndef bool
# define bool   int
# define TRUE   1
# define FALSE  0
#endif /* ! bool */

char *connsock;
char *bcc;

sfsistat
bccfi_eom(ctx)
     SMFICTX *ctx;
{
    if (smfi_addrcpt(ctx, bcc) != MI_SUCCESS)
        fprintf(stderr, "smfi_addrcpt failed\n");
    return SMFIS_ACCEPT;
}


struct smfiDesc bccfilter =
{
    "add_bcc",  /* filter name */
    SMFI_VERSION,   /* version code -- do not change */
    SMFIF_ADDRCPT,  /* flags */
    NULL,       /* connection info filter */
    NULL,       /* SMTP HELO command filter */
    NULL,       /* envelope sender filter */
    NULL,       /* envelope recipient filter */
    NULL,       /* header filter */
    NULL,       /* end of header */
    NULL,       /* body block filter */
    bccfi_eom,  /* end of message */
    NULL,       /* message aborted */
    NULL,       /* connection cleanup */
#if SMFI_VERSION > 2
    NULL,       /* unknown SMTP commands */
#endif /* SMFI_VERSION > 2 */
#if SMFI_VERSION > 3
    NULL,       /* DATA command */
#endif /* SMFI_VERSION > 3 */
#if SMFI_VERSION > 4
    NULL        /* Negotiate, at the start of each SMTP connection */
#endif /* SMFI_VERSION > 4 */
};

static void
usage(prog)
    char *prog;
{
    fprintf(stderr, "Usage: %s SOCKET_PATH BCC_ADDR\n", prog);
}

int
main(argc, argv)
     int argc;
     char **argv;
{
    char *socket;
    bool rmsocket = FALSE;
    struct stat status;

    if (argc != 3)
    {
        usage(argv[0]);
        exit(EX_USAGE);
    }

    socket = argv[1];
    bcc = argv[2];

    if (smfi_setconn(socket) == MI_FAILURE)
    {
        (void) fprintf(stderr, "smfi_setconn failed\n");
        exit(EX_SOFTWARE);
    }

    /* attempt to remove existing socket, if possible */
    if (stat(socket, &status) == 0 && S_ISSOCK(status.st_mode))
    {
        unlink(socket);
    }

    if (smfi_register(bccfilter) == MI_FAILURE)
    {
        fprintf(stderr, "smfi_register failed\n");
        exit(EX_UNAVAILABLE);
    }

    return smfi_main();
}

Вам все еще нужно скомпилировать и установить это (вместе с модулем initscript или systemd, чтобы запустить его перед Sendmail после перезагрузки) и настроить Sendmail для использования этого milter, так что это все еще довольно болезненно по сравнению с эквивалентным add_bcc в postfix (или "невидимом" маршрутизаторе config в Exim), но это для вас Sendmail.