NET Coreでメールを送信するFluentEmail

NET Coreでメールを送信するFluentEmail

実際のプロジェクト開発では、異常アラーム、メッセージ、進捗通知など、プログラムを通じてメールを送信する必要がある多くのシナリオに遭遇します。

最后更新 2020/11/28 9:18
yi念之间
预计阅读 10 分钟
分类
.NET
标签
.NET C# Web API メールの送信 FluentEmail

前のページ

実際のプロジェクト開発では、異常アラーム、メッセージ、進捗通知など、プログラムを通じてメールを送信する必要がある多くのシナリオに遭遇します。通常、ほとんどのシナリオに対応するネイティブのSmtpClientライブラリを使用しています。しかし、使いやすさは十分ではなく、多くのシナリオでは独自のカプセル化アプローチが必要で、コード量はかなりあります。幸いなことに、ほとんどのユースケースに対応し、使いやすくパワフルな素晴らしいコンポーネントがあります。今日お話しするFluentEmailです。これは、実際にプロジェクトで使用しているメール送信コンポーネントです。. NET Coreでメールを送信する必要がある場合は、試してみることをお勧めする。

FluentEmail

FluentEmailは、GitHub 上の. Netと. NET Coreメール送信コンポーネントを無料でサポートするオープンソースで、現在1,000以上のStarがあり、. NET Coreが成熟するにつれて、Starの成長傾向は非常に急速です。GitHubアドレスはhttps//github.com/lukencode/FluentEmailで、Razorのメールテンプレートをサポートし、SendGrid、MailGun、SMTPを使用したメール送信をサポートしており、非常に使いやすいです。

NuGetのコンポーネント

FluentEmailは強力で、さまざまなシナリオのための独立したNuGetパッケージをサポートしています。この低結合分割は、依存関係を非常に明確にするだけでなく、不要なコードの導入を回避します。

普通郵便の方式

次に、FluentEmailを使ってメールを送信する方法を示します。実際のビジネスではほとんどがSMTPを使ってメールを送信しているので、このデモを行います。まず、FluentEmail.Smtpパッケージをプロジェクトに導入します。最新バージョンは2.8.0です。

<PackageReference Include="FluentEmail.Smtp" Version="2.8.0" />

次に、楽しくコードを書くことができます。コードの使い方は非常にシンプルで簡潔です。主にチェーンプログラミングを通じてです。

//如果使用smtp服务发送邮件必须要设置smtp服务信息
SmtpClient smtp = new SmtpClient
{
    //smtp服务器地址(我这里以126邮箱为例,可以依据具体你使用的邮箱设置)
    Host = "smtp.126.com",
    UseDefaultCredentials = true,
    DeliveryMethod = SmtpDeliveryMethod.Network,
    //这里输入你在发送smtp服务器的用户名和密码
    Credentials = new NetworkCredential("邮箱用户名", "邮箱密码")
};
//设置默认发送信息
Email.DefaultSender = new SmtpSender(smtp);
var email = Email
    //发送人
    .From("zhangsan@126.com")
    //收件人
    .To("lisi@qq.com")
    //抄送人
    .CC("admin@126.com")
    //邮件标题
    .Subject("邮件标题")
    //邮件内容
    .Body("邮件内容");
//依据发送结果判断是否发送成功
var result = email.Send();
//或使用异步的方式发送
//await email.SendAsync();
if (result.Successful)
{
    //发送成功逻辑
}
else
{
    //发送失败可以通过result.ErrorMessages查看失败原因
}

HTML形式のコンテンツを含むコンテンツを送信する場合は、以下の方法を使用できます。

var email = Email
    //发送人
    .From("zhangsan@126.com")
    //收件人
    .To("lisi@qq.com")
    //抄送人
    .CC("admin@126.com")
    //邮件标题
    .Subject("邮件标题")
    //只需要额外设置第二个参数为true即可
    .Body("<h1 align=\"center\">.NET大法好</h1><p>是的,这一点毛病都没有</p>",true);
//发送
var result = email.Send();

Bodyのメソッド宣言をクリックすると、2番目のパラメータがコンテンツがHTML形式かどうかを示すために使用され、デフォルトはfalseです。

IFluentEmail Body (string body, bool isHtml = false);

メールの宛先がのメールアドレスであれば、Toメソッドをできるもう一つのオーバーロードメソッドはListを受け入れることができる<FluentEmail.Core.Models.Address>

var email = Email
    //发送人
    .From("zhangsan@126.com")
    //邮件标题
    .Subject("邮件标题")
    //邮件内容
    .Body("<h1 align=\"center\">.NET大法好</h1><p>是的,一点毛病都没有</p>",true);

//构建多个接收人邮箱
string toUserStr = "oldwang@126.com;xiaoming@163.com;xiaoli@qq.com";
List<FluentEmail.Core.Models.Address> toUsers = toUserStr.Split(";")
    .Select(i => new FluentEmail.Core.Models.Address { EmailAddress = i }).ToList();
//支持传入Address集合
email.To(toUsers)
//抄送人集合
.CC(toUsers);
//发送
var result = email.Send();

送信したメッセージに添付ファイルを追加する必要がある場合は、Attacheメソッドを使用して添付ファイルを追加できます。

var email = Email
        //发送人
        .From("zhangsan@qq.com")
        //收件人
        .To("lisi@126.com")
        //抄送人
        .CC("admin@126.com")
        //邮件标题
        .Subject("关于.NET Core怎么样")
        //邮件内容
        .Body("<h1 align=\"center\">.NET Core</h1><p>.NET Core很优秀吗?是的,一点毛病都没有!!!</p>",true);

//构建附件
var stream = new MemoryStream();
var sw = new StreamWriter(stream);
sw.WriteLine("您好,这是文本里的内容");
sw.Flush();
stream.Seek(0, SeekOrigin.Begin);
var attachment = new FluentEmail.Core.Models.Attachment
{
    Data = stream,
    ContentType = "text/plain",
    Filename = "Hello.txt"
};
//添加附件
email.Attach(attachment);
var result = email.Send();

複数の添付ファイルを追加する必要がある場合、Attachメソッドは受信Attachmentコレクションをサポートします。

//构建附件
var stream = new MemoryStream();
var sw = new StreamWriter(stream);
sw.WriteLine("您好,这是文本里的内容");
sw.Flush();
stream.Seek(0, SeekOrigin.Begin);
//附件1
var attachment = new FluentEmail.Core.Models.Attachment
{
    Data = stream,
    ContentType = "text/plain",
    Filename = "Hello.txt"
};

//附件2
var attachment2 = new FluentEmail.Core.Models.Attachment
{
    Data = File.OpenRead(@"D:\test.txt"),
    ContentType = "text/plain",
    Filename = "test.txt"
};

//添加附件
email.Attach(new List<FluentEmail.Core.Models.Attachment> { attachment, attachment2 });
var result = email.Send();

Razorテンプレートの使用

上記では、FluentEmailを使用して通常の方法でメールを送信する方法を説明しましたが、動的なコンテンツを送信したり、より複雑なスタイルのHTMLコンテンツを送信する必要がある場合があります。通常、ネイティブのSmptClientを使用するときはHTMLコードをスプライシングしますが、これは比較的時間がかかり、. NetプログラマにとってはRazorエンジンが動的なHTMLページを構築する最も身近な方法であり、FluentEmailはRazorテンプレートのサポートを提供してくれます。まず、FluentEmail.Razorテンプレートのサポートコンポーネントを導入しました。

<PackageReference Include="FluentEmail.Razor" Version="2.8.0" />

ASP.NET Core 2.2はデフォルトでビューコンパイル機能を使用しているため、ビューはプロジェクト名. Views.dllにコンパイルされますが、FluentEmail.Razorはビューファイルの内容を読み取る必要があるため、csprojファイルに以下を追加します。

<MvcRazorExcludeRefAssembliesFromPublish>true</MvcRazorExcludeRefAssembliesFromPublish>

次に、Razorテンプレートを使用してメールの内容を生成します。

//声明使用razor的方式
Email.DefaultRenderer = new RazorRenderer();
//razor内容
var template = "你好@Model.Name先生, 请核实您的电话号码是否为@Model.Phone";
var email = Email
    .From("lisi@126.com")
    .To("zhangsan@qq.com")
    .Subject("手机号核实")
    //传递自定义POCO类
    //.UsingTemplate<UserInfo>(template, new UserInfo { Name = "张三", Phone吗 = "100110119120" })
    //或传递匿名对象
    .UsingTemplate(template, new { Name = "张三", Phone吗 = "100110119120" });
var result = await email.SendAsync();

もちろん、Razor文字列だけでなく、Razorビューファイルを渡す方法をサポートしています。

var email = Email
    .From("lisi@126.com")
    .To("zhangsan@qq.com")
    .Subject("手机号核实")
    //传递自定义POCO类
    //.UsingTemplateFromFile<UserInfo>($"{Directory.GetCurrentDirectory()}/template.cshtml",
    //     new UserInfo { Name = "张三", Phone吗 = "100110119120" });
    //第一个参数为视图文件位置,第二个参数为模型对象
    .UsingTemplateFromFile($"{Directory.GetCurrentDirectory()}/template.cshtml",
       new { Name = "张三", Phone吗 = "100110119120" });
var result = await email.SendAsync();

FluentEmail.Razorが強力なRazorテンプレートエンジンをサポートできる理由は、主にRazorLightの内部統合によるものです。これは非常に強力なRazorエンジンで、Razorテンプレート文字列またはRazorビューファイルを特定の文字列結果に解析することができます。詳細はRazorLightの公式GitHubアドレスhttps//github.com/toddams/RazorLightを参照してください。

Install-Package RazorLight -Version 2.0.0-beta10

使い方も非常に簡単です。

//razor字符串的方式
var engine = new RazorLightEngineBuilder()
	.UseEmbeddedResourcesProject(typeof(Program))
	.UseMemoryCachingProvider()
	.Build();
string template = "Hello, @Model.Name. Welcome to RazorLight repository";
ViewModel model = new ViewModel {Name = "John Doe"};
//result就是解析后的字符串
string result = await engine.CompileRenderStringAsync("templateKey", template, model);

またはrazorビューファイルの使用方法

var engine = new RazorLightEngineBuilder()
	.UseFileSystemProject("${Directory.GetCurrentDirectory()}")
	.UseMemoryCachingProvider()
	.Build();
var model = new {Name = "John Doe"};
string result = await engine.CompileRenderAsync("template.cshtml", model);

もちろん、それはこれらの2つの方法だけでなく、使いやすさと機能の両方が非常に強力で、興味のある学生はRazorLightのGitHubアドレスを自分で確認することができ、説明も非常に詳細です。ここではRazorLightの使い方についてあまり議論しません

关于发送的邮件内容,这里有一个非常重要的点需要友情提示一下公共邮箱运营商比如网易或腾讯,有的可能需要手动开启SMTP服务,具体如何设置可以参考https://blog.csdn.net/c13_tianming/article/details/47660635一文。还有一点也比较重要如果你使用公共邮箱运营商的邮箱那么他们会对邮件的标题和内容限制比较大,可能出现的问题比较多,而且开启Smtp服务需要发送短信认证才能开启。好在大部分公司都有自己的邮件系统,在实际发送邮件的过程中可能不会存在这么多的问题。

** 依存性注入と組み合わせる ***

NET Coreを使用した実際の開発では、依存性注入が不可欠な開発パターンになっています。. NET Coreプロジェクトを使用していて、依存性注入にまだ触れていない場合は、まず自分で考える必要があります。FluentEmailは進化したコンポーネントであり、依存性注入と組み合わせて使用することもでき、登録時にデフォルト設定を統一的に設定できます。他のパッケージを導入する必要はありません。Smtpを使用する必要がある場合はFluentEmail.Smtpパッケージを導入し、Razorテンプレートを使用する必要がある場合はFluentEmail.Razorパッケージを導入します。インジェクションのこの部分の機能は実際にFluentEmail.Coreパッケージに含まれています。

public void ConfigureServices(IServiceCollection services)
{
    SmtpClient smtp = new SmtpClient
    {
        //smtp服务器地址(我这里以126邮箱为例,可以依据具体你使用的邮箱设置)
        Host = "smtp.qq.com",
        UseDefaultCredentials = true,
        DeliveryMethod = SmtpDeliveryMethod.Network,
        //这里输入你在发送smtp服务器的用户名和密码
        Credentials = new NetworkCredential("zhangsan@qq.com", "zhangsan")
    };
    //注入的时候可以添加一些默认的设置
    services
        //设置默认发送用户
        .AddFluentEmail("zhangsan@qq.com")
        //添加razor模板支持
        //.AddRazorRenderer($"{Directory.GetCurrentDirectory()}/Views")
        .AddRazorRenderer()
        //配置默认的smtp服务信息
        .AddSmtpSender(smtp);
}

メールを送信する必要があるクラスに直接IFluentEmailを注入します。心配する必要はありません。私たちの上で使用するEmailこのクラスは実際にIFluentEmailというインタフェースを実装しているので、使用方法は完全に一致しています。

public async Task<IActionResult> SendEmail([FromServices]IFluentEmail email)
{
     var result = await email//发送人
        //发送人
        .From("zhangsan@126.com")
        //收件人
        .To("lisi@qq.com")
        //抄送人
        .CC("admin@126.com")
        //邮件标题
        .Subject("邮件标题")
        //邮件内容
       .Body("邮件内容").SendAsync();
    return View();
}

Razorビューテンプレート関連のコンテンツを送信する必要がある場合、またはおなじみのレシピのおなじみの味は、登録時に追加したデフォルト設定の一部を省略するだけで、何の違いもありません。

public async Task<IActionResult> SendEmail([FromServices]IFluentEmail email)
{
     var template = "你好@Model.Name先生, 请核实您的电话号码是否为@Model.Phone";
     var result = await email//发送人
        .From("lisi@126.com")
        .To("zhangsan@qq.com")
        .Subject("手机号核实")
        //传递自定义POCO类
        //.UsingTemplate<UserInfo>(template, new UserInfo { Name = "张三", Phone吗 = "100110119120" })
        //或传递匿名对象
        .UsingTemplate(template, new { Name = "张三", Phone吗 = "100110119120" })
        .SendAsync();
    return View();
}

まとめまとめまとめ

FluentEmailの基本的な使い方についてはここで説明しましたが、個人的には非常に強力で使いやすいと思います。正直なところ、FluentEmailに触れる前は、庭で他の言語でメール送信コンポーネントを統合しているのをよく見ていました。例えば、springbootにspring-boot-starter-mailを統合することは本当に便利です。その後、誤ってFluentEmailに触れたことは非常に満足しています。1つは、その強力な機能と使いやすさです。2つ目は、. NET Coreと組み合わせて使用方法をさらに最適化することができます。少なくとも. NETと. NET Coreでは、非常に便利なメール送信コンポーネントもあります。FluentEmailの著者はまた、より多くの開発者がFluentEmailの開発と実践を理解し、参加することを呼びかけ、最終的にはGitHubアドレスhttps//github.com/lukencode/FluentEmailを再度投稿し、学習に興味のある方はStarを忘れないでください。

Keep Exploring

延伸阅读

更多文章
同分类 / 同标签 2024/01/19

FluentValidation検証のチュートリアル

FluentValidationは、. NET開発に基づく検証フレームワークで、オープンソースで無料でエレガントで、チェーン操作をサポートし、理解しやすく、完全な機能を備えており、MVC5、WebApi2、ASP.NET COREと深く統合することができ、コンポーネント内に12種類の一般的な検証子を提供し、スケーラビリティが良く、カスタム検証子をサポートし、ローカライズされた多言語をサポートします。

继续阅读
同分类 / 同标签 2023/01/11

gと実操. NET编

バックエンドサービス間の呼び出しと同様に、バックエンドとバックエンドのやりとりにもWebApi + JSONを使用してきました。

继续阅读