{"id":29890028,"url":"https://github.com/aoxetech/aoxe.email","last_synced_at":"2025-09-04T04:17:54.032Z","repository":{"id":108956518,"uuid":"119014012","full_name":"AoxeTech/Aoxe.Email","owner":"AoxeTech","description":"For cloud neutrality, we may need a tool that can help us manage our email more efficiently. Aoxe.Email is such a tool. It is a powerful email client that can help you send emails, and avoids being tied to the cloud.","archived":false,"fork":false,"pushed_at":"2025-07-12T01:29:15.000Z","size":225,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-08-30T07:58:13.429Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/AoxeTech.png","metadata":{"files":{"readme":"README-zh_CN.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2018-01-26T06:19:54.000Z","updated_at":"2025-07-12T01:29:19.000Z","dependencies_parsed_at":"2023-12-24T16:26:26.601Z","dependency_job_id":"9e2f4bb0-01d3-46cc-95cd-f98d9f6c1fb6","html_url":"https://github.com/AoxeTech/Aoxe.Email","commit_stats":null,"previous_names":["aoxetech/aoxe.email","picohex/zaabee.email","mutuduxf/zaabee.emailutility","mutuduxf/zaabee.email"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/AoxeTech/Aoxe.Email","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AoxeTech%2FAoxe.Email","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AoxeTech%2FAoxe.Email/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AoxeTech%2FAoxe.Email/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AoxeTech%2FAoxe.Email/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/AoxeTech","download_url":"https://codeload.github.com/AoxeTech/Aoxe.Email/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/AoxeTech%2FAoxe.Email/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273064956,"owners_count":25039267,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-31T02:00:09.071Z","response_time":79,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-07-31T22:23:27.181Z","updated_at":"2025-09-04T04:17:54.011Z","avatar_url":"https://github.com/AoxeTech.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Aoxe.Email\n\n[English](README.md) | 简体中文\n\n电子邮件作为数字时代的信息使者，已经超越了时间和空间的限制，以其独特而深远的影响力，悄然融入了人类文明的血脉。\n\n为了实现云中立，我们可能需要一款能帮助我们更高效地管理电子邮件的工具。Aoxe.Email就是这样一款工具。它是一款功能强大的电子邮件客户端，可以帮助您发送电子邮件，并避免与云绑定。\n\n---\n\n## 1. Aoxe.Email 是什么?\n\nAoxe.Email 有以下几种发送邮件的实现:\n\n### 1.1. Aoxe.Aws.SimpleEmail\n\n这是 Amazon SES API 第 2 版的首次发布。您可以使用此 API 配置您的 Amazon SES 账户并发送电子邮件。此 API 扩展了前一版本 Amazon SES API 中的功能.\n\n### 1.2. Aoxe.Azure.Email\n\n通过该客户端库，可以使用 Microsoft Azure Communication Email 服务。\n\n### 1.3. Aoxe.MailKit\n\nMailKit 是一个开源跨平台 .NET 邮件客户端库，它基于 MimeKit 并针对移动设备进行了优化。\n\n### 1.4. Aoxe.SmtpClient\n\n使用了 System.Net.Mail.SmtpClient.\n\n## 2. 如何使用 Aoxe.Email?\n\n### 2.1. 安装 package\n\n```bash\nPM\u003e Install-Package Aoxe.Aws.SimpleEmail\nPM\u003e Install-Package Aoxe.Azure.Email\nPM\u003e Install-Package Aoxe.MailKit\nPM\u003e Install-Package Aoxe.SmtpClient\n```\n\n### 2.2. 注册 email provider\n\n我们可以很容易地切换不同的实现, 因为所有实现都基于同样的抽象.\n\n```csharp\n// 请使用您自己的 host 和 端口, 当然您还可以使用账号密码等功能\nserviceCollection.AddMailKit(\"your host\", 25);\nserviceCollection.AddSmtpClient(\"your host\", 25);\n// AWS 和 Azure 的 Add 方法还有不同的方法重载, 以匹配它们的构造函数以适应不同的场景\nserviceCollection.AddAwsSimpleEmail(\"awsAccessKeyId\", \"awsSecretAccessKey\");\nserviceCollection.AddAzureEmail(\"connectionString\");\n```\n\n通过依赖 Aoxe.Email.Abstractions 注入 email provider.\n\n```shell\nPM\u003e Install-Package Aoxe.Email.Abstractions\n```\n\n```csharp\npublic class EmailService\n{\n    private readonly IEmailProvider _emailProvider;\n\n    public EmailService(IEmailProvider emailProvider)\n    {\n        _emailProvider = emailProvider;\n    }\n\n    public async Task SendEmailAsync(string subject, string text, string fromAddress, string toAddress)\n    {\n        var email = new Abstractions.Models.Email();\n        email\n            .Subject(subject)\n            .TextBody(email)\n            .EmailFrom(fromAddress)\n            .EmailTo(toAddress);\n        // 您可以使用扩展方法来发送邮件\n        await email.SendByAsync(_emailProvider);\n        // 也可以使用 provider 发送邮件\n        await _emailProvider.SendAsync(email);\n    }\n}\n```\n\n### 2.3. Lazy 注册\n\n所有的 email providers 都提供了自动的 lazy 注册, 这对提高性能和减少资源使用非常有用。下面是一个例子:\n\n```csharp\npublic class EmailService\n{\n    private readonly Lazy\u003cIEmailProvider\u003e _emailProvider;\n\n    public EmailService(Lazy\u003cIEmailProvider\u003e emailProvider)\n    {\n        _emailProvider = emailProvider;\n    }\n\n    public async Task SendEmailAsync(string subject, string text, string fromAddress, string toAddress)\n    {\n        var email = new Abstractions.Models.Email();\n        email\n            .Subject(subject)\n            .TextBody(email)\n            .EmailFrom(fromAddress)\n            .EmailTo(toAddress);\n        // 从 Lazy\u003cT\u003e 获取 IEmailProvider\n        var provider = _emailProvider.Value;\n        // 您可以使用扩展方法来发送邮件\n        await email.SendByAsync(provider);\n        // 也可以使用 provider 发送邮件\n        await provider.SendAsync(email);\n    }\n}\n```\n\n## 3. 关于 Aoxe.Email.Abstractions.Models.Email\n\nAoxe.Email.Abstractions.Models.Email 类是电子邮件的综合表示法。下面简要介绍一下它的结构和功能：\n\n1. 它使用主构造函数来选择性地设置 ID。\n2. 它具有各种电子邮件组件的属性，如 From、Sender、ReplyTo、Recipients、Content 和 Attachments。\n3. 该类实现了流畅的接口模式，允许使用方法链来轻松组成电子邮件。\n\n主要功能:\n\n1. 附件处理（单个和多个）\n2. 设置电子邮件主题、正文和 HTML 正文\n3. 管理电子邮件地址（发件人、收件人、抄送人、密送人、回复人、发件人）\n4. 每个方法都返回此值，从而实现方法链风格。\n\n您可以这样实例化一个 Email 对象:\n\n```csharp\nvar (fileName, fileBytes) = await FileHelper.LoadFileBytesAsync(\"AttachmentTestFile.txt\");\n_ = new Models.Email\n{\n    From = new EmailAddress(\"from@fake.com\", \"from\"),\n    Sender = new EmailAddress(\"sender@fake.com\", \"sender\"),\n    Recipients = new EmailRecipients\n    {\n        To = [new EmailAddress(\"to@fake.com\", \"to\")],\n        Cc = [new EmailAddress(\"cc@fake.com\", \"cc\")],\n        Bcc = [new EmailAddress(\"bcc@fake.com\", \"bcc\")],\n    },\n    ReplyTo = [new EmailAddress(\"replyto@fake.com\", \"replyTo\")],\n    Content = new EmailContent\n    {\n        Subject = \"Subject\",\n        TextBody = \"TextBody\",\n        HtmlBody = \"HtmlBody\",\n    },\n    Attachments = [new EmailAttachment(fileName, fileBytes)]\n};\n```\n\n还可以使用 fluent style:\n\n```csharp\nvar email = new Models.Email();\nemail\n    .Subject(\"subject\")\n    .TextBody(\"textBody\")\n    .HtmlBody(\"htmlBody\")\n    .EmailFrom(\"address\", \"name\")\n    .EmailTo(\"address0\", \"name0\")\n    .EmailTo([new EmailAddress(\"address1\", \"name1\"), new EmailAddress(\"address2\", \"name2\")])\n    .EmailCc(\"address0\", \"name0\")\n    .EmailCc([new EmailAddress(\"address1\", \"name1\"), new EmailAddress(\"address2\", \"name2\")])\n    .EmailBcc(\"address0\", \"name0\")\n    .EmailBcc(\n        [new EmailAddress(\"address1\", \"name1\"), new EmailAddress(\"address2\", \"name2\")]\n    )\n    .EmailReplyTo(\"address0\", \"name0\")\n    .EmailReplyTo(\n        [new EmailAddress(\"address1\", \"name1\"), new EmailAddress(\"address2\", \"name2\")]\n    )\n    .EmailSender(\"address\", \"name\");\nvar (fileName, fileBytes) = await FileHelper.LoadFileBytesAsync(\"AttachmentTestFile.txt\");\nemail\n    .Attach(fileName, fileBytes)\n    .Attach([new(fileName, fileBytes), new(fileName, fileBytes)]);\n```\n\n在每个实现包中，Aoxe.Email.Abstractions.Models.Email 都有其扩展方法，可将其转换为电子邮件客户端所需的指定电子邮件模型：\n\n```csharp\n// 返回 Amazon.SimpleEmailV2.Model.SendEmailRequest, 可用于 IAmazonSimpleEmailServiceV2\nemail.ToSendEmailRequest();\n// 返回 Azure.Communication.Email.EmailMessage, 可用于 Azure.Communication.Email.EmailClient\nemail.ToEmailMessage();\n// 返回 MimeKit.MimeMessage, 可用于 IMailTransport\nemail.ToMimeMessage();\n// 返回 System.Net.Mail.MailMessage, 可用于 System.Net.Mail.SmtpClient\nemail.ToMailMessage();\n```\n\n这将帮助您在使用电子邮件客户端时进行更多定制，以下是 Aoxe.MailKit 中的示例：\n\n```csharp\nvar email = new Models.Email();\nvar mimeMessage = email.ToMimeMessage();\n// 使用 memory stream 作为示例\nvar smtpClient = new SmtpClient(new ProtocolLogger(new MemoryStream()));\nawait smtpClient.ConnectAsync(host, port);\n// 如果需要认证\nawait smtpClient.AuthenticateAsync(userName, password);\nawait _mailTransport.SendAsync(mimeMessage, cancellationToken);\n```\n\nThank`s for [JetBrains](https://www.jetbrains.com/) for the great support in providing assistance and user-friendly environment for my open source projects.\n\n[![JetBrains](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg?_gl=1*f25lxa*_ga*MzI3ODk2MjY0LjE2NzA0NjY4MDQ.*_ga_9J976DJZ68*MTY4OTY4NzY5OS4zNC4xLjE2ODk2ODgwMDAuNTMuMC4w)](https://www.jetbrains.com/community/opensource/#support)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faoxetech%2Faoxe.email","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faoxetech%2Faoxe.email","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faoxetech%2Faoxe.email/lists"}