2013-04-11 4 views
0

Я использую библиотеку system.net.mail для отправки пользовательской информации о некоторых сделанных действиях. Во время выполнения программы я собираю некоторую информацию, а позже я хотел бы показать ее пользователю. Содержание почты будет выглядеть следующим образом:system.net.mail редактирование содержимого почты

Hello user, 
this is your id in system. 
*if he chosen option1* 
You chosen option 1 value 
*if he chosen option2* 
You chosen option 2 value 
*if he chosen option3* 
You chosen option 3 value 

Проблема заключается в том, что я не нашел способ, как я мог бы изменить содержание почты (который записывается в HTML, и добавил к ресурсам) на время выполнения программы.

Любой может предложить, как я должен редактировать содержимое почты в зависимости от выбранных значений или, может быть, есть какие-то альтернативы?

Пример почты:

`<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">` 
<html> 
<head> 
    <META http-equiv=Content-Type content="text/html"> 
</head> 
<body> 
    <p>Hello user,</p> 
    <p>This is your id in system : {0}</p> 
/* 
And the dificult part here: 
    if he chosen option1 in program I want in email to show that option 1 value. 
    And if he didn't chosen it I don't wanna show it to him. 
*/   
</body> 
</html> 
+0

Просьба указать некоторые детали кода. – Hogan

+0

Используйте 'StringBuilder' для генерации вашего HTML-кода в коде за файлом :) –

+0

Спасибо за идею' StringBuilder' :) – intentarr

ответ

1

Вы можете хранить HTML в файле XML и заполнить содержимое с помощью string.Format следующим образом: -

<?xml version="1.0" encoding="utf-8" ?> 
<Email> 
    <FromAddress>from</FromAddress> 
    <ToAddress>to</ToAddress> 
    <Subject>subject line</Subject> 
    <EmailBody> 
     <![CDATA[ 
    <html> 
<head> 
    <title>Customer</title> 
</head> 
     <div valign="top"> 
      <font color="#666666" face="Arial, Helvetica, sans-serif, Verdana" size="2"> 
      <p>Hello user.</p> 
      <p><strong>This is your ID in the system: </strong>{0}<br /> 
      <strong>You chose option: </strong>{1}<br /></p> 
      </font> 
     </div> 
</html> 
     ]]> 
    </EmailBody> 
</Email> 

Code (заполнить и отправить): -

int custId = //provide customer id 
string option = //customers selected option 
string custEmail = //customers email 

MailMessage mail = GetHtmlEmail(); 

string message = string.Format(mail.Body, custId, option); 

mail.IsBodyHtml = true; 
mail.Body = message; 

using (SmtpClient smtp = new SmtpClient()) 
{ 
    smtp.Send(mail); 
} 

Чтение в электронной почте разметки + установка некоторых свойств почтового объекта: -

private MailMessage GetHtmlEmail() 
{ 
    MailMessage mail = new MailMessage(); 
    XmlTextReader xReader = new XmlTextReader(Server.MapPath("PATH TO EMAIL.XML")); 

    while (xReader.Read()) 
    { 
     switch (xReader.Name) 
     { 
      case "ToAddress": 
       mail.To.Add(xReader.ReadElementContentAs(typeof(string), null).ToString()); 
       break; 
      case "FromAddress": 
       mail.From = new MailAddress(xReader.ReadElementContentAs(typeof(string), null).ToString()); 
       break; 
      case "Subject": 
       mail.Subject = xReader.ReadElementContentAs(typeof(string), null).ToString(); 
       break; 
      case "EmailBody": 
       mail.Body = xReader.ReadElementContentAs(typeof(string), null).ToString(); 
       break; 
      default: 
       break; 
     } 
    } 

    return mail; 
} 

Edit * Если вы не хотите этого <strong>You chose option: </strong>{1}<br /> появляться ВООБЩЕ, если клиент не выбрал никакого варианта, то вы могли бы сделать это (хотя немного Hacky): -

if(!string.IsNullOrEmpty(option)) 
{ 
    option = string.Format("<strong>You chose option: </strong>{1}<br />", option); 
} 
else 
{ 
    option = string.Empty; 
} 

Затем пройти это как обычно: -

string message = string.Format(mail.Body, custId, option); 

Убедившись, чтобы заменить эту строку в разметке <strong>You chose option: </strong>{1}<br /> с {1}

+0

Как я вижу, этот код не решает проблему.ths line: 'Вы выбрали вариант: {1}
' всегда будет в почте. Я не хочу показывать эту строку кода пользователю, если он не выбрал опцию :) – intentarr

+0

Поскольку у меня нет пользы от полного исходного кода, я могу предоставить только общее решение. Очевидно, что вы можете сделать чек в своем коде, чтобы узнать, выбрал ли клиент опцию, и если они этого не сделали, установите в качестве основного варианта вариант «не выбран вариант» .... – DGibbs

+0

Я отредактировал свой ответ, чтобы включить исправление для другого вопроса – DGibbs

1

У меня ситуация в реальном мире, что мне нужно сделать это с помощью электронной почты, и я использовал шаблоны. Вы можете попытаться создать шаблон для своего тела электронной почты с переменными и создать это тело в соответствии с вашей ситуацией, изменив переменные на правильное значение. Пример шаблона:

<p>Hello user [User]</p> 
<p>This is your id in system : [ID]</p> 
<p>[ChoosenOption]</p> 

Создайте файл ресурсов, так что вы можете получить этот шаблон по имени. Вы собираетесь должны создать метод, который будет изменять эти переменные, как в этом примере:

public String ProcessTemplate(String templateName, dynamic variables) 
{ 
    String template = MethodThatSearchOnResourceAndReturnsTemplateByItsName(templateName); 
     if (String.IsNullOrWhiteSpace(template)) 
     { 
      return String.Empty; 
     } 

     if (variables == null) 
     { 
      return template; 
     } 

     PropertyInfo[] properties = ((Object)variables).GetType().GetProperties(); 
     foreach (PropertyInfo prop in properties) 
     { 
      template = template.Replace("[" + prop.Name + "]", propriedade.GetValue(properties, null)); 
     } 

     return template; 
} 

Теперь вы рисуете ваш шаблон:

String body = ProcessTemplate("TemplateName", new 
{ 
    User = the user name, 
    ID = this user id, 
    ChoosenOption = ReturnChoosenOptionHtml() 
}); 

private String ReturnChoosenOptionHtml() 
{ 
    String html = String.Empty; 
    if(chooseOption1) 
     html += "xptoHTML"; 
    if(choosenOption2) 
     html += "abcdHTML"; 
    return html; 
} 

Конечный результат будет по электронной почте с теми [ Переменные] изменились с переданными вами значениями.

+0

Я использую шаблон, но в этом проблема. У меня есть 5 полей параметров. Таким образом, это означает, что для каждой возможной комбинации опций (может быть выбрано 1 поле опциона или 2 варианта и 4 поля опций и т. Д.). Мне придется создавать разные шаблоны ... Я не думаю, что это будет хорошая идея :) – intentarr

+0

Нет, на моем примере я создал один шаблон. Параметр [ChoosenOption] установлен в зависимости от вашей ситуации. – TiagoBrenck

+0

Да, я вижу это, но у меня есть 5 различных вариантов. Все они могут быть выбраны или только один из них ... Мне жаль, если я понимаю ваш пример неправильно. Если этот параметр не выбран, вы просто написали 'ChosenOption =" "'? – intentarr

1

Когда вы отправляете форму от пользователя, сохраняйте их информацию в сеансах и после отправки почты покажите всплывающее окно и соедините свою информацию с сеансами.

+0

'после отправки почты' все дело в том, что я хочу иметь эту информацию по электронной почте, а не в всплывающем окне :) – intentarr

+0

MailMessage mail = new MailMessage(); mail.IsBodyHtml = true; mail.Body = "Ваше письмо отправлено" + сеанс ["id"]. ToString(); –

Смежные вопросы