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

C#控制台程序调用PowerShell执行发邮件命令失败求助

问题分析与修复方案

核心问题排查

你的C#程序无法正常发送邮件,主要由以下几个错误导致:

  • PowerShell命令参数错误:调用powershell.exe时,参数写成了powershell-Command,正确参数应为-Command(已指定执行文件为powershell.exe,无需重复写powershell)。
  • 命令字符串转义与格式错误:原命令末尾多余了一个引号,且转义后的引号可能导致PowerShell解析逻辑混乱。
  • 未捕获错误输出:仅重定向了标准输出,未捕获错误输出,无法查看执行失败的具体原因。
  • 冗余代码:创建了PowerShell.Create()对象但未实际使用,属于无效代码。

修复方案1:修正Process调用逻辑

以下是调整后的完整C#代码,解决了参数、转义和错误捕获问题:

using System;
using System.Diagnostics;

class Program
{
    static void Main(string[] args)
    {
        // 修正命令字符串:移除多余末尾引号,调整转义格式
        string strCmdText = @"$to = ""myemail@mail.com""; $from = ""senderemail@mail.com""; $subject = ""subject goes here""; $body = ""message body goes here""; $smtpServer = ""smtp.server.com""; $smtpClient = New-Object Net.Mail.SmtpClient($smtpServer, 587); $smtpClient.EnableSsl = $true; $smtpClient.Credentials = New-Object System.Net.NetworkCredential(""senderemail@mail.com"", ""Dnd912n9d2n1dsda90""); $smtpClient.Send($from, $to, $subject, $body);";

        var processStartInfo = new ProcessStartInfo();
        processStartInfo.FileName = "powershell.exe";
        // 修正参数:使用-Command,并用引号包裹命令字符串避免解析问题
        processStartInfo.Arguments = $"-Command \"{strCmdText}\"";
        processStartInfo.UseShellExecute = false;
        processStartInfo.RedirectStandardOutput = true;
        // 新增错误输出重定向,便于排查问题
        processStartInfo.RedirectStandardError = true;
        // 可选:隐藏PowerShell窗口
        processStartInfo.WindowStyle = ProcessWindowStyle.Hidden;

        using var process = new Process();
        process.StartInfo = processStartInfo;
        process.Start();

        // 读取输出和错误信息
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();
        process.WaitForExit();

        // 打印信息用于调试(发布时可移除)
        Console.WriteLine("输出信息:");
        Console.WriteLine(output);
        if (!string.IsNullOrEmpty(error))
        {
            Console.WriteLine("错误信息:");
            Console.WriteLine(error);
        }
        // 暂停窗口便于查看结果(发布时可移除)
        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }
}

修复方案2:使用PowerShell SDK直接调用(推荐)

无需启动外部powershell.exe进程,直接通过C#的PowerShell SDK执行命令,更高效且易于调试:

using System;
using System.Management.Automation;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            using var ps = PowerShell.Create();
            // 添加PowerShell命令脚本
            ps.AddScript(@"
                $to = ""myemail@mail.com""
                $from = ""senderemail@mail.com""
                $subject = ""subject goes here""
                $body = ""message body goes here""
                $smtpServer = ""smtp.server.com""
                $smtpClient = New-Object Net.Mail.SmtpClient($smtpServer, 587)
                $smtpClient.EnableSsl = $true
                $smtpClient.Credentials = New-Object System.Net.NetworkCredential(""senderemail@mail.com"", ""Dnd912n9d2n1dsda90"")
                $smtpClient.Send($from, $to, $subject, $body)
            ");
            // 执行命令
            var results = ps.Invoke();

            // 检查执行错误
            if (ps.HadErrors)
            {
                foreach (var error in ps.Streams.Error)
                {
                    Console.WriteLine("执行错误:" + error.ToString());
                }
            }
            else
            {
                Console.WriteLine("邮件发送成功!");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("程序异常:" + ex.Message);
        }

        Console.WriteLine("按任意键退出...");
        Console.ReadKey();
    }
}

注意:使用此方案需要在项目中安装Microsoft.PowerShell.SDK NuGet包。


额外建议

  • 不要硬编码邮箱密码,建议使用环境变量或加密配置文件存储敏感信息,进一步提升安全性。
  • 调试时保留控制台窗口的暂停逻辑(如Console.ReadKey()),便于查看执行结果和错误信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 08:43:20