nixp.ru v3.0

27 мая 2017,
суббота,
12:49:42 MSK

DevOps с компанией «Флант»
Longobard написал 27 марта 2004 года в 21:21 (468 просмотров) Ведет себя как мужчина; открыл 291 тему в форуме, оставил 2499 комментариев на сайте.

Нужно отправить на мыльник отчет из демона, написанного на С/С++. Есть ли для этого какие-либо функции? А если нету, то надо коннектицца с 110 портом того хоста, что после собаки стоит и писать ему в сокет письмецо?

anonymous

Почему на 110? Ты хотел сказать, на 25?

Можно использовать system() и какую-нибудь внешнюю программу, типа mail. Хотя, это некрасиво. Написать функцию для С несложно, только надо аккуратно с SMTP протоколом оюходиться. HELO там всякие посылать, точки где надо ставить, ответов дожидаться…

PS В перловке есть модуль специальный.

Good Luck,

UT

Longobard

А что за модуль? Можно ведьпросто скрипт перловый написть и через него скармливать.

Дмитрий Шурупов

> А что за модуль? Можно ведьпросто скрипт перловый написть и через него скармливать.

Самый простой — 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();
Longobard

Спасибо.

anonymous

А вот пример на сях. Заметь, эта прога отсылает отчет на ДРУГОЙ компьютер. Если демон должжен слать отчет на ту же машину, на которой он бегает, надо поменять 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

Longobard

UT сенькс