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

C#新手求助:无法从文本文件读取SMTP端口及EnableSsl配置

解决SMTP配置的类型转换问题(C#)

你遇到的核心问题是文本文件读取的内容都是字符串类型,但SmtpClient的Port需要int类型,EnableSsl需要bool类型,直接赋值会出现类型不匹配错误,下面是具体的解决方法:

1. 处理Port的类型转换

文本文件里的26是字符串,需要转换成整数类型。推荐使用int.TryParse做安全转换(避免文本内容不是有效数字时崩溃):

// 定义变量存储转换后的端口
int smtpPort;
// 尝试将content[6]转换为int,失败则提示错误并退出
if (!int.TryParse(content[6], out smtpPort))
{
    MessageBox.Show("错误:配置文件中的端口不是有效数字");
    return;
}

2. 处理EnableSsl的类型转换

文本里的false是字符串,需要转换成布尔类型,同样用bool.TryParse做安全转换:

// 定义变量存储SSL启用状态
bool enableSsl;
if (!bool.TryParse(content[5], out enableSsl))
{
    MessageBox.Show("错误:配置文件中的EnableSsl设置无效");
    return;
}

修改后的完整代码片段

把转换逻辑加到你的代码中,替换原来硬编码的Port和EnableSsl:

private void SendEmail(string file)
{
    try
    {
        string[] content = File.ReadAllLines(@"settings.txt");
        var fromAddress = new MailAddress(content[0], content[3]);
        var toAddress = new MailAddress(content[1], content[3]); // 修正:收件人应该取文本第二行的content[1]
        string fromPassword = content[2];
        const string subject = "Alarm Snapshot";
        const string body = "Motion detected";

        var attachmentFilename = file;
        var attachment = new Attachment(attachmentFilename, MediaTypeNames.Application.Octet);
        if (attachmentFilename != null)
        {
            ContentDisposition disposition = attachment.ContentDisposition;
            disposition.CreationDate = File.GetCreationTime(attachmentFilename);
            disposition.ModificationDate = File.GetLastWriteTime(attachmentFilename);
            disposition.ReadDate = File.GetLastAccessTime(attachmentFilename);
            disposition.FileName = Path.GetFileName(attachmentFilename);
            disposition.Size = new FileInfo(attachmentFilename).Length;
            disposition.DispositionType = DispositionTypeNames.Attachment;
        }

        // 转换端口
        int smtpPort;
        if (!int.TryParse(content[6], out smtpPort))
        {
            MessageBox.Show("错误:配置文件中的端口不是有效数字");
            return;
        }

        // 转换EnableSsl状态
        bool enableSsl;
        if (!bool.TryParse(content[5], out enableSsl))
        {
            MessageBox.Show("错误:配置文件中的EnableSsl设置无效");
            return;
        }

        var smtp = new SmtpClient
        {
            Host = content[4],
            Port = smtpPort, // 使用转换后的端口
            EnableSsl = enableSsl, // 使用转换后的SSL状态
            DeliveryMethod = SmtpDeliveryMethod.Network,
            UseDefaultCredentials = false, // 注意:这里建议设为false,否则自定义Credentials可能不生效
            Credentials = new NetworkCredential(fromAddress.Address, fromPassword)
        };
        using (var message = new MailMessage(fromAddress, toAddress)
        {
            Subject = subject,
            Body = body
        })
        {
            message.Attachments.Add(attachment);
            smtp.Send(message);
            InvokeGuiThread(() => label_Email.Text = @"Sending successful");
        }
    }
    catch (Exception exception)
    {
        MessageBox.Show(@"Error: " + exception.Message);
    }
}

额外提示

  • 你原来的toAddress误用了content[0],这会导致发件人和收件人是同一个邮箱,已修正为取文本第二行的content[1]
  • UseDefaultCredentials设为false是新手常见的坑:如果保持true,你设置的自定义账号密码可能不会生效
  • 使用TryParse而非Parse的原因是:如果文本文件内容被意外修改(比如端口写成字母),程序不会直接崩溃,而是友好提示用户

内容的提问来源于stack exchange,提问作者Randal James

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 23:15:53