2010-03-10 17 views
6

Muszę wysłać dużo wiadomości e-mail (prawdopodobnie setki dziennie) na podstawie harmonogramu. Sposób, w jaki myślę to zrobić, jest następujący, ale problem polega na tym, że moje pole Ciało może stać się bardzo duże, a jeśli dodaję je jako ciąg staje się brzydkie.Właściwy sposób wysyłania wiadomości e-mail z usługi Windows

 SmtpClient client = new SmtpClient(); //host and port picked from web.config 
     client.EnableSsl = true; 

     MailMessage message = new MailMessage(); 

     message.Body = "test from winservice"; // HERE IS MY PROBLEM 
     message.IsBodyHtml = true; 
     message.From = new MailAddress("[email protected]"); 
     message.Subject = "My subject"; 
     message.To.Add(new MailAddress("[email protected]")); 
     try 
     { 
      client.Send(message); 
     } 
     catch (Exception) 
     { 

     } 

kiedy miałem to zrobić od strony aspx użyłem

MailDefinition message = new MailDefinition(); 

    message.BodyFileName = @"~\EmailTemplate\Template1.htm"; 
    ListDictionary replacements = new ListDictionary(); 
    replacements.Add("<% Name %>", this.txtName.Text); 
    replacements.Add("<% PhoneOrEmail %>", this.txtPhoneOrEmail.Text); 
    replacements.Add("<% Message %>", this.txtMessage.Text); 
    MailMessage msgHtml = message.CreateMailMessage(RECIPIENTS, replacements, new LiteralControl()); 

myślę, że to eleganckie rozwiązanie, ale nie chcę, aby odwołać się do System.Web.UI.WebControls.MailDefinition ponieważ jestem w winservice.

Moje pytania są następujące:

  1. Jaki jest najlepszy sposób do masowego wysyłania wiadomości e-mail z winservice ?
  2. Czy można wysyłać je z konta gmail ? czy po jakimś czasie zablokują mnie po ?

dzięki za pomoc.

+0

wierzę GMail ma limit 500 odbiorców w ciągu 24 godz. Jednak zniechęciłbym do korzystania z Gmaila w przypadku masowych wiadomości e-mail; może to naruszyć ich TOS. –

+0

Dzięki Ryan, Oto post, który wyjaśni to bardziej szczegółowo: http://www.labnol.org/internet/email/gmail-daily-limit-sending-bulk-email/2191/ Zgaduję więc, że będzie musiał przestać używać Gmaila do wysyłania e-maili :( – UshaP

Odpowiedz

5

Dlaczego nie użyłbyś dokładnie tego samego pojęcia, co użycie MailDefinition? Załaduj ciało z pliku szablonu, zastąp niektóre markery tekstem z innej listy - styl korespondencji seryjnej?

Wszystko, co robisz, to foreach na zestawie danych, które mają zostać scalone z szablonem. Załaduj dane scalania, zapętlić dane scalania zastępując tokeny w szablonie z bieżącym rekordem scalania. Ustaw treść wiadomości jako obecnie tworzoną wiadomość. Dołącz wiadomość do kolejki wiadomości lub wyślij ją teraz, w zależności od tego, którą opcję wybierzesz.

To nie jest rakieta. Masz kod do utworzenia wiadomości, więc jest to tylko przypadek wczytywania danych scalania i przechodzenia przez nie. Mam uproszczone do wykazania, koncepcji i Użyłem CSV scalania danych i przyjmuje się, że nie zawiera żadnych przecinków pola:

message.IsBodyHtml = true; 
message.From = new MailAddress("[email protected]"); 
message.Subject = "My bogus email subject"; 

string[] lines = File.ReadAllLines(@"~\MergeData.csv"); 
string originalTemplate = File.ReadAllText(@"~\Template.htm"); 

foreach(string line in lines) 
{ 
    /* Split out the merge data */ 
    string[] mergeData = line.Split(','); 

    /* Reset the template - to revert changes made in previous loop */ 
    string currentTemplate = originalTemplate; 

    /* Replace the merge tokens with actual data */ 
    currentTemplate = currentTemplate.Replace("[[FullNameToken]]", mergeData[0]); 
    currentTemplate = currentTemplate.Replace("[[FirstNameToken]]", mergeData[1]); 
    currentTemplate = currentTemplate.Replace("[[OtherToken]]", mergeData[2]); 

    /*... other token replacements as necessary. 
    * tokens can be specified as necessary using whatever syntax you choose 
    * just make sure that there's something denoting the token so you can 
    * easily replace it */ 

    /* Transfer the merged template to the message body */ 
    message.Body = currentTemplate; 

    /* Clear out the address from the previous loop before adding the current one */ 
    message.To.Clear(); 
    message.To.Add(new MailAddress(mergeData[3])); 
    client.Send(message); 
} 
+0

Myślałem, że istnieje inny sposób, zamiast ładowania htm jako ciąg i zastępowania tokenów. Ale myślę, że nie ma. Dzięki za odpowiedź. – UshaP

+0

@UshaP - Istnieje wiele sposobów ładowania htm, ale nie zawsze sprowadza się do "jaki jest najmądrzejszy sposób robienia czegoś". Zwykle najprostsze podejście jest najlepsze. Możesz (jak sugerował ktoś inny) ładować htm jako dokument XML i używać XPath do wysyłania zapytań i ustawiania wartości. Powiedziałbym, że to kompletna przesada i bycie zbyt sprytnym, by być sprytnym w tej konkretnej sytuacji. – BenAlabaster

+0

Może to trywialne pytanie, ale nie mogę się dowiedzieć, jak dynamicznie podążać ścieżką htm. Mam usługę Windows odwołującą się do projektu BL Class Library i tam umieszczam mój plik htm. File.ReadAllText i szuka w "C: \ Windows \ system32 \ .. – UshaP

0

Prosta odpowiedź brzmi:

message.Body = File.ReadAllText(@"~\EmailTemplate\Template1.htm"); 

nie jestem pewien o konkretnych punktach, ale jestem pewien, że ktoś odpowie na te :)

0

Co z użyciem

"messageBody".Replace("<% Name %>", curr.Name).Replace(....)...
?

Jeśli chodzi o sendign z gMail, możesz to zrobić za pośrednictwem SMTP, ale nie pozwalają ci podszyć innego "od" adresu, więc odbiorcy zobaczą go jako pochodzący z adresu gMail.

0

Chciałbym użyć silnika szablonu. StringTemplate na przykład.

+3

Wow, ta strona jest trudna dla oka. –

Powiązane problemy