2011-01-05 6 views
22

Ho un codice ereditato che memorizza server SMTP, nome utente, password nella sezione system.net/mailSettings/smtp di Web.config.Lettura system.net/mailSettings/smtp da Web.config in ambiente trust medio

ha usato per leggerli in questo modo:

Configuration c = WebConfigurationManager.OpenWebConfiguration(HttpContext.Current.Request.ApplicationPath); 
MailSettingsSectionGroup settings = (MailSettingsSectionGroup)c.GetSectionGroup("system.net/mailSettings"); 
return settings.Smtp.Network.Host; 

Ma questo era mancata quando ho dovuto distribuire in un ambiente di fiducia medio.

Così dopo la risposta da this question, ho riscritto per utilizzare GetSection() in questo modo:

SmtpSection settings = (SmtpSection)ConfigurationManager.GetSection("system.net/mailSettings/smtp"); 
return settings.Network.Host; 

ma è comunque mi ha dato una SecurityException sulla fiducia Medio, con il seguente messaggio:

Request for ConfigurationPermission failed while attempting to access configuration section 'system.net/mailSettings/smtp'. To allow all callers to access the data for this section, set section attribute 'requirePermission' equal 'false' in the configuration file where this section is declared.

Così ho provato questo attributo requirePermission, ma non riesco a capire dove metterlo.

Se lo applico al nodo <smtp>, viene visualizzato un errore ConfigurationError: "Attributo non riconosciuto 'requirePermission." Nota che i nomi degli attributi fanno distinzione tra maiuscole e minuscole. "

Se lo applico al nodo > mailSettings , ottengo ancora SecurityException.

C'è un modo per ottenere questa sezione di configurazione in modo programmatico con un livello medio di fiducia? O dovrei semplicemente rinunciarci e spostare l'impostazione in <appSettings>?

+4

Ogni volta che ho avuto che l'impostazione non ho bisogno di "leggerlo". Basta creare un nuovo SmtpClient() per usare le impostazioni sul web.config. – turtlepick

risposta

27

L'attributo requirePemission va al raggruppamento <configSections> che corrisponde alla parte del web.config con cui si verifica il problema di sicurezza.

Inoltre, non c'è bisogno di leggere effettivamente le impostazioni utilizzando il codice per inviare la posta - si può semplicemente utilizzare uno SmtpClient vuoto:

new SmtpClient.Send(MyMailMessage); 

invierà utilizzando le impostazioni delle sezioni di configurazione di default.

+8

Heh, basta usare 'new SmtpClient()' piuttosto che cercare di estrarre manualmente l'host e la porta e username e password funzionano perfettamente! – Carson63000

2

gioie della codifica eh ... sempre 1000 modi per scuoiare un pesce

System.Net.Configuration.SmtpSection smtp = new System.Net.Configuration.SmtpSection(); 
string from = smtp.From; 
//etc 
System.Net.Configuration.SmtpNetworkElement nt = new System.Net.Configuration.SmtpNetworkElement(); 
string host = nt.Host; 
//etc 
+3

Questo restituisce semplicemente 'null' - non sembra riflettere ciò che hai nel tuo Web.config ... –

+0

Non funziona. Questo crea solo gli elementi, non li legge. –

4

Questo funziona molto bene per me.

var smtp = new System.Net.Mail.SmtpClient(); 
var host = smtp.Host; 
var ssl = smtp.EnableSsl; 
var port = smtp.Port; 

var credential = new System.Net.Configuration.SmtpSection().Network; 
var username = credential.UserName; 
var password = credential.Password; 
26

È possibile creare uno SmtpClient come suggerito, ma è un po 'eccessivo - basta leggere direttamente le sezioni.

var section = ConfigurationManager.GetSection("system.net/mailSettings/smtp") as SmtpSection; 
var host=section.Network.Host 
+0

Per ottenere l'attributo userName: section.Network.UserName –

+0

Ho seguito l'intero processo, ma ottenendo sempre valori null? Cosa mi manca? – ruud

2

per ottenere le impostazioni delle sezioni di posta solo creare gli oggetti di posta.

var client = new SmtpClient(); 
var messageSettings = new MailMessage(); 

var host=client.Host; 
//etc... 

var fromAddress=messageSettings.From.Address; 
//etc.. 

Config:

<system.net> 
    <mailSettings> 
     <smtp from="[email protected]" deliveryMethod="Network" > 
     <network host="smtp.mail.yahoo.com" port="587" enableSsl="true" 
      userName="[email protected]" password="xxxxxxx"/> 
     </smtp>  
    </mailSettings> 
    </system.net>