C# 立即发送电子邮件
简要想法:我正在开发一个小型社交网站 现在有一个用户“a”有100个追随者…现在我想做的是,每当用户“a”在网站上提交一篇文章,他的所有追随者都应该收到一封带有文章链接的电子邮件…没关系,我可以做到 问题:现在,页面上有一个提交按钮,将文章存储在数据库中,并向关注者发送电子邮件…因为有很多关注者,发送电子邮件需要花费很多时间…因此页面一直显示加载消息,直到发送完所有电子邮件。如何异步发送所有电子邮件 我的意思是在文章提交后…电子邮件应该自动发送给关注者,而无需在按钮的点击事件中设置电子邮件发送功能…希望我不会让你们困惑C# 立即发送电子邮件,c#,asp.net,vb.net,C#,Asp.net,Vb.net,简要想法:我正在开发一个小型社交网站 现在有一个用户“a”有100个追随者…现在我想做的是,每当用户“a”在网站上提交一篇文章,他的所有追随者都应该收到一封带有文章链接的电子邮件…没关系,我可以做到 问题:现在,页面上有一个提交按钮,将文章存储在数据库中,并向关注者发送电子邮件…因为有很多关注者,发送电子邮件需要花费很多时间…因此页面一直显示加载消息,直到发送完所有电子邮件。如何异步发送所有电子邮件 我的意思是在文章提交后…电子邮件应该自动发送给关注者,而无需在按钮的点击事件中设置电子邮件发送功
我是否可以将文章存储在数据库中,重定向到文章页面,开始以每10分钟10封的速度自动发送电子邮件…此过程应在用户提交文章后立即开始 我将创建一个数据库表,其中包含所有未决电子邮件通知的信息 点击submit时,您可以快速将行添加到此表。
然后,后台线程可以检查表并发送邮件(当然也可以从表中删除成功发送的邮件)。我在批处理邮件和其他各种长时间运行的任务方面也遇到了类似的问题 我开发了一个包含作业管理器的窗口服务。当作业需要从主MVC应用程序运行时,web应用程序通过HTTP(实际上是使用JSON)与服务通信,服务执行实际发送电子邮件或执行其他长时间运行的任务 这意味着web应用程序请求会立即返回
web应用程序还可以轮询服务,以确定正在运行的任何特定作业的状态(每个作业都有一个唯一标识符)。您可以使用排队系统,如
MassTransit
、ZMQ
或MSMQ
或者。。。如果你真的想创建一个很酷的应用程序,你可以将电子邮件任务传递给
node.js
app 您想过使用AJAX实现它吗
当用户按下submit按钮时,创建2个ajax调用,而不是发回服务器:
第一个是将文章保存到存储库(数据库?)
在收到来自服务器的成功回复(可以包括文章id)后,调用第二个ajax调用来发送邮件。服务器可以启动一个线程来发送邮件,这样就可以立即回复客户机
调用ajax调用的首选方法是使用JQuery:
$.ajax({
type: "POST",
url: "services.aspx/SubmitArticle",
data: "{articlecontent: '[put here the content you want to send]'}",
contentType: "application/json; charset=utf-8",
dataType: "json",
error: function(response) {
// Handle Error here. The response object contains the error details
},
success: function(response) {
// Check here if the article has been saved:
// response.d property contains the server answer. It can be boolean,
// integer, string or any other complex object
// If article saved, invoke here the send mail ajax call. assuming the response.d contains
// the article id:
sendMails(response.d);
// sendMails invokes another ajax similiar to this code snippest
}
});
在服务器端,异步电子邮件发送方法可以如下所示:
[WebMethod]
public static bool SendMails(int articleId)
{
// Add the actual method that send mail to the thread pool
ThreadPool.QueueUserWorkItem(new WaitCallback(DoSendMail), articleId);
return true;
}
private void DoSendMail(object a)
{
int articleId = (int)a;
// Your code that sends mails goes here
}
请注意,IIS/ASP.NET应用程序中的“后台线程”可能会导致IIS线程池出现问题…@Yahia:See and-如果操作正确,则不会导致任何问题。@user1150440查看Moo Juice的答案,这似乎是个好主意,并将其与“包含待定电子邮件通知的表”部分结合起来这个答案的答案-至少这是我解决这个问题的方法(Windows服务用于批量发送电子邮件等,结合DB表用于待处理的电子邮件和其他内容)…@winSharp93事实上是完全不同的。。。您的第一个链接谈到如何使其“更加健壮”-这并不意味着这是一个好主意,它只是说这是可能的(我不反对)…@winSharp93 IMO这是一个“快速而肮脏”的选项,而不是健壮的解决方案。。。它工作了一段时间,过了一段时间(网站增长/流量增加),它开始表现不好。。。然后,对问题的大搜寻开始了(因为人们通常会忘记这种类型的“技术债务”)。。。如果可能的话,我倾向于避免这样的“解决方案”…你能详细说明一下吗?或者你能给我提供一些代码样本或文章/帖子吗??我是一名学习者,-1代表
node.js
,当问题明确指出他是一名C#开发者时。为什么还要用另一种语言障碍来过度复杂化呢?语言障碍??什么?C#开发人员不懂JavaScript???我想说这让事情变得更简单了。