А в пакетах нет ничего взамен?
НЕ формирует FROM ни из тела ни из -f - берет только последний параметр который по совместительству является еще и To:, таким образом можно послать только на адрес отправителя =(
То что -f попадает только в заголовок мыла в Received: (from ...
Еще особенность, возможно связанная с работой smtp.mail.ru, но все же...
то что попало в MAIL FROM проверяется сервером на соответстве том утчо в поле From: указано, причем принимается даже если адрес в формате "имя <мыло>", однако при указании -t в RCPT TO: если в To: указан в таком же виде сформированный аддрес то сервер дает отбивку, мол неверный адрес...
Last edited by Duke; 20-10-2006 at 11:46.
А в пакетах нет ничего взамен?
В пакетах много чего есть, но зачем е.. пардон, занимать память если есть встроенная мыльницца? :d
Ща попробую в сырцах откопать...
Last edited by Duke; 20-10-2006 at 20:45.
Вот дифф для
broadcom\src\router\sendmail\mini_sendmail.c
P.S. Полусотнями строк выше from присваивается не зависимо от того, продефайнлен ли WL600 или инет - значит тут явный баг был. Вообще непотянтно кто такой WL600 и зачем для него такие извраты, возможно бужет достаточно просто погасить этот флаг в Makefile. WL-600g кажется вышел мног опозже чем GPL1927 от сентября 2005 коим датированв 1.9.2.7 где я серцы и выкопал...Code:216c216 < (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", argv[argn]); --- > (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", from);
P.P.S. в 1.9.6.9 та же багофича =(
Last edited by Duke; 21-10-2006 at 04:42.
Попробовал пересобрать и так и эдак. Елси погасить дефайн WL600 то наглухо виснет при отсылке, а если from прописать там где надо вместо argv[argn] то все шоколадно
Итоговый дифф:
Надеюсь в следующий билд попадетCode:215,217d214 < #ifdef WL600 < (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", argv[argn] ); < #else 219d215 < #endif
Тогда diff неплохо бы с ключём -u сделать.
Code:--- mini_sendmail.c.orig 2006-10-21 18:19:59 +0400 +++ mini_sendmail.c 2006-10-21 18:20:35 +0400 @@ -212,11 +212,7 @@ exit( 1 ); } -#ifdef WL600 - (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", argv[argn] ); -#else (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", from ); -#endif send_command( buf ); status = read_response(); if ( status != 250 )
ок, теперь ясно. вот только вопрос - а штатные функции не испортятся?
А это и есть единственные штатная функция - посылка мыла...
Раньше забивалось на наличие -f и все отсылалось от имени первого получателя в списке. Теперь отсылается от WL600@MAILER либо от указанного в -f. Там просто явный глюк в этом месте был, чего добиться хотели мне непонятно - сначала формируют from а потом про него забывают как будто. Где в роутере этот минисендмыл вызывается я если честно не вижу
Last edited by Duke; 21-10-2006 at 18:42.
Вызывается из rc/sendalarm.c:
sprintf(command, "cat /var/tmp/alarmmail | mini_sendmail -s%s %s", serverip, nvram_safe_get("usb_websendto_x"));
Отправитель - последний аргумент, да и судя по исходникам, так и есть. Не работает так?
WL600 - это так называлось всё семейство WL500G, венчать его должен был двухдиапазонный роутер WL600, но этого так и не произошло.
А где эта хрень здается в веб-интерфейсе %)
Это будет работать при условии что SMTP-сервер принимает не только входящие от локальных адресов (тобишь релеем работает). smtp.mail.ru например не принимает. Чтоб сработало так же безусловно надо сделать
sprintf(command, "cat /var/tmp/alarmmail | mini_sendmail -f%s -s%s %s", nvram_safe_get("usb_websendto_x"), serverip, nvram_safe_get("usb_websendto_x"));
т.е. сам себе.
это наврено фишка , чтоб отправлять кардры с вебкамеры, когда срабатывает детектор движения....
только я пробывал ставить smtp провайдера - не работает
а другой smtp трафик провайдер режет
может там еще порт smtp указывать? т.к. в гугл smtp вроде отличается порт от стандартных
Вот как сделал:
Т.е., если есть -f, то он используется, иначе, как было.Code:--- router/sendmail/mini_sendmail.c 2004-11-11 10:32:18.000000000 +0300 +++ gateway/sendmail/mini_sendmail.c 2006-10-21 22:38:22.607725832 +0400 @@ -164,7 +164,11 @@ #endif if ( fake_from == (char*) 0 ) +#ifdef WL600 + (void) snprintf( from, sizeof(from), "%s", argv[argn]); +#else (void) snprintf( from, sizeof(from), "%s@%s", username, hostname ); +#endif else if ( strchr( fake_from, '@' ) == (char*) 0 ) (void) snprintf( from, sizeof(from), "%s@%s", fake_from, hostname );@@ -212,11 +216,7 @@ exit( 1 ); } -#ifdef WL600 - (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", argv[argn]); -#else (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", from ); -#endif send_command( buf ); status = read_response(); if ( status != 250 )
Угу, пойдет.
Я бы еще злобнее подрезал там где он хостнейм и юзернейм тянет...
Code:--- mini_sendmail.c.orig 2006-10-21 18:19:59 +0400 +++ mini_sendmail.c 2006-10-21 22:50:49 +0400 @@ -134,11 +134,7 @@ ++argn; } -#ifndef WL600 username = getlogin(); -#else - username = "WL600"; - //fprintf(stderr, "%s\n", username); #endif if ( username == (char*) 0 ) { @@ -156,15 +152,15 @@ #endif /* DO_GETPWUID */ } -#ifndef WL600 if ( gethostname( hostname, sizeof(hostname) - 1 ) < 0 ) show_error( "gethostname" ); -#else - strcpy(hostname,"MAILER"); -#endif if ( fake_from == (char*) 0 ) +#ifdef WL600 + (void) snprintf( from, sizeof(from), "%s", argv[argn]); +#else (void) snprintf( from, sizeof(from), "%s@%s", username, hostname ); +#endif else if ( strchr( fake_from, '@' ) == (char*) 0 ) (void) snprintf( from, sizeof(from), "%s@%s", fake_from, hostname ); @@ -212,11 +208,7 @@ exit( 1 ); } -#ifdef WL600 - (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", argv[argn] ); -#else (void) snprintf( buf, sizeof(buf), "MAIL FROM:<%s>", from ); -#endif send_command( buf ); status = read_response(); if ( status != 250 )
Сделал так.