Я должен послать много электронных писем (вероятно, сотни дня) по графику базируются. Путем я думаю, чтобы сделать это, следующим образом, но проблема состоит в том, что мое поле Body может стать очень большим, и если я добавляю его как строку, это становится ужасным.
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("donotreply@abcde.com");
message.Subject = "My subject";
message.To.Add(new MailAddress("piniusha@abcde.com"));
try
{
client.Send(message);
}
catch (Exception)
{
}
Когда я должен был сделать это от aspx страницы, я использовал
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());
Я думаю, что это - изящное решение, но я не хочу ссылаться к Системе. Сеть. UI.WebControls. MailDefinition, потому что я нахожусь в winservice.
Мои вопросы:
спасибо за любую справку.
Почему бы вам не использовать ту же концепцию, что и в MailDefinition? Загрузите тело из вашего файла шаблона, замените некоторые маркеры текстом из другого списка - стиль слияния почты?
Все, что вы делаете, - это foreach над набором данных, который нужно объединить с шаблоном. Загрузите данные слияния, переберите данные слияния, заменив токены в шаблоне текущей записью слияния. Установите тело сообщения как текущее созданное сообщение. Прикрепите сообщение к очереди сообщений или отправьте его сейчас, в зависимости от того, что вы выберете.
Это не ракетостроение. У вас есть код для создания сообщения, так что это всего лишь случай загрузки ваших данных слияния и их перебора. Я упростил, чтобы продемонстрировать концепцию, и я использовал CSV для данных слияния и предположил, что ни одно поле не содержит запятых:
message.IsBodyHtml = true;
message.From = new MailAddress("MailSender@MyCompany.com");
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);
}
Простой ответ:
message.Body = File.ReadAllText(@"~\EmailTemplate\Template1.htm");
Я не уверен насчет ваших конкретных пунктов, но уверен, что кто-то еще ответит на них:)
Я бы использовал какой-нибудь шаблонизатор. StringTemplate , например.
Что плохого в использовании
"messageBody".Replace("<% Name %>", curr.Name).Replace(....)...?
Что касается отправки с gMail, вы можете сделать это через SMTP, но они не позволяют вам подделать другой адрес "от", поэтому получатели будут видеть, что письмо пришло с адреса gMail.