PDA

View Full Version : [C] Test del mail server con comando mail


Manugal
10-04-2010, 16:24
Ciao a tutti!

Sono diversi giorni che sto cercando di risolvere questo problema e ancora non ci riesco. Ho scritto un mail server in C che funziona bene con un client di posta tradizionale, tipo Thunderbird e funziona anche tramite una sessione telnet. Non riesco a farlo funzionare tramite mail+Postfix. Non so neanche se sono nella sezione giusta, sto cercando di capire se è un problema di mail o del mio mail server.

Ho configurato il file main.cf in questo modo:


relayhost = [myMailServer.localhost]
smtp_sasl_auth_enable = no
smtp_use_tls = no
disable_dns_lookups=yes
smtp_never_send_ehlo = yes


Poi spedisco la mail in questo modo:

manugal@manugal-desktop:~$ mail -v -s "Subject" Manugal@myMailServer.localhost
Hello world!
.
EOT
Mail Delivery Status Report will be mailed to <manugal>.
manugal@manugal-desktop:~$


E la mail non arriva. Andando a vedere il file mail.log mi accorgo che non riceve risposta a seguito del comando HELO, il che è strano perché provandolo anche con gdb la risposta 250 viene spedita:

Apr 10 12:11:58 manugal-desktop postfix/master[2756]: daemon started -- version 2.7.0, configuration /etc/postfix
Apr 10 12:12:05 manugal-desktop postfix/pickup[2758]: 5F94C21B28: uid=1000 from=<manugal>
Apr 10 12:12:05 manugal-desktop postfix/cleanup[2763]: 5F94C21B28: message-id=<20100410101205.5F94C21B28@manugal-desktop.localdomain>
Apr 10 12:12:05 manugal-desktop postfix/qmgr[2759]: 5F94C21B28: from=<manugal@manugal-desktop.localdomain>, size=488, nrcpt=1 (queue active)
Apr 10 12:12:05 manugal-desktop postfix/smtp[2765]: < myMailServer.localhost[192.168.1.11]:25: 220 myMailServer.localhost SMTP Service ready
Apr 10 12:12:05 manugal-desktop postfix/smtp[2765]: > myMailServer.localhost[192.168.1.11]:25: HELO manugal-desktop.localdomain
Apr 10 12:12:05 manugal-desktop postfix/smtp[2765]: < myMailServer.localhost[192.168.1.11]:25:
Apr 10 12:12:58 manugal-desktop postfix/qmgr[2759]: warning: private/smtp socket: malformed response
...


Non so più che fare. :cry:

Manugal
11-04-2010, 10:27
Ho provato per scrupolo ad inviare come risposta la stringa "\r\n250 OK\r\n" (quindi un codice di risposta 250 preceduto dal CRLF). Ora sembra che la risposta arrivi correttamente a Postfix. Questo infatti è il mail.log:


Apr 10 22:05:36 manugal-desktop postfix/pickup[2846]: 70F9E21BDD: uid=1000 from=<manugal>
Apr 10 22:05:36 manugal-desktop postfix/cleanup[2859]: 70F9E21BDD: message-id=<20100410200536.70F9E21BDD@manugal-desktop.localdomain>
Apr 10 22:05:36 manugal-desktop postfix/qmgr[2847]: 70F9E21BDD: from=<manugal@manugal-desktop.localdomain>, size=488, nrcpt=1 (queue active)
Apr 10 22:05:40 manugal-desktop postfix/smtp[2850]: < myMailServer.localhost[192.168.1.11]:25: 220 myMailServer.localhost SMTP Service ready
Apr 10 22:05:40 manugal-desktop postfix/smtp[2850]: > myMailServer.localhost[192.168.1.11]:25: HELO manugal-desktop.localdomain
Apr 10 22:05:46 manugal-desktop postfix/smtp[2850]: < myMailServer.localhost[192.168.1.11]:25:
Apr 10 22:05:46 manugal-desktop postfix/smtp[2850]: < myMailServer.localhost[192.168.1.11]:25: 250 OK
Apr 10 22:05:46 manugal-desktop postfix/smtp[2850]: server features: 0x1000 size 0
Apr 10 22:05:46 manugal-desktop postfix/smtp[2850]: > myMailServer.localhost[192.168.1.11]:25: MAIL FROM:<manugal@manugal-desktop.localdomain>
...


Comunque è un comportamento strano; non capisco perché gli devo spedire due volte \r\n.

Manugal
12-04-2010, 17:50
Consultandomi sulla mailing list di Postfix, mi è stato detto che il problema è dovuto al fatto che quando spedisco la risposta, Postfix riceve \r\n\0 (mentre dovrebbe ricevere solo \r\n). Io per spedire le risposte chiamo la send in questo modo:

send(SMTPSocket,session->reply,strlen(session->reply));

Visto che chiamo strlen(session->reply), com'è possibile che gli spedisce anche \0?

cionci
12-04-2010, 18:10
Magari gli manca proprio \r\n ?

Manugal
12-04-2010, 18:27
No c'è \r\n, l'ho visto tramite tcpdump. Il problema è che io gli mando ad esempio "250 OK\r\n" ma lui riceve "250 OK\r\n\0".

Manugal
12-04-2010, 18:31
Non si sa perché ora riceve correttamente i comandi, senza aver toccato nulla. Forse non accorgendomi ho cambiato qualcosa e ora va.

cionci
12-04-2010, 18:33
Ma che riceva anche \0 è una certezza o una supposizione ?
Non è che magari c'è una send successiva ? Prova a fermarti con il debbuger subito dopo la send.

Manugal
12-04-2010, 18:40
Evidentemente la colpa era di questa send:

send(tArgs->SMTPSocket,"220 myMailServer.localhost SMTP Service ready\r\n",48,0);

Modificandola a:

send(tArgs->SMTPSocket,"220 myMailServer.localhost SMTP Service ready\r\n",47,0);

Funziona.

Di conseguenza ho modificato tutte le send in modo tale che spediscano esattamente la lunghezza della stringa (quindi strlen() ).