正如大家所说,让您的数据库来处理电子邮件是一个坏主意。让您的数据库写入外部文件是另一个坏主意,因为与数据库操作相比,IO 操作非常耗时。
有几种方法可以处理您的问题,我喜欢一种:有一个表格来排列您的通知/电子邮件和一个客户端程序来发送电子邮件。
在继续之前,您应该确保您有一个电子邮件帐户或可用于发送电子邮件的服务。它可以是 SMTP 或任何其他服务。
如果你在 .NET 上,你可以复制这个,如果不是,你知道如何在你的平台上重写
在您的数据库中创建一个表
CREATE TABLE `tbl_system_mail_pickup` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`mFrom` varchar(128) NOT NULL DEFAULT 'noreplyccms@YourDomain.co.uk',
`mTo` varchar(128) NOT NULL,
`mCC` varchar(128) DEFAULT NULL,
`mBCC` varchar(128) DEFAULT NULL,
`mSubject` varchar(254) DEFAULT NULL,
`mBody` longtext,
`added_by` varchar(36) DEFAULT NULL,
`updated_by` varchar(36) DEFAULT NULL,
`added_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`email_sent` bit(1) DEFAULT b'0',
`send_tried` int(11) DEFAULT '0',
`send_result` text,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
此表格将保存您的所有通知和电子邮件。您的表触发器或尝试发送电子邮件的事件将在上面的表中添加一条记录。然后,您的客户将按您指定的时间间隔接收电子邮件并发送。
这是一个 .NET 上的示例控制台应用程序,只是为了让您了解客户端的外观。您可以根据需要对其进行修改。 (我使用实体框架更简单)
- 在 Visual Studio 中创建新的控制台项目。
- 在包管理器控制台中,安装以下包(安装包 EntityFramework,安装包 MySQL.Data.Entity)
- 添加对 System.Configuration 的引用
- 现在打开“App.Config”文件并将连接字符串添加到 MySQL 数据库。
-
在同一个 App.Config 文件中,添加您的 SMTP 电子邮件设置。
检查您的端口和 ssl 选项
<system.net>
<mailSettings>
<smtp from="Noreplyccms@youractualEmailAccount.co.uk">
<network host="smtp.office365.com(your host)" port="587" enableSsl="true" password="dingDong" userName="YourUsername@YourDomain" />
</smtp>
</mailSettings>
在项目树中创建名为 Models 的新文件夹。
- 添加新项目 -> ADO.NET 实体数据模型 -> 数据库中的 EF 设计器
- 选择您的连接字符串 -> 在 App.Config 中勾选保存连接设置 -> 为您的数据库命名。
- 下一步 -> 从您的数据库中仅选择上表并完成向导。
现在您已经建立了与数据库和电子邮件配置的连接。是时候阅读并发送电子邮件了。
这是一个完整的程序来理解这个概念。如果您有 Win 应用程序或 Web 应用程序配合此想法,您可以修改它。
此控制台应用程序将每分钟检查一次新的电子邮件记录并发送它们。您可以扩展上表和此脚本以添加附件。
using System;
using System.Linq;
using System.Timers;
using System.Data;
using System.Net.Mail;
using ccms_email_sender_console.Models;
namespace ccms_email_sender_console
{
class Program
{
static Timer aTimer = new Timer();
static void Main(string[] args)
{
aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);// add event to timer
aTimer.Interval = 60000; // timer interval
aTimer.Enabled = true;
Console.WriteLine("Press \'q\' to exit");
while (Console.Read() != 'q');
}
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
var db_ccms_common = new DB_CCMS_COMMON(); // the database name you entered when creating ADO.NET Entity model
Console.WriteLine(DateTime.Now+"> Checking server for emails:");
aTimer.Stop(); /// stop the timer until we process current queue
var query = from T1 in db_ccms_common.tbl_system_mail_pickup where T1.email_sent == false select T1; // select everything that hasn't been sent or marked as sent.
try
{
foreach (var mRow in query)
{
MailMessage mail = new MailMessage();
mail.To.Add(mRow.mTo.ToString());
if (mRow.mCC != null && !mRow.mCC.ToString().Equals(""))
{
mail.CC.Add(mRow.mCC.ToString());
}
if (mRow.mBCC != null && !mRow.mBCC.ToString().Equals(""))
{
mail.CC.Add(mRow.mBCC.ToString());
}
mail.From = new MailAddress(mRow.mFrom.ToString());
mail.Subject = mRow.mSubject.ToString();
mail.Body = mRow.mBody.ToString();
mail.IsBodyHtml = true;
SmtpClient smtp = new SmtpClient();
smtp.Send(mail);
mRow.email_sent = true;
Console.WriteLine(DateTime.Now + "> email sent to: " + mRow.mTo.ToString());
}
db_ccms_common.SaveChanges(); // mark all sent emails as sent. or you can also delete the record.
aTimer.Start(); // start the timer for next batch
}
catch (Exception ex)
{
Console.WriteLine(DateTime.Now + "> Error:" + ex.Message.ToString());
// you can restart the timer here if you want
}
}
}
}
测试:运行上面的代码并将一条记录插入到您的 tbl_system_mail_pickup 表中。大约 1 分钟后,您将收到一封发给您指定发件人的电子邮件。
希望这对某人有所帮助。