将多组SmtpServer.Credentials迁移至web.config及配置问题排查
解决多组SMTP凭据迁移至web.config的配置错误问题
错误原因分析
- 系统预定义的
<system.net/mailSettings>仅支持单个<smtp>节点,无法直接添加自定义的smtp_info等子节点 configSections中错误使用了与系统内置节组同名的mailSettings,导致配置冲突- web.config存在拼写错误:
<configruration>应为<configuration>
正确配置方案
1. 修改web.config配置
创建自定义配置节组存储多组SMTP信息,避免与系统内置节点冲突:
<configuration> <!-- 自定义配置节声明 --> <configSections> <sectionGroup name="customMailSettings"> <section name="smtp_info" type="System.Net.Configuration.SmtpSection" requirePermission="false" /> <section name="smtp_webmaster" type="System.Net.Configuration.SmtpSection" requirePermission="false" /> <section name="smtp_kontroll" type="System.Net.Configuration.SmtpSection" requirePermission="false" /> <section name="smtp_admin" type="System.Net.Configuration.SmtpSection" requirePermission="false" /> </sectionGroup> </configSections> <!-- 自定义SMTP配置组 --> <customMailSettings> <smtp_info deliveryMethod="Network" from="info@myWeb.se"> <network host="mySmtpHost.com" port="587" enableSsl="true" userName="info@myWeb.se" password="pwd_info" /> </smtp_info> <smtp_kontroll deliveryMethod="Network" from="kontroll@myWeb.se"> <network host="mySmtpHost.com" port="587" enableSsl="true" userName="kontroll@myWeb.se" password="pwd_kontroll" /> </smtp_kontroll> <smtp_admin deliveryMethod="Network" from="admin@myWeb.se"> <network host="mySmtpHost.com" port="587" enableSsl="true" userName="admin@myWeb.se" password="pwd_admin" /> </smtp_admin> <smtp_webmaster deliveryMethod="Network" from="webmaster@myWeb.se"> <network host="mySmtpHost.com" port="587" enableSsl="true" userName="webmaster@myWeb.se" password="pwd_webmaster" /> </smtp_webmaster> </customMailSettings> <!-- 保留系统默认mailSettings(可选) --> <system.net> <mailSettings> <smtp deliveryMethod="Network"> <!-- 可设置默认SMTP配置或留空 --> </smtp> </mailSettings> </system.net> </configuration>
2. 修正后台读取配置代码
调整配置节读取路径,匹配自定义节组名称:
Imports System.Configuration Imports System.Net.Configuration Protected Sub LoadSmtpConfig(senderEmail As String, receiverEmail As String, savePath As String) Dim SmtpServer As New Net.Mail.SmtpClient Dim section As SmtpSection Using SmtpServer SmtpServer.UseDefaultCredentials = False Select Case senderEmail Case "info@myWeb.se" section = CType(ConfigurationManager.GetSection("customMailSettings/smtp_info"), SmtpSection) Case "kontroll@myWeb.se" section = CType(ConfigurationManager.GetSection("customMailSettings/smtp_kontroll"), SmtpSection) Case "admin@myWeb.se" section = CType(ConfigurationManager.GetSection("customMailSettings/smtp_admin"), SmtpSection) Case "webmaster@myWeb.se" section = CType(ConfigurationManager.GetSection("customMailSettings/smtp_webmaster"), SmtpSection) Case Else Exit Sub End Select ' 绑定SMTP配置 SmtpServer.Credentials = New Net.NetworkCredential(section.Network.UserName, section.Network.Password) SmtpServer.EnableSsl = section.Network.EnableSsl SmtpServer.Host = section.Network.Host SmtpServer.Port = section.Network.Port ' 调用邮件发送方法 SkickaMail(receiverEmail, savePath, SmtpServer, senderEmail) End Using End Sub
3. 调整邮件发送方法
将配置好的SmtpClient作为参数传入,避免依赖全局变量:
Protected Sub SkickaMail(receiver As String, SavePath As String, smtpClient As Net.Mail.SmtpClient, sender As String) Dim mailWebb As New Net.Mail.MailMessage Using mailWebb mailWebb.To.Add(receiver) mailWebb.From = New Net.Mail.MailAddress(sender) If ChkKvitto.Checked Then mailWebb.Headers.Add("Disposition-Notification-To", sender) End If mailWebb.SubjectEncoding = System.Text.Encoding.UTF8 mailWebb.BodyEncoding = System.Text.Encoding.UTF8 mailWebb.Subject = TxtBoxSubject.Text.Trim mailWebb.Body = TxtBlock.Text.Trim mailWebb.IsBodyHtml = False If UpFile.HasFile And (SparadFil = True) Then Dim fileName As String For Each postedFile As HttpPostedFile In UpFile.PostedFiles fileName = Path.GetFileName(postedFile.FileName) mailWebb.Attachments.Add(New Net.Mail.Attachment(Path.Combine(SavePath, fileName))) Next End If Try smtpClient.Send(mailWebb) Response.Write("<script language='javascript'> alert('Meddelandet är skickat'); </script>") Catch error_t As SmtpException Response.Write("<script language='javascript'> alert('Meddelandet kunde inte skickas');</script>") End Try End Using End Sub
关键注意事项
- 确保项目引用
System.Configuration程序集 - 可使用
aspnet_regiis.exe工具对web.config中的密码进行加密,进一步提升安全性 - 验证IIS应用程序池权限,确保应用可读取web.config配置
内容的提问来源于stack exchange,提问作者Kurt Johansson
相关产品推荐
相关产品推荐

