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
相关产品推荐
相关产品推荐

