The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Использование Milter API в sendmail для дублирования исходящей почты (mail copy milter sendmail)


<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>
Ключевые слова: mail, copy, milter, sendmail,  (найти похожие документы)
From: SaneK <sanek@xxxxx> Newsgroups: email Date: Mon, 9 Dec 2003 14:31:37 +0000 (UTC) Subject: Использование Milter API в sendmail для дублирования исходящей почты Введение Во многих форумах встречаются треды с вопросом: "Как настроить систему копирования почты?" Одним из вариантов реализации такой системы - это использование sendmail в связке с Procmail, второй это использование дополнительного мэйлера на базе самого sendmail. Не один из этих методов нельзя однозначно назвать хорошим, так же как и метод который будет описан в этой статье (мнение автора). Данная статья не претендует на оригинальность и данный метод не является "ноу-хау", но все же подробные описания двух перечисленных выше методов имеются, а вот использование Milter API как то позабыли. Подробнее о Milter API можно почитать на http://www.milter.org Итак приступим: При тестировании использовалась система FreeBSD 5.1-Relese и sendmail 8.12.9. Для реализации фильтра использовался язык Си, ниже приведен код фильтра: ----cpmail.c---- #include <sys/types.h> #include <errno.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include "libmilter/mfapi.h" #define CP_FROM //Адрес на который будет дублироваться почта #define copy_to_addr "user@domain.ru" //Файл содержащий e-mail адреса, исходящую //почту с который необходимо дублировать #define conf_file "/etc/mail/sm_copy_users" // #define log_file "/var/log/copy_mail.log" typedef struct { char *e_mail; struct copy_users *next; } copy_users; copy_users *cp_users; int copy; void get_cp_users() { char line[256]; copy_users *tmp, *head; FILE *file; cp_users = malloc(sizeof(copy_users)); cp_users -> next = NULL; head = cp_users; if(!(file = fopen(conf_file,"r"))) { fprintf(stderr,"Can't open config file: %s\nError: %s\n",conf_file, strerror(errno)); exit(1); } while(fgets(line,sizeof(line),file) != NULL) { //Ignore '#' character if(strncmp(line, "#", 1) == 0) continue; cp_users -> e_mail = (char *)malloc(strlen(line)); bzero(cp_users -> e_mail, strlen(line)); strncpy(cp_users -> e_mail, line, strlen(line) - 1); tmp = cp_users; cp_users = malloc(sizeof(copy_users)); cp_users -> next = NULL; (copy_users *)tmp -> next = cp_users; } fclose(file); cp_users = head; } int user_in(char *e_mail) { int res = 0; copy_users *tmp; tmp = cp_users; while(tmp -> next != NULL) { if(strstr(e_mail, tmp -> e_mail) != NULL) { res = 1; break; } tmp = (copy_users *)tmp -> next; } return res; } sfsistat mlfi_header(SMFICTX *ctx, char *headerf, char *headerv) { return SMFIS_CONTINUE; } sfsistat mlfi_envfrom(SMFICTX *ctx, char **argv) { #ifdef CP_FROM if(user_in(argv[0])) { copy = 1; } else copy = 0; #endif return SMFIS_CONTINUE; } sfsistat mlfi_close(SMFICTX *ctx) { return SMFIS_ACCEPT; } sfsistat mlfi_eom(SMFICTX *ctx) { if(copy) smfi_addrcpt(ctx, copy_to_addr); return SMFIS_CONTINUE; } struct smfiDesc copy_mail_filter = { "CopyOutgoingMail", //Filter name SMFI_VERSION, SMFIF_ADDRCPT, // This filter may add recipients NULL, //Connection info filter NULL, //SMTP HELO command filter mlfi_envfrom, //Message from NULL, //Message To mlfi_header, //Header filter. Neeed for change header. NULL, NULL, mlfi_eom, //End of message NULL, mlfi_close }; int main(int argc, char *argv[]) { get_cp_users(); (void) smfi_setconn("inet:999@localhost"); if (smfi_register(copy_mail_filter) == MI_FAILURE) { fprintf(stderr,"smfi_register_failed\n"); exit(1); } return smfi_main(); } ---end of cpmail.c--- Компилируется следующим образом: #gcc -Wall -o cpmail cpmail.c /usr/lib/libmilter.a -pthread И запускается: #cd dir #./cpmail & Т.о. наша программа будет слушать 999 порт на который sendmail'ом будет передаваться необходимая нам информация. Для того что бы это дело заработало необходимо в sendmail.mc внести следующие изменения и пересобрать sendmail.cf: INPUT_MAIL_FILTER(`copy_mail_filter', `S=inet:999@localhost') define(`confINPUT_MAIL_FILTERS', `copy_mail_filter') Далее перезапустить sendmail (killall -HUP sendmail). Вот и все, дублирование исходящей почты работает. PS/ При желании можно внести небольшие изменения в код фильтра и организовать систему управления почтой "заточенную" под конкретную конфигурацию.

<< Предыдущая ИНДЕКС Поиск в статьях src Установить закладку Перейти на закладку Следующая >>

Обсуждение [ RSS ]
  • 1.2, Ash (?), 11:11, 12/12/2003 [ответить]  
  • +/
    Очень приличный Милтер для копирования всей почты, даже с некоторыми полезностями я взял на
    http://www.modulo.ro/synonym/
    Мне нравится.
     
     
  • 2.3, Denis (?), 13:33, 22/12/2003 [^] [^^] [^^^] [ответить]  
  • +/
    а как в нем исключение сделать?
    например у меня .* но кроме некоторых адресов (например кроме сообщений от logwatch)
     

  • 1.4, Andrew_Procerov (ok), 11:51, 23/10/2005 [ответить]  
  • +/
    У меня при компиляции выдает
    cpmail.c:56: warning: use of cast expressions as lvalues is deprecated

    При этом запускается и начмнает работать, но пробует копировать абсолютно всю почту, как входящую, так и исходящую.

     
     
  • 2.5, Evgeniy (??), 18:43, 28/12/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >У меня при компиляции выдает
    >cpmail.c:56: warning: use of cast expressions as lvalues is deprecated
    >
    >При этом запускается и начмнает работать, но пробует копировать абсолютно всю почту,
    >как входящую, так и исходящую.

    У меня тоже самое, ты разобрался как это решить, напиши пожалуйста мне moroz_es@26-12online.kiev.ua


     

  • 1.6, Аноним (-), 11:43, 06/03/2009 [ответить]  
  • +/
    Короч, мейлсканер рулит, есть опция Archive mail.
    элементарный <конф>.rules и все (или не все) копируется, пересылается и т.п.
    Как? Вы еще mailscanner не юзаете? Скажите что и про mailwatch не слышали!!
     

    игнорирование участников | лог модерирования

     Добавить комментарий
    Имя:
    E-Mail:
    Заголовок:
    Текст:




    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру