2013-04-11 94 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 2013-04-11 10:24:03

+0

使用'StringBuilder'在代碼後面生成你的HTML正文:) – 2013-04-11 10:26:20

+0

謝謝'StringBuilder'的想法:) – intentarr 2013-04-11 10:38:50

回答

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> 

代碼(填充和發送): -

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; 
} 

編輯*如果你不希望這樣做<strong>You chose option: </strong>{1}<br />在所有如果客戶選擇任何選項出現,那麼你可以做到這一點(雖然有點哈克): -

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); 

確保與{1}

替換此行的標記 <strong>You chose option: </strong>{1}<br />
+0

正如我所看到的這段代碼並沒有解決問題。第一行:'您選擇了選項: {1}
'總是會收到郵件。我不想給用戶顯示這行代碼,如果他沒有選擇一個選項:) – intentarr 2013-04-11 10:38:07

+0

由於我沒有完整的源代碼的好處,我只能提供一個通用的解決方案。顯然,你可以檢查你的代碼,看看客戶是否選擇了一個選項,如果他們不選擇,將選項文本設置爲「no option selected」...作爲基本解決方案。 – DGibbs 2013-04-11 10:43:44

+0

我編輯了我的答案,其中包含修復其他問題 – DGibbs 2013-04-11 10:49:29

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 2013-04-11 12:35:40

+0

不,在我的例子中,我創建了一個單一的模板。根據您的情況設置[ChoosenOption]參​​數。 – TiagoBrenck 2013-04-11 16:14:55

+0

是的,我明白了,但我有5種不同的選擇。他們都可以被選中,或者只是其中一個......如果我明白你的例子錯了,我很抱歉。如果選項不會被選中,你只需寫入'ChosenOption =「」'? – intentarr 2013-04-11 16:23:53

1

當您從用戶提交表單時,請將其信息保存在會話中,發送郵件後,彈出並連接會話信息。

+0

'發送郵件後'這個問題的所有要點是,我想在電子郵件中有這個信息,而不是在彈出窗口中:) – intentarr 2013-04-11 12:38:03

+0

MailMessage mail = new MailMessage(); mail.IsBodyHtml = true; mail.Body =「您的電子郵件已發送」+ Session [「id」]。ToString(); – 2013-06-28 09:42:01