答案1
答案2
您可以使用 MIMEDefang,查找:add_recipient
MIMEDefang 位于http://www.mimedefang.org/
答案3
我希望找到一个不需要过滤器的解决方案,但这似乎是不可能的。如果只是将电子邮件克隆到特定邮箱(可能是远程邮箱),您可以使用其他人建议的过滤器;我需要实际创建 SMTP 流到另一个 MTA 的克隆。我发现的最佳解决方案是邮件转发工具。不幸的是,它似乎在我们的 Sendmail 环境中不起作用(可能与灰名单有关?)
这里有更完整的解决方案列表milter.org,包括商业(90 美元) milter-bcc,但由于 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 以使用这个邮件过滤器,因此与 postfix 中等效的 add_bcc(或 Exim 中“看不见的”路由器配置)相比,它仍然相当痛苦,但这就是 Sendmail 为您准备的。