类方法调用传递邮箱地址参数报错:无法将字符串转换为MailAddress
问题分析与解决
核心错误原因
你遇到的Cannot convert string to system.net.mail.mailaddress错误,本质是参数类型不匹配:
- 你的
SendMail方法定义的参数是MailAddress类型,但调用时传入的是普通字符串格式的邮箱地址,C#不会自动完成这种类型转换,所以抛出了这个错误。 - 除此之外,代码还有几个隐藏问题:
- 收件人参数是单个
MailAddress,但你传入的是多个分号分隔的邮箱字符串,没法正确处理多收件人 - 方法内部
mail.To.Add("toAddress")是把字符串"toAddress"当成邮箱,而不是使用传入的变量 mail.From = new MailAddress(fromAddress)是冗余操作,因为fromAddress已经是MailAddress类型了
- 收件人参数是单个
修正方案
我会把代码调整得更合理,既解决类型转换问题,也支持多收件人:
1. 修正后的SendEmail类
using System; using System.Net; using System.Net.Mail; public class SendEmail { public void SendMail(string fromAddress, string toAddresses) { try { MailMessage mail = new MailMessage(); SmtpClient SmtpServer = new SmtpClient("smtp.gmail.com"); // 直接将字符串转为MailAddress赋值给From mail.From = new MailAddress(fromAddress); // 处理多收件人:按分号分割后逐个添加,同时过滤空值 foreach (string toAddr in toAddresses.Split(';')) { if (!string.IsNullOrWhiteSpace(toAddr)) { mail.To.Add(new MailAddress(toAddr.Trim())); } } mail.Subject = "Test Mail - 1"; mail.IsBodyHtml = true; string htmlBody = "Write some HTML code here"; mail.Body = htmlBody; SmtpServer.Port = 587; SmtpServer.Credentials = new NetworkCredential("username", "password"); SmtpServer.EnableSsl = true; SmtpServer.Send(mail); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } } }
2. 保持原调用方式不变(无需修改)
var fromAddress = "email1@noname.com"; var toAddress = "email2@noname.com;email3@noname.com"; SendEmail _sendEmail = new SendEmail(); _sendEmail.SendMail(fromAddress, toAddress);
额外说明
如果你更希望保持方法参数为MailAddress类型,那调用时需要手动把字符串转为MailAddress,但处理多收件人会麻烦一些:
// 调用方式修改为: var fromAddress = new MailAddress("email1@noname.com"); var toAddresses = new List<MailAddress> { new MailAddress("email2@noname.com"), new MailAddress("email3@noname.com") }; // 同时需要把SendMail方法的收件人参数改为IEnumerable<MailAddress>类型 _sendEmail.SendMail(fromAddress, toAddresses);
但显然第一种方案更贴合你当前的调用习惯,处理多收件人也更灵活。
内容的提问来源于stack exchange,提问作者SGekko
相关产品推荐
相关产品推荐

