我正在尝试发送自动电子邮件(真正需要的商业原因 - 不是垃圾邮件!).类似于下面的代码用于与另一个邮件服务提供商合作,但客户已经转移到"outlook.com",他们现在得到:
The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.7.1 Client was not authenticated
Run Code Online (Sandbox Code Playgroud)
当然这个(C#)代码应该工作:
private void Send_Click(object sender, EventArgs e)
{
MailMessage message = null;
try
{
message = new MailMessage(From, To);
message.Subject = "Update Request Session from " + From;
message.CC.Add(Cc);
message.Body = "Test message: please ignore.";
message.IsBodyHtml = false;
SmtpClient client = new SmtpClient("smtp.outlook.com", 587);
client.Credentials = new System.Net.NetworkCredential(From, Password);
client.UseDefaultCredentials = false;
client.DeliveryMethod = SmtpDeliveryMethod.Network; …
Run Code Online (Sandbox Code Playgroud) 我无法弄清楚为什么这不起作用的生活
SmtpClient smtp = new SmtpClient
{
Host = "smtp.gmail.com",
Port = 587,
UseDefaultCredentials = false,
DeliveryMethod = SmtpDeliveryMethod.Network,
Credentials = new NetworkCredential("myemail@gmail.com", "myGmailPasswordHere"),
EnableSsl = true,
Timeout = 10000
};
smtp.Send(mail);
Run Code Online (Sandbox Code Playgroud)
我明白了:
SMTP服务器需要安全连接或客户端未经过身份验证.服务器响应为:5.5.1需要身份验证.
我刚刚将EnableSsl指定为true,因此在安全连接方面不应该是问题.
我是从localhost运行的.是的,我输入auth(我的gmail帐户凭据)的用户名和密码是100%正确的.
这看起来非常简单.我需要从一些ASP.NET应用程序发送电子邮件.我需要始终如一地做到这一点,没有奇怪的错误,并且没有CPU利用率.我不是在谈论大量的电子邮件,只是偶尔的电子邮件.
System.Net.Mail 似乎被严重破坏.SmtpClient不会发出Quit命令(可能是因为Microsoft(R)对以下规范不感兴趣),因此连接保持打开状态.因此,如果有人在该连接最终关闭之前尝试通过电子邮件发送,则可能会从SMTP服务器收到有关打开过多连接的错误.这是Microsoft(R)完全不感兴趣修复的错误.看这里:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711
此外,如果你环顾一些建议使用此代码来解决此问题:
smtpClient.ServicePoint.MaxIdleTime = 1;
smtpClient.ServicePoint.ConnectionLimit = 1;
Run Code Online (Sandbox Code Playgroud)
好的,是的,这确实"解决"了连接被打开的问题.但是,如果您愿意,可以在服务器上进行尝试,这会使运行进程(在本例中为w3wp.exe)的CPU跳转并保持100%,直到您的应用程序池被回收.无论出于何种原因,运行mscorwks.dll!CreateApplicationContext的线程都是罪魁祸首.
这具有非常好的副作用,如果您在持续100%CPU使用率的Web主机上运行,您将禁用应用程序池.所以这并不像有些人所说的那样微不足道.
所以我的问题是该怎么办?我需要做的就是这么简单; 但是,那些"太多连接打开"错误是不可接受的,也不是100%的CPU使用率.我不想购买第三方组件,不是因为我便宜,而是因为我购买了足够的组件和MSDN订阅,因为简单的SMTP功能需要花费100到300美元.
我读到将MaxIdleTime设置得更高可能会有所帮助,但我对此持怀疑态度.我不想仅仅因为Microsoft不想遵循SMTP规范而冒着我的应用程序池被禁用的风险.
编辑: 我查看了quiksoft.com组件,但它不支持SMTP身份验证,它的成本为500美元.必须有一个解决这个问题的方法.
我正在研究一种使用C#中的邮件服务器安排电子邮件的工具.我一直在使用System.Net.Mail类来发送邮件.
最近我遇到了有关RFC违规和其他问题的各种问题,例如SmtpClient没有根据协议结束SMTP会话.这些问题中的每一个都在计入高垃圾邮件分数并影响电子邮件传递,因此我需要解决这些问题.
我想知道其他人为了解决这些问题而采取了什么措施.让人们开始使用第三方组件,如果是这样的话?
编辑:作为支持证据,请参阅:http://www.codeproject.com/KB/IP/MailMergeLib.aspx
使用ASP.NET C#中的SMTPClient类发送电子邮件时,如何将bcc添加到电子邮件中?如何将bcc添加到MailMessage实例?
我使用SMTPclient发送带附件的邮件.当附件超过2mb时,我收到以下错误:**"超出存储分配.服务器响应是:4.3.1消息大小超过固定的最大消息大小".**
1)我可以使用附件大小> 2mb的smtpclient发送电子邮件**.**如果是,附件的限制是多少.
2)如何解决上述错误?
如果你有解决方案,请给我一个想法.
我正在尝试基于VS2013项目模板中的示例AccountController为ASP.NET MVC5网站设置电子邮件确认.我已经实现了IIdentityMessageService
使用SmtpClient
,试图尽可能简单:
public class EmailService : IIdentityMessageService
{
public async Task SendAsync(IdentityMessage message)
{
using(var client = new SmtpClient())
{
var mailMessage = new MailMessage("some.guy@company.com", message.Destination, message.Subject, message.Body);
await client.SendMailAsync(mailMessage);
}
}
}
Run Code Online (Sandbox Code Playgroud)
调用它的控制器代码直接来自模板(由于我想排除其他可能的原因,因此将其解压缩为单独的操作):
public async Task<ActionResult> TestAsyncEmail()
{
Guid userId = User.Identity.GetUserId();
string code = await UserManager.GenerateEmailConfirmationTokenAsync(userId);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new { userId = userId, code = code }, protocol: Request.Url.Scheme);
await UserManager.SendEmailAsync(userId, "Confirm your account", "Please confirm your account by clicking <a …
Run Code Online (Sandbox Code Playgroud) 我在netsol服务器上托管了我的一个网站.从那里contact.aspx
必须使用交换服务器发送电子邮件.当我尝试发送电子邮件时:
错误:邮箱不可用.服务器响应为:5.7.1无法中继
码:
MailMessage message = new MailMessage(@"xxx@example.com",
@"test_user@yahoo.com",
"New Message",
"Exchange");
SmtpClient mail = new SmtpClient("exchange.abc.com", 29);
mail.EnableSsl = true;
mail.Credentials = new NetworkCredential(@"xxx@example.com", @"password");
mail.UseDefaultCredentials = false;
mail.DeliveryMethod = SmtpDeliveryMethod.Network;
mail.Send(message);
Run Code Online (Sandbox Code Playgroud)
我试过的选项:
这似乎是一个常见的错误,但是当我找到一个解决方法(见下文)时,我无法确定我首先得到它的原因.
我正在将SMTP功能写入我们的应用程序,并且我正在尝试将SSL功能添加到我们已有的工作SMTP中.
我正在测试使用我们公司的MS Exchange服务器,特别是在其上启用的webmail选项.我可以通过我的代码在内部发送电子邮件,不通过身份验证我的连接并匿名发送,但是由于我们公司的政策,这些电子邮件不会转发到外部电子邮件地址.除此之外,我正在为我们的客户编程,他们并不都允许开放中继和/或匿名连接.
我相信Exchange服务器正在使用显式SSL/TLS.我已经尝试telnet到端口25上的服务器地址并获得文本响应,人类可读的响应,根据我以前的一些搜索意味着它使用显式SSL/TLS.
我有以下测试代码
SmtpClient SMTPClient = new SmtpClient(webmailaddress);
SMTPClient.Port = 25;
SMTPClient.UseDefaultCredentials = true;
SMTPClient.EnableSsl = true;
System.Net.Mail.MailMessage Message = new `
System.Net.Mail.MailMessage(emailFrom,emailTo,subject,body);
SMTPClient.Send(Message);
Run Code Online (Sandbox Code Playgroud)
在我搜索解决方案期间,我遇到了"远程证书根据验证程序无效".使用Gmail SMTP服务器
从中我得到以下代码......
ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
public static bool ValidateServerCertificate(object sender,X509Certificate certificate,X509Chain chain,SslPolicyErrors sslPolicyErrors)
{
if (sslPolicyErrors == SslPolicyErrors.None)
return true;
else
{
if (System.Windows.Forms.MessageBox.Show("The server certificate is not valid.\nAccept?", "Certificate Validation", System.Windows.Forms.MessageBoxButtons.YesNo, System.Windows.Forms.MessageBoxIcon.Question) == System.Windows.Forms.DialogResult.Yes)
return true;
else
return false;
}
}
Run Code Online (Sandbox Code Playgroud)
这适用于我的测试代码.然而,我正在编写的实际过程(而不是我的测试代码)将在后台运行,并且无法真正询问用户(而是报告Windows错误日志中的错误).
在我开始时,我的问题就是为什么我会收到这个错误.如果我在浏览器中访问https:webmail.ourdomain.co.uk,它会显示一个有效的证书,并且没有安装证书的选项(正如我自己签署的那样).
然而,当我运行我的代码,并在ValidateServerCertificate方法调试中断Poing的,我看证书的价值观和看到我们的本地服务器的发行人"之前没有使用",且性能"后,不使用"今天.这与我得到的证书不符.
我还检查了ValidateServerCertificate调试中的sslPolicyErrors标志,它们显示"RemoteCertificateChainErrors"和"RemoteCertificateNameMismatch".
那么我对此缺少什么...为什么它没有使用正确的证书?如果我需要在本地安装证书才能使用它,那么我需要了解它们,这样我就可以告诉客户如果他们得到了这个,该怎么做.
我不想通过从ValidateServerCertificate方法返回true来绕过检查,并且因为它是后台进程我不能问用户,所以我需要了解如何让我的代码使用正确/可信证书.
希望有人可以提供建议.
当我尝试将电子邮件发送到包含突出字符(é)的地址时,SmtpClient.Send()方法抛出此异常:
System.Net.Mail.SmtpException:仅为具有ASCII本地部分的电子邮件地址配置客户端或服务器:léo.xxx@example.com.
在System.Net.Mail.Mail上的System.Net.Mail.MailAddress.GetAddress(布局allowUnicode)
中的System.Net.Mail.SmtpClient.ValidateUnicodeRequirement(MailMessage ...)(MailMessage ...
)
消息的制定使我可能有一个设置,我可以激活,以使这项工作,虽然我没有找到任何关于这个主题.
我尝试了几种SMTP服务器,包括Gmail.以下是repro的相关位:
码
var msg = new MailMessage();
msg.Subject = "Test";
msg.From = new MailAddress("xxx@gmail.com");
msg.To.Add(new MailAddress("léo.yyy@gmail.com"));
new SmtpClient().Send(msg);
Run Code Online (Sandbox Code Playgroud)
的app.config
<system.net>
<mailSettings>
<smtp from="xxx@gmail.com">
<network host="smtp.gmail.com" port="587" userName="xxx@gmail.com" password="password" enableSsl="true" />
</smtp>
</mailSettings>
</system.net>
Run Code Online (Sandbox Code Playgroud) smtpclient ×10
c# ×8
.net ×4
smtp ×4
asp.net ×3
email ×2
ssl ×2
asp.net-mvc ×1
async-await ×1
gmail ×1
outlook.com ×1
sharepoint ×1