abp框架发送邮件设置和问题处理

4 篇文章 0 订阅

最近才做了abp框架下发送邮件的设置,仅使用了在配置文件中配置邮箱,但是其中有遇到了不少问题,在这里记录一下。

abp发送邮件在官方文档:邮件发送系统,引用了abp的email包和MailKit包。

注意,在哪个项目中发送邮件就在哪个项目中引用此包。在此有遇到一个坑,因为项目有.HttpApi.Host和.IdentityServer存在,而发送邮件使用系统默认的,对abp框架不是很了解,我就在.HttpApi.Host项目中修改了邮箱设置,但是在“找回密码”是无法发送邮件的。后来才发现这里的邮箱设置必须在.IdentityServer项目中进行设置才可以。而需要在api中发送邮件的才需要在.HttpApi.Host项目中设置。

然后在主项目的appsettings.json文件中可以找到邮箱的配置:

  • Abp.Mailing.DefaultFromAddress: 当你在发送电子邮件时未指定发件人时,用作发件人的电子邮件地址(就像上面的示例一样).
  • Abp.Mailing.DefaultFromDisplayName: 当你在发送电子邮件时未指定发件人时,用作发件人的显示名称(就像在上面的示例中一样).
  • Abp.Mailing.Smtp.Host: SMTP 服务器的 IP/域(默认值:127.0.0.1)。
  • Abp.Mailing.Smtp.Port: SMTP 服务器的端口(默认值:25).
  • Abp.Mailing.Smtp.UserName: 用户名,如果 SMTP 服务器需要身份验证需要。
  • Abp.Mailing.Smtp.Password: 密码,如果 SMTP 服务器需要身份验证需要。 此值已加密(请参阅下面的部分).
  • Abp.Mailing.Smtp.Domain: 账号域,如果 SMTP 服务器需要身份验证需要.
  • Abp.Mailing.Smtp.EnableSsl: 指示 SMTP 服务器是否使用 SSL 的值(“true”或“false”。默认值:“false”).
  • Abp.Mailing.Smtp.UseDefaultCredentials:如果为 true,则使用默认凭据,而不是提供的用户名和密码(“true”或“false”。默认值:“true”)。

在网上可以找到很多用QQ邮箱发送邮件的教程,设置如下,注意Port,EnableSsl和UseDefaultCredentials的值。

"Abp.Mailing.DefaultFromDisplayName": "Email"
"Abp.Mailing.Smtp.Host": "smtp.qq.com",
"Abp.Mailing.Smtp.Port": "587",
"Abp.Mailing.Smtp.UserName": "1111@qq.com",
"Abp.Mailing.Smtp.Password": "11111111",
"Abp.Mailing.Smtp.Domain": "",
"Abp.Mailing.Smtp.EnableSsl": "false",
"Abp.Mailing.Smtp.UseDefaultCredentials": "false",
"Abp.Mailing.DefaultFromAddress": "1111@qq.com",
"Abp.Mailing.DefaultFromDisplayName": "QQEmail"

一般会设置密码为明文,就需要在

.Domain/Settings/XXXDefinitionProvider.cs中加上允许明文密码的设置:

//密码明文
var smtpPassword = context.GetOrNull("Abp.Mailing.Smtp.Password");
if (smtpPassword != null)
{
    smtpPassword.IsEncrypted = false;
}

使用QQ邮箱的话在此基础上就已经可以正常发送邮件了。

但是需要使用公司自己的邮箱,都设置好后出现了问题,报错信息如下:

An error occurred while attempting to establish an SSL or TLS connection.

The host name did not match the name given in the server's SSL certificate.

MailKit.Security.SslHandshakeException: An error occurred while attempting to establish an SSL or TLS connection.

The host name did not match the name given in the server's SSL certificate.

查了一下,是因为证书认证的问题,又在百度搜了一下,看到17,18年的有解决方案https://www.cnblogs.com/tengmei/p/10887950.html,是加了

client.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;

这段代码,替换掉原来的builder就可以了。但是目前的代码已经升级,不能这样操作了。

后来慢慢自己摸索,发现可以重写一下MailKitSmtpEmailSender,加上设置就可以,代码如下:

    public class CustomMailKitSmtpEmailSender : MailKitSmtpEmailSender
    {
        public CustomMailKitSmtpEmailSender(ISmtpEmailSenderConfiguration smtpConfiguration, IBackgroundJobManager backgroundJobManager, IOptions<AbpMailKitOptions> abpMailKitConfiguration) : base(smtpConfiguration, backgroundJobManager, abpMailKitConfiguration)
        {

        }

        protected override Task ConfigureClient(SmtpClient client)
        {
            //解决发送邮件时邮箱服务器证书问题
            client.ServerCertificateValidationCallback = (sender, certificate, chain, errors) => true;
            return base.ConfigureClient(client);
        }
    }

哪个项目需要发送邮件就放到哪个项目中,我是放在跟XXXServerModule.cs文件夹平级的地方,也不知道放的对不对,但是的确是起作用了。

然后修改appsettings.json中的配置:


    "Abp.Mailing.Smtp.Host": "smtp.XXX.com",
    "Abp.Mailing.Smtp.Port": "465",
    "Abp.Mailing.Smtp.UserName": "XXX.111@XXX.com",
    "Abp.Mailing.Smtp.Password": "XXX.111",
    "Abp.Mailing.Smtp.Domain": "",
    "Abp.Mailing.Smtp.EnableSsl": "true",
    "Abp.Mailing.Smtp.UseDefaultCredentials": "false",
    "Abp.Mailing.DefaultFromAddress": "XXX.11@XXX.com",
    "Abp.Mailing.DefaultFromDisplayName": "Email"

再此还是要注意Port和UseDefaultCredentials的值。

这样设置后就可以正常发送邮件了,不会再报错。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值