.净最好的方法发送电子邮件(系统。网。邮件都有问题的)
-
06-09-2019 - |
题
这似乎是相当直截了当。我需要发送电子邮件从一些ASP.NET 应用程序。我需要做到这一贯毫不奇怪的错误和没有利用CPU会通过的屋顶。我不是在谈论大规模电子邮件,只是偶尔的电子邮件。
系统。网。邮件 出现 是可怕的破坏。SmtpClient不发出的退出命令(这可能是因为微软(R)没有兴趣在下面的规范),因此连接是敞开。因此,如果有人试图向电子邮件之前,该连接 最后 关闭,你可以得到错误的SMTP Server关于太多的连接打开。这是一个错误,Microsoft(R)是完全不感兴趣,在固定。在这里看到:
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=146711
还有,如果你看看周围有些人建议使用这个代码解决这个问题:
smtpClient.ServicePoint.MaxIdleTime = 1;
smtpClient.ServicePoint.ConnectionLimit = 1;
好吧,是的,这并"解决"的问题连接被打开。然而,这种一贯的,试试它的服务器上,如果你喜欢,使CPU在这过程中(在这种情况下w3wp.exe)是运行跳跃,并保持在100%,直到你应用游泳池的再循环。无论出于何种原因,在线运行mscorwks.dll!CreateApplicationContext是罪魁祸首。
这具有非常好的副作用,如果你是上运行的一个网的主机皱眉头上的持续100%的占用,你会得到你应用游泳池的残疾人。因此,这是不平凡的一些建议。
所以我的问题是做什么的?什么,我需要做的就是那么简单;然而得到的那些"太多的连接打开"错误是不可接受的,也不是100%的中央处理器使用率。我不想购买第三方成分,不是因为我的便宜,但是我买了足够的部件和MSDN订阅,它似乎疯狂的有掏出100美元-300美元,用于简单的SMTP的功能。
我读了设置MaxIdleTime高可以帮助,但我怀疑的那样。我不想冒险我的应用程序的游泳池被禁止,只是因为Microsoft不会想要按照SMTP规范。
编辑: 我看了看quiksoft.com 部件,但是它不支持SMTP身份验证和费用500美元。我们有了一个解决这个问题。
解决方案
我面临着同样的CPU利用问题,与设置的描述。最后我打开了票,与Microsoft,以确定导致的问题。CPU利用问题在于ServicePoint类。内部ServicePoint类,有一个定时器运行的每个(MaxIdleTime/2)毫秒。看到这个问题?通过改变MaxIdleTime值为2,CPU利用率将下降到正常水平。
其他提示
中。净4.0,SmtpClient现在是一次性的。SMTP退出命令发出后的处置,如当用于在采用区块。
我们有用 hMailserver 取得了巨大成功。配置可能需要一段时间才能得到使用,但它一直是一个伟大的--自由--邮件服务器产品。
如果你想滚你自己(而我几年前当我是具有承担的时间与CDONTS),可启动与以下代码和自定义你的心脏的内容。它使用TcpClient创建一个TCP直接连接到邮件服务器.不,我想建议这个时候有这么多的建立和调试解决方案,但是我发现这很有用于调试和确定这里的问题是与预制MS邮件组件。
private void Send_Email()
{
#region Email Sending Function
string strMail = "";
try
{
// See RFC821 http://www.faqs.org/rfcs/rfc821.html for more specs
// TcpClient is an abstraction of a TCP Socket connection
TcpClient myTCP = new TcpClient();
// Connect to the mail server's port 25
myTCP.Connect(mailserver, 25);
// Open a network stream which sends data to/from the TcpClient's socket
System.Net.Sockets.NetworkStream ns = myTCP.GetStream();
// The data to send to the mail server, basically a raw SMTP mail message
strMail = "HELO\n";
strMail += "MAIL FROM:from@address.com\n";
strMail += "RCPT TO:" + recipient + "\n";
strMail += "DATA\n";
strMail += "Subject: mySubject\n";
strMail += "To:" + recipient + "\n";
strMail += "From: \"From Real Name\" <from@address.com>\n";
strMail += "\n";
strMail += " ---------------------------------------\n";
strMail += "Name: " + txtName.Text + "\n";
strMail += "Address1: " + txtAddress1.Text + "\n";
strMail += "Address2: " + txtAddress2.Text + "\n";
strMail += "City: " + txtCity.Text + "\n";
strMail += "State: " + txtState.Text + "\n";
strMail += "Zip: " + txtZip.Text + "\n";
strMail += "Email: " + txtEmail.Text + "\n";
strMail += "Dealer: " + txtDealer.Text + "\n";
strMail += " ---------------------------------------\n";
strMail += "THIS IS AN AUTOMATED EMAIL SYSTEM. DO NOT REPLY TO THIS ADDRESS.\n";
strMail += "\n.\n";
// Defines encoding of string into Bytes (network stream needs
// an array of bytes to send -- can't send strings)
ASCIIEncoding AE = new ASCIIEncoding();
byte[] ByteArray = AE.GetBytes(strMail);
// send the byte-encoded string to the networkstream -> mail server:25
ns.Write(ByteArray, 0, ByteArray.Length);
//ns.Read(ByteArray, 0, ByteArray.Length);
//lblStatus.Text = ByteArray.ToString();
// close the network stream
ns.Close();
// close the TCP connection
myTCP.Close();
}
catch(Exception ex)
{
throw new Exception("Couldn't send email: <p>" + ex.Message);
}
#endregion
}
虽然我没有任何具体问题 System.Net.Mail
迄今为止,你总是可以使用旧的 System.Web.Mail
API这是一个包装升级.
我用Quicksoft在过去的并没有怨言。另一件事情你可以尝试开关SMTP配置,以使用一个摄的文件夹代替发送使用的网络,该网络应当得到周围的"这不会发送退出"的问题。
我给我的邮件使用Sproc.我甚至可以附加文件。
CREATE PROCEDURE [dbo].[sendMail_With_CDOMessage] @to VARCHAR(64), @CC VARCHAR(1024)='', @BCC VARCHAR(1024)='', @subject VARCHAR(500)='', @body VARCHAR(8000)='' , @from VARCHAR(64), @filename VARCHAR(255)='', @priority INT = 0 AS BEGIN SET NOCOUNT ON DECLARE @handle INT, @return INT, @s VARCHAR(64), @sc VARCHAR(1024), @up CHAR(27), @server VARCHAR(255) SET @s = '"http://schemas.microsoft.com/cdo/configuration/' SELECT @s = 'Configuration.Fields(' + @s, @up = 'Configuration.Fields.Update', @server = 'smtp.yourdomain.com' EXEC @return = sp_OACreate 'CDO.Message', @handle OUT SET @sc = @s + 'sendusing").Value' EXEC @return = sp_OASetProperty @handle, @sc, '2' SET @sc = @s + 'smtpserver").Value' EXEC @return = sp_OASetProperty @handle, @sc, @server EXEC @return = sp_OAMethod @handle, @up, NULL EXEC @return = sp_OASetProperty @handle, 'To', @to EXEC @return = sp_OASetProperty @handle, 'CC', @CC EXEC @return = sp_OASetProperty @handle, 'BCC', @BCC EXEC @return = sp_OASetProperty @handle, 'From', @from EXEC @return = sp_OASetProperty @handle, 'Subject', @subject EXEC @return = sp_OASetProperty @handle, 'HTMLBody', @body EXEC @return = sp_OASetProperty @handle, 'Priority', 'cdoHigh' IF @filename IS NOT NULL EXEC @return = sp_OAMethod @handle, 'AddAttachment', NULL, @filename EXEC @return = sp_OAMethod @handle, 'Send', NULL IF @return 0 BEGIN PRINT 'Mail failed.' IF @from IS NULL PRINT 'From address undefined.' ELSE PRINT 'Check that server is valid.' END ELSE PRINT 'Mail sent.' EXEC @return = sp_OADestroy @handle END