You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将多组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 00:54:58