Visualizzazione risultati 1 fino 9 di 9

Discussione: Sendmail ultraleggero: funziona in windows ma non in linux

  1. #1
    Guest

    Predefinito Sendmail ultraleggero: funziona in windows ma non in linux

    Quando lavoravo su windows, usavo easyphp e per quanto riguarda le prove di invio email usavo un piccolo script che avevo preso da qui .

    Su windows funzionava che era una bellezza.. Qui su Linux non ne vuole sapere di funzionare. Ho provato ad emularlo con wine, ho provato a ricompilarlo ma non ce la faccio proprio dato che non ho conocescenze di linguaggio C .

    Nel contesto della discussione che vi ho linkato c'è anche qualche mio intervento in cui chiedo cosa devo fare per usarlo con linux ma sembra che la cosa non interessi a nessuno..

    Sendmail è decisamente piu invasivo rispetto a quello script, che è invece piccolo ed efficacissimo per gli esperimenti in locale.

    Ho cercato di compilarlo con GCC ma mi restituisce degli errori..

    Potreste darmi una mano a ricompilarlo (e farlo funzionare)?

  2. #2
    Guest

    Predefinito

    prima di tutto dovresti almeno dire che erori ricevi, altrimenti è dura...
    Secondo il compilatore per il C++ non è gcc, ma g++ e credo che per compilare basti

    Codice:
    g++ -o nome_eseguibile sorgente.cpp

  3. #3
    Guest

    Predefinito

    Pubblico qui il codice completo:
    Codice:
    #include <stdio.h>
    #include <string.h>
    
    bool isFileExist(char* nomefile) {
    	FILE *stream;
    	if ((stream=fopen(nomefile,"r"))!=NULL) {
    		return true;
    	} else {
    		return false;
    	}
    }
    
    void num2str(int num, char* str) {
    	if (num==0) strcpy(str,"0"); else strcpy(str,"");
    	while (num) {
    		switch (num % 10) {
    			case 0:
    				strcat(str,"0");
    				break;
    			case 1:
    				strcat(str,"1");
    				break;
    			case 2:
    				strcat(str,"2");
    				break;
    			case 3:
    				strcat(str,"3");
    				break;
    			case 4:
    				strcat(str,"4");
    				break;
    			case 5:
    				strcat(str,"5");
    				break;
    			case 6:
    				strcat(str,"6");
    				break;
    			case 7:
    				strcat(str,"7");
    				break;
    			case 8:
    				strcat(str,"8");
    				break;
    			case 9:
    				strcat(str,"9");
    				break;
    		}
    		num=(int) (num/10);
    	}
    	_strrev(str);
    }
    
    int main(int argc, char* argv[]) {
    	/* sendmail path file
    		Crea dei file al posto delle email. 
    		Path è il percorso assoluto della cartella dove mettere i file. Deve esistere. Se non specificato path="C:\".
    		File è il nome del file in cui inviare l'output. I file vengono automaticamente numerati.
    		 Se non specificato file="email".
    		p.e.
    			sendmail c:\mails\ mail
    			sendmail c:\mails\
    	*/
    	// Inizializzo le variabili
    	FILE *stream;
    	char buffer[81];
    	char nomefile[41];
    	char stringa[10];
    	int i=0,ch='a',j=0;
    	bool leggi=true;
    	// Inizializzo gli argomenti
    	switch (argc) {
    		case 1:
    			argv[1]="c:\\";
    		case 2:
    			argv[2]="email";
    	}
    	//Preparo il nomefile di output
    	do {
    		strcpy(nomefile,"");
    		strcat(nomefile,argv[1]);
    		strcat(nomefile,argv[2]);
    		num2str(j,stringa);
    		strcat(nomefile,stringa);
    		strcat(nomefile,".eml");
    		j++;
    	} while (isFileExist(nomefile));
    
    	//Apro il file di output
    	if ((stream=fopen(nomefile,"w"))!=NULL) {
    		while (!(((buffer[0]=='.')&&(buffer[1]=='\n'))||(ch == EOF))) {
    			// Prende massimo 80 byte alla volta
    			for(i=0;(i<79)&&((ch = getchar()) != EOF)&&(ch != '\n');i++) {
    				buffer[i] = (char) ch;
    			}
    			buffer[i++] = '\n'; // <= termine di riga
    			// Mette la riga nel file.
    			fwrite(buffer,sizeof(char),i,stream);
    		}
    		fclose(stream);
    	} else {
    		return 1;
    	}
    
    	return 0;
    }
    L'ho salvato come "sendmail.cpp" ed ho fatto:

    Codice:
    $ g++ -o sendmail sendmail.cpp
    sendmail.cpp: In function ‘void num2str(int, char*)’:
    sendmail.cpp:50: error: ‘_strrev’ was not declared in this scope
    Non so come si fa a dichiarare quello _strrev ..

  4. #4
    Guest

    Predefinito

    Citazione Originalmente inviato da attorianzo
    Non so come si fa a dichiarare quello _strrev ..
    quella funzione serve per invertire l'ordine dei caratteri di una stringa, il problema è la compatibilità - non è definita nella libreria standard del C (ho trovato «Compatibility: _strrev: DOS Windows 3.x Phar Lap/ DOSX Win32 _fstrrev: DOS Windows 3.x Phar Lap/ DOSX Win32»). L'unica soluzione, IMHO, è trovare la funzione equivalente definita nella libreria C o C++, e sostituire la chiamata.

  5. #5
    Guest

    Predefinito

    Acc... Io non so programmare C... Gente a nessuno di voi interessa questa cosa?

    Giuro l'avrei ridistribuito corretto io stesso se fossi stato in grado di modificarlo..

  6. #6
    Guest

    Predefinito

    scusa ma non puoi usare il normale sendmail di linux?
    comuqnue:
    Codice:
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using std::reverse;
    
    bool isFileExist(char* nomefile) {
    	FILE *stream;
    	if ((stream=fopen(nomefile,"r"))!=NULL) {
    		return true;
    	} else {
    		return false;
    	}
    }
    
    void num2str(int num, char* str) {
    	if (num==0) strcpy(str,"0"); else strcpy(str,"");
    	while (num) {
    		switch (num % 10) {
    			case 0:
    				strcat(str,"0");
    				break;
    			case 1:
    				strcat(str,"1");
    				break;
    			case 2:
    				strcat(str,"2");
    				break;
    			case 3:
    				strcat(str,"3");
    				break;
    			case 4:
    				strcat(str,"4");
    				break;
    			case 5:
    				strcat(str,"5");
    				break;
    			case 6:
    				strcat(str,"6");
    				break;
    			case 7:
    				strcat(str,"7");
    				break;
    			case 8:
    				strcat(str,"8");
    				break;
    			case 9:
    				strcat(str,"9");
    				break;
    		}
    		num=(int) (num/10);
    	}
    	reverse(str, str+strlen(str));
    }
    
    int main(int argc, char* argv[]) {
    	/* sendmail path file
    		Crea dei file al posto delle email. 
    		Path è il percorso assoluto della cartella dove mettere i file. Deve esistere. Se non specificato path="C:\".
    		File è il nome del file in cui inviare l'output. I file vengono automaticamente numerati.
    		 Se non specificato file="email".
    		p.e.
    			sendmail c:\mails\ mail
    			sendmail c:\mails\
    	*/
    	// Inizializzo le variabili
    	FILE *stream;
    	char buffer[81];
    	char nomefile[41];
    	char stringa[10];
    	int i=0,ch='a',j=0;
    	bool leggi=true;
    	// Inizializzo gli argomenti
    	switch (argc) {
    		case 1:
    			argv[1]="c:\\";
    		case 2:
    			argv[2]="email";
    	}
    	//Preparo il nomefile di output
    	do {
    		strcpy(nomefile,"");
    		strcat(nomefile,argv[1]);
    		strcat(nomefile,argv[2]);
    		num2str(j,stringa);
    		strcat(nomefile,stringa);
    		strcat(nomefile,".eml");
    		j++;
    	} while (isFileExist(nomefile));
    
    	//Apro il file di output
    	if ((stream=fopen(nomefile,"w"))!=NULL) {
    		while (!(((buffer[0]=='.')&&(buffer[1]=='\n'))||(ch == EOF))) {
    			// Prende massimo 80 byte alla volta
    			for(i=0;(i<79)&&((ch = getchar()) != EOF)&&(ch != '\n');i++) {
    				buffer[i] = (char) ch;
    			}
    			buffer[i++] = '\n'; // <= termine di riga
    			// Mette la riga nel file.
    			fwrite(buffer,sizeof(char),i,stream);
    		}
    		fclose(stream);
    	} else {
    		return 1;
    	}
    
    	return 0;
    }
    ho solo sostituito _strrev() con reverse() come diceva fgr.

  7. #7
    Guest

    Predefinito

    Grazie alla tua modifica viene compilato correttamente, eseguito direttamente funziona (nel senso che crea una email vuota) ma non sono riuscito a farlo funzionare con apache..

    Dicevi di sendmail.. Il problema è che il sendmail è un servizio sano, che deve essere caricato all'avvio del sistema... Questo qua invece era una script piccolo piccolo..

    Ho modificato in php.ini la riga così:

    Codice:
    ; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
    sendmail_path = /home/attorianzo/sendmail
    Non so perche non va... Qualcuno ha qualche idea?..


    EDIT : Funziona alla grande anche con LINUX ce l'ho FATTA!!!
    Ultima modifica di attorianzo : 01-03-2007 alle ore 16.48.34

  8. #8
    Guest

    Predefinito

    se come servizi hai già apache + php (forse anche un server mysql) non credo che aggiungere anche sendmail sia così tragico...comunque sia:
    Citazione Originalmente inviato da pagina linkata da te
    L'unica modifica da effettuare nel PHP.INI è sostituire:
    Codice:
    [mail function]
        ; For Win32 only.
        SMTP = localhost
        
        ; For Win32 only.
        sendmail_from = me@localhost.com
        
        ; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
        ;sendmail_path =
    o similare, con
    Codice:
    [mail function]
        sendmail_path = c:\mail\sendmail.exe c:\mail\

    dove "c:\mail\" è il percorso di dove avete copiato il "sendmail.exe".
    edit: ho visto solo ora il tuo edit

  9. #9
    Guest

    Predefinito

    Grazie di tutto soulhome.

    Ecco il tutto, con tanto di spiegazioni:
    Codice:
    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using std::reverse;
    
    /*
    #############	SCRIPT SENDMAIL MODIFICATO PER FUNZIONARE CON LINUX	###############
    
    COME SI USA:
    
    PRIMA DI TUTTO COPIATE QUESTO SCRIPT NELLA VOSTRA HOME:
    
    /home/nome_utente/
    
    QUINDI RICOMPILATE QUESTO SCRIPT FACENDO: 
    
    g++ -o sendmail sendmail.cpp
    
    AVETE COSI' OTTENUTO L'ESEGUIBILE. A QUESTO PUNTO MODIFICARE IL FILE PHP.INI IN QUESTO MODO:
    
    [mail function]
    ; For Win32 only.
    SMTP = localhost
    smtp_port = 25
    
    ; For Win32 only.
    ;sendmail_from = me@example.com
    
    ; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
    sendmail_path = /home/utente/sendmail /home/utente/email_sito/
    
    QUINDI CREARE LA CARTELLA 
    
    /home/utente/email_sito/
    
    
    E POI MODIFICARNE I PERMESSI FACENDO:
    
    chmod 777 /home/utente/email_sito/
    
    A QUESTO PUNTO OGNI VOLTA CHE DA APACHE MANDERETE UNA EMAIL, QUESTA LA RITROVERETE NELLA CARTELLA:
    
    /home/utente/email_sito
    
    */
    
    
    
    
    bool isFileExist(char* nomefile) {
    	FILE *stream;
    	if ((stream=fopen(nomefile,"r"))!=NULL) {
    		return true;
    	} else {
    		return false;
    	}
    }
    
    void num2str(int num, char* str) {
    	if (num==0) strcpy(str,"0"); else strcpy(str,"");
    	while (num) {
    		switch (num % 10) {
    			case 0:
    				strcat(str,"0");
    				break;
    			case 1:
    				strcat(str,"1");
    				break;
    			case 2:
    				strcat(str,"2");
    				break;
    			case 3:
    				strcat(str,"3");
    				break;
    			case 4:
    				strcat(str,"4");
    				break;
    			case 5:
    				strcat(str,"5");
    				break;
    			case 6:
    				strcat(str,"6");
    				break;
    			case 7:
    				strcat(str,"7");
    				break;
    			case 8:
    				strcat(str,"8");
    				break;
    			case 9:
    				strcat(str,"9");
    				break;
    		}
    		num=(int) (num/10);
    	}
    	reverse(str, str+strlen(str));
    }
    
    int main(int argc, char* argv[]) {
    	/* sendmail path file
    		Crea dei file al posto delle email. 
    		Path è il percorso assoluto della cartella dove mettere i file. Deve esistere. Se non specificato path="C:\".
    		File è il nome del file in cui inviare l'output. I file vengono automaticamente numerati.
    		 Se non specificato file="email".
    		p.e.
    			sendmail c:\mails\ mail
    			sendmail c:\mails\
    	*/
    	// Inizializzo le variabili
    	FILE *stream;
    	char buffer[81];
    	char nomefile[41];
    	char stringa[10];
    	int i=0,ch='a',j=0;
    	bool leggi=true;
    	// Inizializzo gli argomenti
    	switch (argc) {
    		case 1:
    			argv[1]="c:\\";
    		case 2:
    			argv[2]="email";
    	}
    	//Preparo il nomefile di output
    	do {
    		strcpy(nomefile,"");
    		strcat(nomefile,argv[1]);
    		strcat(nomefile,argv[2]);
    		num2str(j,stringa);
    		strcat(nomefile,stringa);
    		strcat(nomefile,".eml");
    		j++;
    	} while (isFileExist(nomefile));
    
    	//Apro il file di output
    	if ((stream=fopen(nomefile,"w"))!=NULL) {
    		while (!(((buffer[0]=='.')&&(buffer[1]=='\n'))||(ch == EOF))) {
    			// Prende massimo 80 byte alla volta
    			for(i=0;(i<79)&&((ch = getchar()) != EOF)&&(ch != '\n');i++) {
    				buffer[i] = (char) ch;
    			}
    			buffer[i++] = '\n'; // <= termine di riga
    			// Mette la riga nel file.
    			fwrite(buffer,sizeof(char),i,stream);
    		}
    		fclose(stream);
    	} else {
    		return 1;
    	}
    
    	return 0;
    }

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •