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

类方法调用传递邮箱地址参数报错:无法将字符串转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:23:16