【问题标题】:Blazor C# Send EmailBlazor C# 发送电子邮件
【发布时间】:2020-05-23 11:49:07
【问题描述】:

我的 Blazor 项目中有一个 razor 组件,当用户单击按钮时,它将触发电子邮件

OnClick 函数 Email 将通过以下代码发送电子邮件

async Task Email(string originalpiv, string docno, string cuscode, string cusname, string docdate)
{
   CModule.SendMail("example@gmail.com", "example@gmail.com", "", "HI", "HI BRO");

}

CModule.SendMail 是传递电子邮件 from,to,subj,body 的方法,代码如下

public static bool SendMail(string from, string to, string cc, string subject, string body)
        {
            bool rst = false;
            MailMessage Msg = new MailMessage();
            try
            {
                SmtpClient smtp = new SmtpClient("mail.gmail.com", 587);
                string[] toeml = to.Split(new Char[] { ';', ',' });
                foreach (string tmp in toeml)
                {
                    if (tmp.Trim() != "") Msg.To.Add(tmp.Trim());
                }
                string[] cceml = cc.Split(new Char[] { ';', ',' });
                foreach (string tmp in cceml)
                {
                    if (tmp.Trim() != "") Msg.CC.Add(tmp.Trim());
                }
                Msg.From = new MailAddress(from.Trim());
                Msg.Subject = subject;
                Msg.Body = body;
                Msg.BodyEncoding = System.Text.Encoding.GetEncoding("GB2312");
                smtp.Credentials = new System.Net.NetworkCredential("nick.chau@gmail.com", "880215");
                smtp.Send(Msg);
                rst = true;
            }
            catch (Exception ex)
            {

            }
            finally
            {
                Msg.Dispose();
            }
            return rst;
        }

这些是我尝试过的代码,但电子邮件没有发送出去,不知道为什么,有什么想法吗?

【问题讨论】:

  • 客户端还是服务器端 blazor? Defone 不知道为什么 - 我的意思是,吞下一个异常然后抱怨你没有信息就像不聪明,你知道的。你有例外吗?哪一个?把它泡起来。为什么你在 finally 中处理 msg 而不是 using.... using?

标签: c# blazor


【解决方案1】:

您是否将电子邮件类添加为服务以用作startup.cs 中的依赖注入?

这对我有用:

  1. 创建将通过 appsettings.json 配置的电子邮件设置
namespace ReservationBookingSystem.Model
{
    public class MailSettings
    {
        public string Username { get; set; }
        public string Password { get; set; }
        public int Port { get; set; }
        public string FromEmail { get; set; }
        public string Host { get; set; }
    }
}
  1. 创建邮件界面
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using ReservationBookingSystem.Model;

namespace ReservationBookingSystem.Services
{
    public interface IMailService
    {
        Task SendEmailAsync(string ToEmail, string Subject, string HTMLBody);
    }
}

  1. 创建 MailService 类
using ReservationBookingSystem.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Net;
using System.Net.Mail;

namespace ReservationBookingSystem.Services
{
    public class MailService : IMailService
    {
        private readonly MailSettings _mailConfig;
        public MailService(MailSettings mailConfig)
        {
            _mailConfig = mailConfig;
        }

        public async Task SendEmailAsync(string ToEmail, string Subject, string HTMLBody)
        {
            MailMessage message = new MailMessage();
            SmtpClient smtp = new SmtpClient();
            message.From = new MailAddress(_mailConfig.FromEmail);
            message.To.Add(new MailAddress(ToEmail));
            message.Subject = Subject;
            message.IsBodyHtml = true;
            message.Body = HTMLBody;
            smtp.Port = _mailConfig.Port;
            smtp.Host = _mailConfig.Host;
            smtp.EnableSsl = true;
            smtp.UseDefaultCredentials = false;
            smtp.Credentials = new NetworkCredential(_mailConfig.Username, _mailConfig.Password);
            smtp.DeliveryMethod = SmtpDeliveryMethod.Network;
            await smtp.SendMailAsync(message);
        }
    }
}

  1. 在 Startup.cs 添加:
services.AddSingleton(Configuration.GetSection("MailSettings").Get<MailSettings>());
services.AddScoped<IMailService, MailService>();
  1. 在 appsettings.json 中的“MailSettings”下添加邮件配置
  2. 在你想使用的razor组件中,调用依赖注入即可。与@inject ReservationBookingSystem.Services.IMailService MailService。里面代码调用await MailService.SendEmailAsync("to.email@mail.com", "test", "test");

这适用于 blazor 服务器。所以基本上对你来说,用 CModule 替换 MailSettings 就可以了

【讨论】:

  • @Thomas:完美运行。感谢这个广泛的回答。在 SendEmail 中使用 using() 不是一个好主意吗?
  • @nogood 你是否使用了服务器应用程序,因为我试图在不使用服务器的情况下做到这一点。
  • 是的,我确实使用了我的网络服务器的电子邮件服务。
猜你喜欢
  • 2021-05-23
  • 2016-04-17
  • 2012-07-27
  • 2018-07-24
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多