Distribuisci più email ai provider di posta elettronica, ma senza mostrare favoritismi

4

Attualmente stiamo sviluppando un nuovo sistema di distribuzione della posta elettronica. Abbiamo il sistema attualmente configurato in modo che legga un record dal database e carichi il contenuto dell'email e lo distribuisca alla destinazione. Ora vogliamo spostarlo su più thread. Questo è facile, tranne che per colpire i provider di posta elettronica che restituiscono codici SMTP che si riferiscono a "Troppe connessioni" o "Connessione differita". La soluzione consiste nel disporre di un thread per aprire una connessione al provider di posta elettronica e distribuire le email n e quindi disconnettersi. Al momento abbiamo configurato l'applicazione in modo che supporti queste distribuzioni e-mail basate su sessione .

Il problema è questo, la tabella del database ha più indirizzi e-mail e non sono raggruppati dal provider di posta elettronica perché questo mostrerà favoritismi. Dobbiamo essere in grado di recuperare un determinato numero di, ad esempio Hotmail, e-mail (@ hotmail.com, @ hotmail.co.uk, @ live.co.uk) in modo da ridurre il numero di connessioni a Hotmail e ridurre il numero di rischi di ottenere l'errore "Troppe connessioni". Siamo al punto in cui siamo andati a girare in tondo cercando di ottenere una soluzione, quindi ho pensato di buttarlo là fuori e vedere se qualcuno ha qualche idea?

Modifica

Vorrei sottolineare che questa applicazione non è utilizzata a scopo di spam.

    
posta Neil Knight 20.10.2011 - 18:04
fonte

3 risposte

1

Nella tabella che contiene i messaggi che sono in coda, includerei anche un nome del fornitore analizzato (ad esempio, 'hotmail.com', 'yahoo.com') e un indicatore che indica se l'indirizzo email proviene da un Provider "di grandi dimensioni" (il cui significato esatto dipende da qualsiasi limite tu stia vedendo ora - se ci sono molti indirizzi email da un fornitore specifico, contrassegnali come bulk). Avere uno o più processi / thread funzionano con e-mail di provider non di massa e uno o più altri dedicati a un singolo fornitore di massa ciascuno.

Se si desidera richiamarli in ordine casuale, quando si accoda il messaggio aggiungere un numero casuale. Ordina per prima cosa quando estrai gli indirizzi per un determinato fornitore. In questo modo escono ogni volta in un ordine diverso.

    
risposta data 20.10.2011 - 20:18
fonte
0

Dividere e conquistare è certamente la strada da percorrere. Imposta una serie di code in cui ogni coda viene gestita da una connessione smtp a un singolo provider. Carica la lista di indirizzi per quel fornitore nella coda specifica e lascia che i messaggi vengano letti uno per uno. Se per un determinato provider / coda il numero di indirizzi è inferiore a una certa soglia, è possibile unirli e disporre di una connessione aggiuntiva (al fornitore aggiuntivo) per la coda specifica.

    
risposta data 20.10.2011 - 18:30
fonte
0

In pseudo-codice:

dictionary = Dictionary<Host, Queue<EmailMessage>>;
for each email message in original list:
   dictionary[host].Enqueue(message);

for (i in 1..number of threads):
    in a new thread:
        while (!queue.Empty):
            (host, messages) = dictionary.ReturnAndRemoveARandomItemAtomically();
            send the first X emails in messages to host
            if the message list isn't empty:
                dictionary[host] = messages
    
risposta data 20.10.2011 - 19:48
fonte

Leggi altre domande sui tag