【问题标题】:System.Net.Mail The requested service provider could not be loaded or initializedSystem.Net.Mail 无法加载或初始化请求的服务提供者
【发布时间】:2014-05-16 03:15:38
【问题描述】:

尝试使用 System.Net.Mail.SmtpClient 发送电子邮件时出现以下异常:

System.Net.Mail.SmtpException: The SMTP host was not found.

内部异常:

System.Net.Sockets.SocketException: The requested service provider could not be loaded or initialized

我的邮件发送代码比较简单:

private async Task SendEmail(string to, string subject, string email)
{
    MailMessage msg = null;
    SmtpClient smtp = null;
    try
    {
        var set = Settings.Default;
        msg = new MailMessage(set.EmailFrom, to, subject, email);
        smtp = new SmtpClient(set.SMTPServer, set.Port)
        {
            EnableSsl = true,
            Credentials = new NetworkCredential(set.EmailUsername, set.EmailPassword),
            Timeout = 20000
        };
        await smtp.SendMailAsync(msg);
    }
    catch (Exception e)
    {
        _log.Error("Error on sending email", e);
        throw;
    }
    finally
    {
        if (msg != null) msg.Dispose();
        if (smtp != null) smtp.Dispose();
    }
}

此错误并非每次都发生,而是经常发生。我试图用谷歌搜索它,但没有发现任何有用的东西。当我收到此错误时,互联网连接似乎很稳定。

任何想法为什么会发生这种情况?

【问题讨论】:

    标签: c# .net sockets exception smtp


    【解决方案1】:

    很抱歉没有将此作为评论发布,我没有足够的代表。

    我使用与此非常相似的实现来运行一个进程,并且我也遇到过同样的事情。尝试减少 SMTP 超时,如果有太多请求尚未释放其现有连接,则新连接将被拒绝。它对我的具体实施有所帮助。

    【讨论】:

    • 很奇怪,因为 SmtpClient.Dispose() 应该关闭连接,并且在发送前一封电子邮件之前我不会发送新电子邮件,因此一次连接不应超过 1 个。无论如何感谢您的建议,我会尝试(现在无法尝试,在另一台计算机上)。
    • 我的实现没有设置为异步运行,所以可能还有另一个问题在起作用。无论如何,我希望这会有所帮助。
    • 只是好奇,但你把它简化为什么?从您的原始代码示例开始 20 秒似乎真的很高。您是否在邮件中发送大附件?
    • 不,电子邮件很小,我设置了这样的超时以避免可能的临时网络问题。我将它减少到 10 秒,但结果是一样的。你觉得它太高了吗?考虑到电子邮件仅包含几行纯文本,您会建议什么合理的价值?
    • 我也发送简单的文本电子邮件,我将超时设置为 500(即半秒)。也许这对你有用。
    猜你喜欢
    • 2021-12-05
    • 1970-01-01
    • 2021-12-22
    • 2015-07-02
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    相关资源
    最近更新 更多