IRONSOFTWAREHOME

C#发送电子邮件:深度剖析Tim Corey

C# 应用程序从头到尾课程 26 - 向用户发送电子邮件

Tim Corey

1小时11分钟27秒

欢迎您全面了解如何在C# Windows Forms应用程序中发送电子邮件,灵感来自Tim Corey的"C#应用程序从头到尾 – 第26课"。在这个课程中,Tim演示了如何构建电子邮件发送功能,尤其是在锦标赛跟踪应用程序的背景下。

事务性电子邮件——由用户操作触发的自动化、个性化消息——是现代网络应用程序的重要组成部分。 C# web应用程序通常依赖于事务性电子邮件API,例如Mailgun和SendGrid,以实现可靠和可扩展的生产就绪电子邮件的发送。

本文将指导您完成Tim演示的过程,包括决定放置电子邮件代码的位置、创建辅助方法、构建动态电子邮件以及使用内置的C#库发送邮件。 Visual Studio是开发和测试C#应用程序中电子邮件功能的主要IDE。

像Mailtrap这样的电子邮件发送平台可以用于在开发过程中监控送达率并测试电子邮件发送。

简介

Tim开始提醒我们核心要求:每次只能进行一轮比赛。这意味着一轮比赛完成后,球队需要被通知他们的下一场比赛。 这些通知电子邮件是一种事务性电子邮件,通常在响应用户在web应用程序中的操作时自动发送。 电子邮件是一种实用的解决方案,可以确保参与者及时获得信息,Tim会逐步讲解如何构建此功能。

使用专用电子邮件服务,例如Amazon SES,可以帮助确保这些事务电子邮件的可靠和可扩展的发送。

决定电子邮件逻辑的位置

Tim从一个关键问题入手:电子邮件逻辑应该放在哪里? 他解释说,这应该放在应用程序已经执行关键比赛逻辑的地方。 在这种情况下,最佳位置是在UpdateTournamentResults方法内部。

为何在这里? 因为此方法处理:

确定比赛的胜者

将团队晋级到下一轮

更新数据库或文件存储

通过将电子邮件逻辑放在这里,我们只在一轮游戏完成后发送电子邮件,从而避免了不必要地向用户发送垃圾邮件。

Tim介绍了一种策略,用于在更新结果之前和之后跟踪当前回合:

如果轮数改变,我们就知道新一轮开始了。

  • 这将触发向用户发送关于即将到来的对决的电子邮件通知。

检查当前轮次

为了确定回合是否发生了变化,Tim创建了一个名为CheckCurrentRound的扩展方法。 该方法遍历锦标赛模型中的所有轮次,并检查每轮中的每场比赛是否都有获胜者。

如果所有对战都已完成,则增加一个输出变量。

如果一个回合不完整,将停止检查后续回合。

此方法在评估锦标赛状态后返回当前回合数。

Tim强调从1开始输出可以处理尚未完成任何回合的情况。 通过使用此方法,应用程序可以动态检测新一轮的开始并触发电子邮件。

将邮件逻辑提取到单独的类中

Tim倡导创建一个专用的EmailLogic类。 这种方法:

将与电子邮件相关的代码与比赛逻辑分开

使其可以在整个应用程序中重用

有助于未来扩展,例如发送付款提醒或赛事总结。

建议为现代C#应用程序使用专用的电子邮件客户端库,如MailKit,因为它提供强大的功能和比过时的SmtpClient类更好的支持。

他设置了一个公共静态方法,名为SendEmail,带有参数:

  • 来自 (sender email)

  • To (收件人邮箱)

  • 主题

身体

MailKit中的BodyBuilder类可以用来高效地构建HTML邮件并添加附件,使发送包含PDF等文件的邮件更为便捷。

Tim建议在第一个版本中保持简单,如有需要,可在之后添加CC和BCC。

准备当前轮次的通知

一旦确定了当前轮次,Tim 就使用 LINQ 提取该轮次的对阵列表。 每场比赛都包含两个参赛队伍的条目。

对于每场比赛,他依次循环:

每个团队条目

  1. 每位团队成员

这可以确保每个人都会收到关于他们即将到来的比赛的电子邮件。在向多个收件人发送电子邮件时,可以使用InternetAddressList类和AddRange方法,一次性高效地添加所有收件人的电子邮件地址。 验证每个收件人的电子邮件地址也很重要,以确保成功投递。

Tim强调收集所有必要信息的重要性,例如:

参与者的姓名和电子邮件

他们的队名

对手队名

生成动态电子邮件内容

然后,Tim 专注于动态构建电子邮件主题和正文:

主题:简单明了,例如,"您有一个新的对手是'滚雷'队。"主题通常在代码中使用字符串变量设置,然后分配给电子邮件消息。

正文:Tim 使用 StringBuilder 来高效地连接多行文本。 他解释说,在 C# 中反复添加字符串效率不高,因为每次添加都会创建新的内存分配。

在生成电子邮件内容时,Tim 考虑是否发送纯文本邮件或 HTML 邮件。 纯文本邮件简单,与所有电子邮件客户端兼容,通常用于内部通知或事务性消息。 另一方面,HTML 邮件允许更丰富的格式。 同时发送 HTML 和纯文本版本可以提高送达率,并确保与各种电子邮件服务提供商的兼容性。 您可以通过将 MailMessage 类的 IsBodyHtml 属性设置为 true 来在 C# 中发送 HTML 邮件,或者使用 MailKit 库并修改消息正文以包含 HTML 内容。 using StringBuilder 可以让应用程序:

  • 处理多行个性化消息

  • 包括对手队和轮次信息等细节

  • 即使发送数百封电子邮件也能避免性能问题

Tim 还处理特殊情况,如轮空周,球队没有对手。

验证电子邮件地址

发送前,Tim 检查参与者是否拥有有效的电子邮件地址。 他指出:

  • 即使是对空字符串进行简单检查也能防止错误

  • 完整的验证(如正则表达式)是可能的,但对于大数据集可能过于昂贵

  • 对于大多数应用程序,验证电子邮件存在即可

这一步确保只有提供了电子邮件的参与者才会收到通知。

配置发件人地址

Tim 解释说,发件人电子邮件应存储在 App.config 中以实现灵活性。 他添加了:

  • senderEmail 表示实际的电子邮件地址

  • senderDisplayName 表示发件人的名称

许多电子邮件服务,如 Amazon SES,要求进行域验证以确保正确的可送达性并避免垃圾邮件过滤器。 此过程涉及添加和验证您的域,然后才能可靠地通过其 API 发送电子邮件。

随后,一个 GlobalConfig 辅助工具检索这些值。 这种抽象允许更改发件人信息而无需修改电子邮件逻辑代码。

设置 MailMessage

要发送电子邮件,Tim 使用 C# 内置的 System.Net.Mail 命名空间。 步骤包括

  1. 为发件人创建一个新的 MailAddress,包含显示名称。 配置新邮件地址时,请确保程序化发送电子邮件的帐户设置和身份验证正确。

  2. 实例化一个 MailMessage 对象

  • 添加收件人电子邮件地址

  • 设置主题和正文

MailMessage 类允许您使用 Attachments 属性添加附件。 您可以通过将 MailMessage 类的 IsBodyHtml 属性设置为 true 来在 C# 中发送 HTML 邮件。

使用 SMTP 客户端

最后,Tim 设置 SMTP 客户端以发送电子邮件:

  • 配置主机、端口、凭据,并在需要时启用 SSL。 虽然您可以使用自己的 SMTP 服务器,但使用像 Amazon Simple Email Service (SES) 这样的基于云的电子邮件服务通常更可靠和可扩展。

  • 调用 Send(mail) 以传输消息

  • 这处理通过 Gmail、Outlook 或自定义服务器等标准 SMTP 服务器,或通过 Amazon SES、Mailgun 或 Mailtrap 等电子邮件服务发送电子邮件。

Amazon SES (Simple Email Service) 是 AWS 提供的一种经济高效且可扩展的电子邮件服务,用于快速发送事务性电子邮件。 要将 Amazon SES 集成到 C# 应用程序中,您需要安装 AWS SES Package,并可能需要使用认证令牌以确保安全访问。 在配置 SMTP 设置时,确保应用程序的安全访问是很重要的,特别是在使用如 Gmail 或 Office365 这样的服务时,以确保适当的认证和安全性。

他指出,电子邮件服务器通常会对"发件人"地址实施限制以确保安全,并推荐使用模拟或沙盒服务器进行测试。

电子邮件流程总结

总结 Tim 的过程:

  1. 在更新结果之前检测当前赛段

  2. 更新比赛结果,并检测比赛是否进入下一轮

  3. 提取新赛段的对决

  4. 遍历所有参与者和队员

  5. 生成动态的电子邮件主题和正文

  6. 验证电子邮件地址

  7. 通过 GlobalConfig 从 App.config 检索发件人信息

  8. 使用 MailMessage 和 SmtpClient 发送电子邮件

要大规模发送事务性电子邮件,建议使用如 SendGrid 或 Mailgun 的事务性电子邮件 API。 许多服务提供免费的初始测试计划——例如,SendGrid 允许您每天发送100封电子邮件,并提供邮件性能分析。 始终使用环境变量或像 Azure Key Vault 或 AWS Secrets Manager 这样的安全库来存储 C# 应用程序中的敏感凭证。 在开发期间,您可以使用 .NET run 来启动您的应用程序并测试电子邮件发送功能。

Tim 强调抽象和模块化:通过隔离电子邮件逻辑,使应用程序更易于维护、测试和扩展。

最后的想法

Tim Corey 的课程表明,在 C# 应用程序中发送电子邮件不仅仅是调用 SmtpClient.Send()。 这需要仔细考虑何时发送电子邮件、收集相关信息、验证收件人,以及为可维护性结构化代码。 .NET Framework通过简单邮件传输协议(SMTP)提供了强大的电子邮件发送支持,这是从 C# 应用程序发送电子邮件最常见的方法。

通过遵循 Tim 的方法,开发人员可以构建可扩展的、可重用的电子邮件功能,无论是比赛追踪器、通知系统还是其他基于用户的服务。 使用现代库和协议如 SMTP 以保证在 C# 应用程序中可靠和可维护的电子邮件功能。

Earn More by Sharing What You Love

Do you create content for developers working with .NET, C#, Java, Python, or Node.js? Turn your expertise into extra income!

Let's Stay in Touch!

Join our newsletter, you’ll get exclusive access on article updates. We value your privacy

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户