Dê uma olhada neste milter: link
Dê uma olhada neste milter: link
Você pode usar o MIMEDefang, procure por: add_recipient
O MIMEDefang está no link
Eu esperava encontrar uma solução que não exigisse um milter, mas parece que isso não é possível. Para apenas clonar e-mails para uma caixa de correio específica (possivelmente remota), você poderia usar os milters sugeridos por outras pessoas aqui; Eu precisava realmente criar um clone dos fluxos SMTP para outro MTA. A melhor solução que encontrei foi o militante do mailforward . Infelizmente, não parece funcionar em nosso ambiente Sendmail (talvez relacionado a graylisting?)
Há uma lista mais completa de possíveis soluções em milter.org , incluindo o comercial (US $ 90) milter-bcc, mas como a API milter fornece um mecanismo para adicionar destinatários de envelope (sem fazer nenhuma outra alteração na mensagem), consegui codificar um milter mínimo que adiciona um destinatário fixo a todas as mensagens e, em seguida, aceita eles:
/*
* 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();
}
Você ainda precisa compilar e instalar isto (junto com o initscript ou systemd para iniciá-lo antes do Sendmail após as reinicializações) e configurar o Sendmail para usar este milter, então ainda é um pouco doloroso comparado ao equivalente add_bcc no postfix (ou " invisível "configuração de roteador no Exim), mas isso é Sendmail para você.
Tags sendmail