这似乎是相当直截了当。我需要发送电子邮件从一些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退出命令发出后的处置,如当用于在采用区块。

我总是用Quiksoft的EasyMail.净件没有问题。

产品主页: http://www.quiksoft.com/emdotnet/

他们还有一个免费版本的成分如果你只需要发出电子邮件:

http://www.quiksoft.com/freesmtp/

我们有用 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  

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top