Longobard
			
				написал 27 марта 2004 года в 21:21 (1570 просмотров)
			
			
			Ведет себя
			 как мужчина; открыл 291 тему в форуме, оставил 2499 комментариев на сайте.			
	
	Нужно отправить на мыльник отчет из демона, написанного на С/С++. Есть ли для этого какие-либо функции? А если нету, то надо коннектицца с 110 портом того хоста, что после собаки стоит и писать ему в сокет письмецо?
Последние комментарии
-   OlegL, 17 декабря 2023 года в 15:00            →
        
        
            Перекличка
            21 OlegL, 17 декабря 2023 года в 15:00            →
        
        
            Перекличка
            21
-   REDkiy, 8 июня 2023 года в 9:09            →
        
        
            Как «замокать» файл для юниттеста в Python?
            2 REDkiy, 8 июня 2023 года в 9:09            →
        
        
            Как «замокать» файл для юниттеста в Python?
            2
-   fhunter, 29 ноября 2022 года в 2:09            →
        
        
            Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
            6 fhunter, 29 ноября 2022 года в 2:09            →
        
        
            Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt?
            6
-   Иванн, 9 апреля 2022 года в 8:31            →
        
        
            Ассоциация РАСПО провела первое учредительное собрание
            1 Иванн, 9 апреля 2022 года в 8:31            →
        
        
            Ассоциация РАСПО провела первое учредительное собрание
            1
-   Kiri11.ADV1, 7 марта 2021 года в 12:01            →
        
        
            Логи catalina.out в TomCat 9 в формате JSON
            1 Kiri11.ADV1, 7 марта 2021 года в 12:01            →
        
        
            Логи catalina.out в TomCat 9 в формате JSON
            1
 DevOps as a Service from Palark
DevOps as a Service from Palark
	24/7 SRE & DevOps service to cover all your Kubernetes needs.


 
							
Почему на 110? Ты хотел сказать, на 25?
Можно использовать system() и какую-нибудь внешнюю программу, типа mail. Хотя, это некрасиво. Написать функцию для С несложно, только надо аккуратно с SMTP протоколом оюходиться. HELO там всякие посылать, точки где надо ставить, ответов дожидаться…
PS В перловке есть модуль специальный.
Good Luck,
UT
А что за модуль? Можно ведьпросто скрипт перловый написть и через него скармливать.
> А что за модуль? Можно ведьпросто скрипт перловый написть и через него скармливать.
Самый простой — MIME::Lite.
Упомянутый как-то в форуме senddfbymail как раз этим занимается…
Примерный кусок кода:
use MIME::Lite; my $msg = MIME::Lite->new( From => $from, To => $email, Subject => $file, Type => 'multipart/mixed' ); $msg->attach( Type => 'text/plain', Data => "Some text." ); $msg->attach( Type => 'application/*', Path => $path, Filename => $file ); MIME::Lite->send("sendmail", $sendmail); $msg->send();Спасибо.
А вот пример на сях. Заметь, эта прога отсылает отчет на ДРУГОЙ компьютер. Если демон должжен слать отчет на ту же машину, на которой он бегает, надо поменять AF_INET на AF_LOCAL, тогда не будет заморочек с FQDN в MAIL FROM:
В принципе, ответы сервера можно игнорировать, я их вставил для дебага. Прога сразу будет в три раза короче.
#include #include #include #include #include #include using namespace std; int main() { int sockfd, numbytes; const int MAXDATASIZE = 120; char buf1[MAXDATASIZE]; string header,message="test message from daemon\n", dot = ".\n"; struct sockaddr_in their_addr; //where to send int yes=1; sockfd = socket(AF_INET, SOCK_STREAM, 0); setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)); their_addr.sin_family = AF_INET; their_addr.sin_port = htons(25); // SMTP their_addr.sin_addr.s_addr = inet_addr("192.168.0.2"); memset(&(their_addr.sin_zero), '\0', 8); // zero the rest of the struct if(connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) ==0) { numbytes=recv(sockfd, buf1, MAXDATASIZE-1, 0); cout << "Connected!\n"; } else cout << "Can't connect\n"; if(numbytes > 0) { cout << "Server says:\n"; for(int i=0;i cout << buf1[i]; }; header = "HELO localhost.localdomain\n"; send(sockfd, header.c_str(),header.length(), 0); numbytes=recv(sockfd, buf1, MAXDATASIZE-1, 0); if(numbytes > 0) { cout << "Server says:\n"; for(int i=0;i cout << buf1[i]; }; header = "MAIL FROM:gbush@whitehouse.gov\n"; //needs FQDN send(sockfd, header.c_str(),header.length(), 0); numbytes=recv(sockfd, buf1, MAXDATASIZE-1, 0); if(numbytes > 0) { cout << "Server says:\n"; for(int i=0;i cout << buf1[i]; }; header = "RCPT TO:root@localhost.localdomain\n"; send(sockfd, header.c_str(),header.length(), 0); numbytes=recv(sockfd, buf1, MAXDATASIZE-1, 0); if(numbytes > 0) { cout << "Server says:\n"; for(int i=0;i cout << buf1[i]; }; header = "DATA\n"; send(sockfd, header.c_str(),header.length(), 0); numbytes=recv(sockfd, buf1, MAXDATASIZE-1, 0); if(numbytes > 0) { cout << "Server says:\n"; for(int i=0;i cout << buf1[i]; }; send(sockfd, message.c_str(),message.length(), 0); send(sockfd, dot.c_str(),dot.length(), 0); numbytes=recv(sockfd, buf1, MAXDATASIZE-1, 0); if(numbytes > 0) { cout << "Server says:\n"; for(int i=0;i cout << buf1[i]; }; header = "QUIT\n"; send(sockfd, header.c_str(),header.length(), 0); numbytes=recv(sockfd, buf1, MAXDATASIZE-1, 0); if(numbytes > 0) { cout << "Server says:\n"; for(int i=0;i cout << buf1[i]; }; close(sockfd); return 0; };Good Luck,
UT
UT сенькс