GMAIL SMTP:对 SSPI 的调用失败异常 - 不支持请求的功能

2024-03-21

我正在使用 gmail smtp 发送邮件: 主机:smtp.gmail.com 端口:587

在 MVC 应用程序中使用 gmail smtp 发送邮件时出现异常。 以下代码用于发送邮件:

public static int SendMail(string StrFromAdd, string StrEmailTo, string StrSubject, string StrContents,
        string SMTPServer, int SMTPPort, string SMTPUserName, string SMTPPassword,
        string attachment = "", string CC = "", string BCC = "")
    {
        try
        {
            AlternateView AV = null;
            System.Net.Mail.SmtpClient smtpClient = new System.Net.Mail.SmtpClient();
            System.Net.Mail.MailMessage message = new System.Net.Mail.MailMessage();
            System.Net.Mail.MailAddress fromAddress = new System.Net.Mail.MailAddress(StrFromAdd, "Test");
            smtpClient.Host = SMTPServer;
            smtpClient.Port = SMTPPort;
            smtpClient.Credentials = new System.Net.NetworkCredential(SMTPUserName, SMTPPassword);

            smtpClient.EnableSsl = true;

            message.From = fromAddress;

            if (attachment != null)
            {
                string[] attachmentsarr = attachment.Split(';');
                foreach (string attach in attachmentsarr)
                {
                    if (attach != "")
                        message.Attachments.Add(new Attachment(attach));
                }
            }

            string pattern = @"^((([\w]+\.[\w]+)+)|([\w]+))@(([\w]+\.)+)([A-Za-z]{1,3})$";

            if (StrEmailTo != "")
            {
                if (StrEmailTo.IndexOf(',') > -1)
                {
                    string[] _strArrstrEmailTo = StrEmailTo.Split(',');
                    foreach (object objBCCEmailID in _strArrstrEmailTo)
                        if (Regex.IsMatch(objBCCEmailID.ToString().Trim(), pattern))
                            message.To.Add(new System.Net.Mail.MailAddress(objBCCEmailID.ToString().Trim()));

                }
                else
                    message.To.Add(new System.Net.Mail.MailAddress(StrEmailTo.ToString().Trim()));
            }

            if (CC != "")
            {
                if (CC.IndexOf(',') > -1)
                {
                    string[] _strArrstrEmailCC = CC.Split(',');
                    foreach (object objBCCEmailID in _strArrstrEmailCC)
                        if (Regex.IsMatch(objBCCEmailID.ToString().Trim(), pattern))
                            message.CC.Add(new System.Net.Mail.MailAddress(objBCCEmailID.ToString().Trim()));

                }
                else
                    message.CC.Add(new System.Net.Mail.MailAddress(CC.ToString().Trim()));
            }

            if (BCC != "")
            {
                if (BCC.IndexOf(',') > -1)
                {
                    string[] _strArrstrEmailBCC = BCC.Split(',');
                    foreach (object objBCCEmailID in _strArrstrEmailBCC)
                        if (Regex.IsMatch(objBCCEmailID.ToString().Trim(), pattern))
                            message.Bcc.Add(new System.Net.Mail.MailAddress(objBCCEmailID.ToString().Trim()));

                }
                else
                    message.Bcc.Add(new System.Net.Mail.MailAddress(BCC.ToString().Trim()));
            }
            // This is added for custom form & email template image
            List<string> ImageFiles = Common.GetImagesInHTMLString(StrContents);
            if (ImageFiles != null && ImageFiles.Count > 0)
            {
                string addStrContents = string.Empty;

                for (int i = 0; i < ImageFiles.Count; i++)
                {
                    // this is for custom form
                    if (ImageFiles[i].Contains("CustomFormImage"))
                    {
                        string Path = Regex.Match(ImageFiles[i], "<img.+?src=[\"'](.+?)[\"'].+?>", RegexOptions.IgnoreCase).Groups[1].Value;
                        int pos = Path.LastIndexOf("\\") + 1;
                        string FullPath = HttpContext.Current.Server.MapPath("~/img/CustomFormImage/" + Path.Substring(pos, Path.Length - pos));
                        if (System.IO.File.Exists(FullPath))
                        {
                            //addStrContents = addStrContents + "<img style='width:100px;height:100px;' src=\"cid:" + Path.Substring(pos, Path.Length - pos).Split('.')[0] + "\">" + Environment.NewLine;
                            StrContents = StrContents.Replace(Path, "cid:" + Path.Substring(pos, Path.Length - pos).Split('.')[0]);
                        }
                    }
                    // this is for email template image
                    else if (ImageFiles[i].Contains("EmailHeaderFooterImgs"))
                    {
                        string Path = Regex.Match(ImageFiles[i], "<img.+?src =[\"'](.+?)[\"'].+?>", RegexOptions.IgnoreCase).Groups[1].Value;
                        int pos = Path.LastIndexOf("\\") + 1;
                        if (System.IO.File.Exists(Path))
                        {
                            //addStrContents = addStrContents + "<img style='width:100px;height:100px;' src=\"cid:" + Path.Substring(pos, Path.Length - pos).Split('.')[0] + "\">" + Environment.NewLine;
                            StrContents = StrContents.Replace(Path, "cid:" + Path.Substring(pos, Path.Length - pos).Split('.')[0]);
                        }
                    }
                }
                AV = AlternateView.CreateAlternateViewFromString(StrContents, null, MediaTypeNames.Text.Html);
                for (int i = 0; i < ImageFiles.Count; i++)
                {
                    // this is for custom form
                    if (ImageFiles[i].Contains("CustomFormImage"))
                    {
                        string Path = Regex.Match(ImageFiles[i], "<img.+?src=[\"'](.+?)[\"'].+?>", RegexOptions.IgnoreCase).Groups[1].Value;
                        int pos = Path.LastIndexOf("\\") + 1;
                        string FullPath = HttpContext.Current.Server.MapPath("~/img/CustomFormImage/" + Path.Substring(pos, Path.Length - pos));
                        if (System.IO.File.Exists(FullPath))
                        {
                            //FileStream fs = new FileStream(FullPath, FileMode.Open, FileAccess.Read);
                            //Attachment a = new Attachment(fs, Path.Substring(pos, Path.Length - pos), MediaTypeNames.Application.Octet);
                            //message.Attachments.Add(a);
                            //addStrContents = addStrContents + "<img src=\"cid:" + Path.Substring(pos, Path.Length - pos).Split('.')[0] + "\">" + Environment.NewLine;
                            LinkedResource Img = new LinkedResource(FullPath, MediaTypeNames.Image.Jpeg);
                            Img.ContentId = Path.Substring(pos, Path.Length - pos).Split('.')[0];
                            AV.LinkedResources.Add(Img);
                        }
                    }
                    // this is for email template image
                    else if (ImageFiles[i].Contains("EmailHeaderFooterImgs"))
                    {
                        string Path = Regex.Match(ImageFiles[i], "<img.+?src =[\"'](.+?)[\"'].+?>", RegexOptions.IgnoreCase).Groups[1].Value;
                        int pos = Path.LastIndexOf("\\") + 1;
                        if (HttpContext.Current != null)
                        {
                            string FullPath = HttpContext.Current.Server.MapPath("~/EmailHeaderFooterImgs/" + Path.Substring(pos, Path.Length - pos));
                            if (System.IO.File.Exists(Path))
                            {
                                LinkedResource Img = new LinkedResource(Path, MediaTypeNames.Image.Jpeg);
                                Img.ContentId = Path.Substring(pos, Path.Length - pos).Split('.')[0];
                                AV.LinkedResources.Add(Img);
                            }
                        }
                    }
                }
            }

            message.Subject = StrSubject;
            message.IsBodyHtml = true;
            if (AV != null)
                message.AlternateViews.Add(AV);
            else
                message.Body = StrContents;

            smtpClient.Send(message);
            message.Dispose();
            return 1;
        }
        catch (Exception ex)
        {

        }
    }

下面是堆栈轨迹:

    System.Security.Authentication.AuthenticationException: A call to SSPI failed, see inner exception. System.ComponentModel.Win32Exception: The function requested is not supported
   at System.Net.Security.SslState.StartSendAuthResetSignal(ProtocolToken message, AsyncProtocolRequest asyncRequest, Exception exception)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessReceivedBlob(Byte[] buffer, Int32 count, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.StartReceiveBlob(Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.CheckCompletionBeforeNextReceive(ProtocolToken message, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ForceAuthentication(Boolean receiveFirst, Byte[] buffer, AsyncProtocolRequest asyncRequest)
   at System.Net.Security.SslState.ProcessAuthentication(LazyAsyncResult lazyResult)
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.TlsStream.ProcessAuthentication(LazyAsyncResult result)
   at System.Net.TlsStream.Write(Byte[] buffer, Int32 offset, Int32 size)
   at System.Net.Mail.SmtpConnection.Flush()
   at System.Net.Mail.ReadLinesCommand.Send(SmtpConnection conn)
   at System.Net.Mail.EHelloCommand.Send(SmtpConnection conn, String domain)
   at System.Net.Mail.SmtpConnection.GetConnection(ServicePoint servicePoint)
   at System.Net.Mail.SmtpClient.GetConnection()
   at System.Net.Mail.SmtpClient.Send(MailMessage message)
   at MVC.Common.SendMails.SendMail(String StrFromAdd, String StrEmailTo, String StrSubject, String StrContents, String SMTPServer, Int32 SMTPPort, String SMTPUserName, String SMTPPassword, String attachment, String CC, String BCC) in SendMails.cs:line 296

注意:相同的代码正在另一个应用程序中运行,该应用程序托管在同一服务器上,并且也使用相同的 gmail 配置来发送邮件。


假设您的代码是针对(例如).NET Framework 4.7.2 编译的,然后确保您的Web.config包括:

<httpRuntime targetFramework="4.7.2" />

If targetFramework太低或缺失,编译的代码仍会自动尝试请求 TLS 1.2(从 .NET Framework 4.7 向上发生),但运行时将不支持它,从而导致错误。

(归功于这个答案 https://stackoverflow.com/a/45442874/795690,这让我意识到这里出了什么问题 - 尽管这个问题和这个问题不重复。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GMAIL SMTP:对 SSPI 的调用失败异常 - 不支持请求的功能 的相关文章

  • 为什么存在 async 关键字

    浏览 msdn 9 频道视频时 我发现以下未答复的评论 希望有人能解释一下 我不明白 async 关键字的意义 为什么不直接允许 任何时候方法返回任务时都会使用await关键字 就像迭代器一样 可以在任何返回 IEnumerable 的方法
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • 将字节数组转换为托管结构

    更新 这个问题的答案帮助我编写了开源项目GitHub 上的 AlicanC 现代战争 2 工具 https github com AlicanC AlicanC s Modern Warfare 2 Tool 你可以看到我是如何阅读这些数据
  • 为什么Apache MPM prefork.c 使用互斥体来保护accept()?

    我坐下来读书Apache 的 MPM prefork c http code metager de source xref apache httpd server mpm prefork prefork c这段代码使用了一个名为accept
  • 为什么大多数平台上没有“aligned_realloc”?

    MSVC有自己的非标准函数 aligned malloc aligned realloc and aligned free C 17和C11引入了 std aligned alloc 其结果可以是de分配有free or realloc B
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 无法解析远程名称 - webclient

    我面临这个错误 The remote name could not be resolved russgates85 001 site1 smarterasp net 当我请求使用 Web 客户端读取 html 内容时 出现错误 下面是我的代
  • 两种类型的回发事件

    1 我发现了两篇文章 每篇文章对两种类型的回发事件的分类都略有不同 一位资源说两种类型的回发事件是Changed事件 其中控件实现 IPostbackDataHandler 当数据在回发之间更改时触发 然后Raised事件 其中控件实现 I
  • 从 Code::Blocks 运行程序时出现空白控制台窗口 [重复]

    这个问题在这里已经有答案了 当我尝试在 Code Blocks 中构建并运行新程序时 控制台窗口弹出空白 我必须单击退出按钮才能停止它 它对我尝试过的任何新项目 包括 Hello world 都执行此操作 奇怪的是 它对于我拥有的任何旧项目
  • 使用 WF 的多线程应用程序的错误处理模式?

    我正在写一个又长又详细的问题 但只是放弃了它 转而选择一个更简单的问题 但我在这里找不到答案 应用程序简要说明 我有一个 WPF 应用程序 它生成多个线程 每个线程执行自己的 WF 处理线程和 WF 中的错误 允许用户从 GUI 端进行交互
  • 是否有关于 EML 文件格式的 RFC?

    基本上 我正在尝试使用 EML 文件 我想知道这些文件在不同的电子邮件服务器上是否相当标准 基本上 EML 文件上是否有一个 RFC 就像电子邮件地址和其他主题的 RFC 一样 我想我可以更具体一点 以便更好地了解我需要什么 我正在扫描 E
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 如何引用解决方案之外的项目?

    我有一个 Visual Studio C 解决方案 其中包含一些项目 其中一个项目需要引用另一个不属于解决方案的项目 一开始我引用了dll
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • C++、三元运算符、std::cout

    如何使用 C 用三元运算符编写以下条件 int condition1 condition2 condition3 int double result int or double std cout lt lt condition1 resul
  • 以 UTF8 而不是 UTF16 输出 DataTable XML

    我有一个 DataTable 我正在使用 WriteXML 创建一个 XML 文件 尽管我在以 UTF 16 编码导出它时遇到问题 并且似乎没有明显的方法来更改它 我了解 NET 在字符串内部使用 UTF 16 这是正确的吗 然后 我通过
  • 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同

    System Net WebException 服务器响应 PASV 命令返回的地址与建立 FTP 连接的地址不同 在 System Net FtpWebRequest CheckError 在 System Net FtpWebReque
  • 如何使用 C# 以低分辨率形式提供高分辨率图像

    尝试使用 300dpi tif 图像在网络上显示 目前 当用户上传图像时 我正在动态创建缩略图 如果创建的页面引用宽度为 500x500px 的高分辨率图像 我可以使用相同的功能即时转换为 gif jpg 吗 将创建的 jpg 的即将分辨率

随机推荐