Задать вопрос
@Teoring

Как подключится и отправить письмо используя Postfix и Unix domain socket?

Мне удалось настроить сервер и реализовать отправку писем через TCP сокет (пишу на С++), но ввиду того что сервер будет только outgoing (входящих сообщений не предусмотрено) и в целях улучшения производительности (тысячи писем, сейчас что бы их отправить я форкаю процесс вызывая для каждого письма popen (sendmail)), мне необходимо реализовать подключение и отправку писем через unix domain socket. В документации я нашел инфу о том как переключить режим работы smtp с tcp в unix service type, много инфы о Policy server и другое, но мне не удалось понять где лежит этот самый Unix Domain Socket на файловой системе и как собственно говоря подключатся и отправлять письма?
  • Вопрос задан
  • 225 просмотров
Подписаться 1 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Teoring Автор вопроса
Я решил эту проблему.
После переключения Service Type в master.cf сокет появился по следующему пути
/var/spool/postfix/public/smpt

Код для подключения и отправки письма использовал следующий:
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <unistd.h>
#include <cstdlib>
#include <iostream>
#include <netdb.h>
#include <stdio.h>

#define DATA "Half a league, half a league . . ."

using namespace std;

#define HELO "HELO 192.168.1.1\r\n"
#define DATA "DATA\r\n"
#define QUIT "QUIT\r\n"


//#define h_addr h_addr_list[0]
//FILE *fin;
int sock;
struct sockaddr_un server;
struct hostent *hp, *gethostbyname();
char buf[BUFSIZ+1];
int len;
char *host_id="192.168.1.10";
char *from_id="rameshgoli@domain.com";
char *to_id="rameshgoli@domain.com";
char *sub="testmail\r\n";
char wkstr[100]="hello how r u\r\n";

/*=====Send a string to the socket=====*/

void send_socket(char *s)
{
    write(sock,s,strlen(s));
    write(1,s,strlen(s));
    //printf("Client:%s\n",s);
}

//=====Read a string from the socket=====*/

void read_socket()
{
    len = read(sock,buf,BUFSIZ);
    write(1,buf,len);
    //printf("Server:%s\n",buf);
}

/*=====MAIN=====*/
int main(int argc, char* argv[])
{

    /*=====Create Socket=====*/
    sock = socket(AF_UNIX, SOCK_STREAM, 0);;
    if (sock==-1)
    {  
        perror("opening stream socket");
        exit(1);
    }
    else
        cout << "socket created\n";

    /*=====Verify host=====*/
    server.sun_family = AF_UNIX;
    strcpy(server.sun_path, "/var/spool/postfix/public/smtp");

    if (connect(sock, (struct sockaddr *) &server, sizeof(struct sockaddr_un)) < 0) 
    {
          close(sock);
          perror("connecting stream socket");
          exit(1);
     }
    else
        cout << "Connected\n";
    /*=====Write some data then read some =====*/
    read_socket(); /* SMTP Server logon string */
    send_socket(HELO); /* introduce ourselves */
    read_socket(); /*Read reply */
    send_socket("MAIL FROM: "); 
    send_socket(from_id);
    send_socket("\r\n");
    read_socket(); /* Sender OK */
    send_socket("VRFY ");
    send_socket(from_id);
    send_socket("\r\n");
    read_socket(); // Sender OK */
    send_socket("RCPT TO: "); /*Mail to*/
    send_socket(to_id);
    send_socket("\r\n");
    read_socket(); // Recipient OK*/
    send_socket(DATA);// body to follow*/
    send_socket("Subject: ");
    send_socket(sub);
    read_socket(); // Recipient OK*/
    send_socket(wkstr);
    send_socket(".\r\n");
    read_socket(); 
    send_socket(QUIT); /* quit */
    read_socket(); // log off */

    //=====Close socket and finish=====*/
    close(sock);
    exit(0);
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы