Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 发送超过SMTP限制的电子邮件_C#_Asp.net_.net_Email - Fatal编程技术网

C# 发送超过SMTP限制的电子邮件

C# 发送超过SMTP限制的电子邮件,c#,asp.net,.net,email,C#,Asp.net,.net,Email,我为一个大约有100到120名成员的小组织维护网站 每个月,我们都会发送一封电子邮件,通知我们的成员我们将在即将召开的会议中讨论的主题 我试图使用我们的网站给我们发送这些电子邮件的方式,但我们的ASP托管网站有一个定义的限制,即每小时发送50封电子邮件 理论上,我想我可以在每次SmtpClient.Send(MailMessage)调用后使用线程将线程休眠1分钟。休眠(60000),如下所示: public const int ONE_MINUTE = 60000; public String

我为一个大约有100到120名成员的小组织维护网站

每个月,我们都会发送一封电子邮件,通知我们的成员我们将在即将召开的会议中讨论的主题

我试图使用我们的网站给我们发送这些电子邮件的方式,但我们的ASP托管网站有一个定义的限制,即每小时发送50封电子邮件

理论上,我想我可以在每次SmtpClient.Send(MailMessage)调用后使用线程将线程休眠1分钟。休眠(60000),如下所示:

public const int ONE_MINUTE = 60000;

public String SiteEmailAddress { get; set; }
public String SiteMailServer { get; set; }
public String SiteMailUserId { get; set; }
public String SiteMailPwd { get; set; }

public void BulkEmail(String emailMessage) {
    using (var msg = new MailMessage()) {
        msg.From = new MailAddress(SiteMailAddress);
        msg.Body = emailMessage;
        msg.DeliveryNotificationOptions = DeliveryNotificationOptions.OnFailure;
        using (var server = new SmtpClient(SiteMailServer, 25)) {
            server.Credentials = new NetworkCredential(SiteMailUserId, SiteMailPwd);
            foreach (var person in Personnel.GetActiveMembers()) {
                var msgTo = person.PersonalEmail;
                if (!String.IsNullOrEmpty(msgTo)) {
                    msg.To.Clear();
                    msg.To.Add(new MailAddress(msgTo, person.FullName));
                    server.Send(msg);
                    System.Threading.Thread.Sleep(ONE_MINUTE);
                }
            }
        }
    }
}
这要么会让我们的网站在运行过程中死机一个多小时,要么很可能会失败


做这件事的简单解决方案是什么?我们使用sendgrid为我们的网站发送电子邮件,每月免费限额为12000封
可能是更简单的选择?

不要使用web服务器发送电子邮件

邮件发送API为您处理。这里不是推荐特定产品的地方,所以我不推荐



如果你打算通过网络服务器发送电子邮件,不要在网络线程上发送。将您的电子邮件发送状态存储在数据库中,一次发送一封,在单独的线程上执行,或使用单独的应用程序。

如果您决定从web服务器发送电子邮件,您可以使用ASP.NET中的后台任务。您可以让它一次处理50封邮件,然后在继续之前等待一小时的剩余时间,或者在每封邮件之间等待72秒,这样您最多每小时发送50封邮件。

根据您的情况,我建议一些解决方案:
1-例如,计划每1.2分钟运行一次任务,此任务将调用电子邮件发件人方法,而不需要使用睡眠。
如何在asp.net网站中安排任务的示例:

2-手动或使用代码(如果您的主机允许)在windows任务计划程序中添加新任务,并使此任务调用您网站中发送电子邮件的页面


3-在一个单独的线程中创建一个单独的应用程序,在不影响主网站性能的情况下处理电子邮件发送过程(可能是windows服务、控制台应用程序或普通windows应用程序)。

首先,创建后台线程并使其休眠不会以任何方式终止应用程序。它只需从线程池中取出线程并将其锁定,直到操作完成,然后再对其进行处理

尽管这在高流量应用程序和有限线程池上可能会出现问题,因为在这些应用程序中,必须同时处理多个请求。另一个要考虑的是,每个应用程序关闭,如果运行,此任务将被取消。但如果这不是你的问题,你想要一个简单的解决方案,那就是


我建议您使用外部API,让它为您处理。

主要电子邮件提供商采取的垃圾邮件预防措施很可能将来自未知域的邮件标记为垃圾邮件。如果清除
msg,你最好使用第三方提供商进行群发邮件。要在你的循环中添加所有最近的邮件并发送一封电子邮件……我很确定我的技术是错误的,但我以前从未尝试过或见过这样做。我欢迎链接到邮件发送API,但它是一个非盈利的退伍军人组织。我已经自费购买了该网站。SendGrid和Mailgun都为每月发送大约10000封电子邮件的用户提供免费分层。我注册了一个Mailgun帐户并更新了我的域设置。不过,这需要几天时间才能开始。那么,我在托管域上的普通电子邮件是否仍能正常工作,或者Mailgun是否会接管所有的工作?我没有找到一个办法获得SendGrid的免费帐户。这听起来是一个不错的计划,但这是为一个非盈利的老兵团体准备的。我支付的网站,我自己的口袋,因为它是现在。他们最基本的套餐是40000封电子邮件每月10美元。这是我们所能使用的容量的100倍。如果40000是您所需容量的100倍,那么免费软件包中提供的12000就足够您发送400封电子邮件。