PDA

Visualizza la versione completa : [DELPHI] Invio di email con Indy e rifiuto da server SMTP


firefox88
22-11-2006, 13:34
Salve,

premetto che non sono uno spammer e non voglio diventarlo.

Ho letto svariati tutorial sull'uso di Indy per l'invio di messaggi e-mail: il problema è che alcuni server SMTP si rifiutano di consegnare le e-mail che gli invio, molto probabilmente per via dei loro (stupidi) filtri anti-spam.

In particolare, mail.libero.it (che utilizzo normalmente con Microsoft Outlook e Mozilla Thunderbird), si rifiuta categoricamente di inviare le mie e-mail. O meglio, non dà alcun messaggio d'errore, ma poi la mail non viene consegnata.

Esiste un modo, con Indy, per inviare un messaggio e-mail in modo che non sia distinguibile da quello inviato da un normale client di posta (leggi Thunderbird o Outlook).

Capisco che la mia è una domanda da spammer, ma vi assicuro che gli spammer sanno già come fare e non hanno bisogno di chiedere su un forum. Come al solito queste misure di sicurezza svantaggiano gli utenti "buoni".

Grazie in anticipo :)

alka
22-11-2006, 21:25
Non ho avuto problemi di questo tipo nell'invio di email.

Come hai configurato il componente? :master:

firefox88
22-11-2006, 22:11
Originariamente inviato da alka
Non ho avuto problemi di questo tipo nell'invio di email.

Come hai configurato il componente? :master:



object SMTP: TIdSMTP
MailAgent = 'Mozilla Thunderbird 1.5.0.8 (Windows/20061025)'
UseEhlo = False
SASLMechanisms = <>
Host = 'mail.libero.it'
end

object MailMessage: TIdMessage
AttachmentEncoding = 'MIME'
ContentType = 'multipart/alternative'
Encoding = meMIME
ConvertPreamble = True
Left = 448
Top = 8
end

Tutte le altre impostazioni come da default.


Per l'invio dell'e-mail:


//setup mail message
MailMessage.From.Address := ...
MailMessage.From.Name := ...
MailMessage.Recipients.EMailAddresses := ...
MailMessage.Subject := 'Oggetto';
MailMessage.Body.Text := 'Questo è un messaggio HTML!';
lTextPart := TIdText.Create(MailMessage.MessageParts);
lTextPart.Body.Text := '<html><body>Prova per l''invio di un e-mail!</body></html>';
lTextPart.ContentType := 'text/html';

try
try
SMTP.Connect;
SMTP.Send(MailMessage);
except on e : Exception do
// Riporta eccezione
end;
finally
if SMTP.Connected then SMTP.Disconnect;
end;


Mi sembrano tutte cose normali... Ma Libero la pensa diversamente!

alka
22-11-2006, 22:20
Ad ogni modo, in genere l'esclusione per filtri antispam si basa su black list di indirizzi: significa che il problema non è necessariamente nel messaggio, ma dipende dall'indirizzo IP della macchina che provvede al suo invio.

L'ideale è procurarsi un server SMTP personalizzato o acquistare un servizio analogo e affidabile su Internet per lo smistamento dei messaggi.

Ciao! :ciauz:

firefox88
22-11-2006, 22:23
Originariamente inviato da alka
Ad ogni modo, in genere l'esclusione per filtri antispam si basa su black list di indirizzi: significa che il problema non è necessariamente nel messaggio, ma dipende dall'indirizzo IP della macchina che provvede al suo invio.

L'ideale è procurarsi un server SMTP personalizzato o acquistare un servizio analogo e affidabile su Internet per lo smistamento dei messaggi.

Ciao! :ciauz:

La macchina è la mia, e con altri client di posta i messaggi vengono accettati. Non credo che il problema sia al livello di IP, ma al livello di headers.

alka
22-11-2006, 22:34
Originariamente inviato da firefox88
La macchina è la mia
Sì, appunto. Occorre vedere quale indirizzo IP hai.


Originariamente inviato da firefox88
e con altri client di posta i messaggi vengono accettati. Non credo che il problema sia al livello di IP, ma al livello di headers.
Non ti accetta alcun messaggio, oppure solo alcuni e altri no?

La proprietà Recipients è inizializzata correttamente?

firefox88
23-11-2006, 11:02
La proprietà Recipients è inizializzata correttamente?

Bravo! Era proprio questo il problema. Al destinatario non era associato un "nome", e quello, evidentemente, era un comportamento spammer-like.

Così va alla grande.



with MailMessage.Recipients.Add do
begin
Name := 'Nome del destinatario';
Address := 'email@del.destinatario';
end;


Basta... Ero stanco di essere trattato come uno spammer! :)

alka
23-11-2006, 13:50
Originariamente inviato da firefox88
Bravo! Era proprio questo il problema. Al destinatario non era associato un "nome", e quello, evidentemente, era un comportamento spammer-like.
Buono a sapersi... :)

firefox88
24-11-2006, 09:48
Ora il problema è risolto, ma non è escluso che si ripresenti. Questo per via della natura "semplificata" dei componenti Indy.

Come faccio a inviare una e-mail in modalità, per così dire, "raw", cioè scrivendo gli header a mano, inserendo i boundaries e i blocchi di dati a mano, ecc...?

alka
24-11-2006, 11:24
Originariamente inviato da firefox88
Ora il problema è risolto, ma non è escluso che si ripresenti. Questo per via della natura "semplificata" dei componenti Indy.
La natura non è "semplificata", ma solamente "wrappata".


Originariamente inviato da firefox88
Come faccio a inviare una e-mail in modalità, per così dire, "raw", cioè scrivendo gli header a mano, inserendo i boundaries e i blocchi di dati a mano, ecc...?
Beh, evita l'uso dei componenti Indy e scrivi i dati nel formato che preferisci direttamente sul socket.

Voglio dire, se devi gestire autonomamente tutto ciò che fanno i componenti Indy, tanto vale non utilizzarli, giusto?

In ogni caso, le proprietà definite dal componente, come dicevo all'inizio, ricoprono tutte le caratteristiche del messaggio così come previsto dalla RFC; a questo punto, se il server di destinazione rifiuta un messaggio per mancanza di un dato, il problema non è nel codice che lo prepara ma nel dato stesso che non viene fornito... non so se mi spiego.

Io accerterei - aiutandomi con la documentazione ufficiale - dell'effettivo problema che si è verificato e poi agirei di conseguenza, per evitare di "reinventare la ruota" senza ottenere una effettiva soluzione definitiva.

Ciao! :ciauz:

Loading