Blazor C# 发送电子邮件

3

我在我的 Blazor 项目中有一个剃刀组件,当用户点击按钮时,它将触发电子邮件 The button

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是一种方法,用于传递电子邮件的发送方、接收方、主题和正文,以下是代码。
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;
        }

这是我尝试过的代码,但是邮件没有发送出去,不确定为什么,有任何想法吗?


5
客户端或服务器端的Blazor?Defone不确定为什么 - 我的意思是,吞掉一个异常然后抱怨你没有信息就像不聪明一样,你知道的。你有异常吗?是哪一个?将其上抛。为什么在finally中处理msg而不使用using呢? - TomTom
1个回答

12

你是否将你的email类作为服务添加到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);
        }
    }
}

在 Startup.cs 中添加:
  1. In Startup.cs add:
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 Server。因此,对于您,只需将 MailSettings 替换为 CModule 即可。


@Thomas:完美运作。感谢您提供这么详细的答案。在SendEmail中使用using()是不是一个好主意呢? - nogood
@nogood,你使用了服务器应用吗?因为我正在尝试不使用服务器来完成这个任务。 - Franco
是的,我确实使用了我的Web服务器的电子邮件服务。 - nogood

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接