myesn

myEsn2E9

hi
github

ABP: 郵件發送集成 MailKit 並配置阿里雲企業郵箱

注釋 Debug 空實現#

DomainModule 中,默認添加了郵件發送空實現,我本地需要測試,我就把它註釋掉了,當然這完全看自己的需求:

//#if DEBUG
//        context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
//#endif

整合 MailKit#

使用 MailKit 的原因是,在 ABP 源碼 Volo.Abp.Emailing.Smtp.SmtpEmailSender中的建議

Logger.LogWarning("We don't recommend that you use the SmtpClient class for new development because SmtpClient doesn't support many modern protocols. " +
                               "Use MailKit(https://docs.abp.io/en/abp/latest/MailKit) or other libraries instead." +
                               "For more information, see https://github.com/dotnet/platform-compat/blob/master/docs/DE0005.md");

首先查看 MailKit Integration 文檔,在 Domain 層安裝 Volo.Abp.MailKit

安裝時需要注意,由於 Volo.Abp.MailKit 依賴 Volo.Abp.Emailing 包,Domain 層又默認安裝了
Volo.Abp.Emailing,在安裝 Volo.Abp.MailKit 時會安裝最新的版本,可能會導致 Volo.Abp.Emailing 包降級,所以,這兩個包的版本號最好一致:
image

修改默認配置#

需要注意的是,確保為郵箱賬號開啟了 SMTP 服務。

使用默認的管理員賬號 postmaster 登錄郵箱,打開 賬號列表,確保發件郵箱賬號配置如下:
image

然後再使用 發件郵箱登錄,再打開 賬號安全,滑到最下面,找到 "三方客戶端登錄安全管理",開啟 "三方客戶端安全密碼",並點擊 “生成新密碼”,後續代碼中會用到。

Domain 項目的 Settings/?SettingDefinitionProvider中添加以下代碼:

public class ?SettingDefinitionProvider : SettingDefinitionProvider
{
    public override void Define(ISettingDefinitionContext context)
    {
        //Define your own settings here. Example:
        //context.Add(new SettingDefinition(?Settings.MySetting1));
        // context.Add will override value of key: https://github.com/abpframework/abp/blob/f47e9252a3d57c12c2ac06e1f09034acd70582e0/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionContext.cs#L25

        // note: 添加或修改 settings 後,重啟 Web 項目即可生效

        context.Add(
            // Email settings: https://docs.abp.io/en/abp/latest/Emailing#email-settings
            // 默認配置參考:Volo.Abp.Emailing.EmailSettingProvider
            // 頁面上 "發送測試郵件" 按鈕點擊後,會顯示一個彈出層再次確認收發信息,收件人默認是 CurrentUser.Email
            new SettingDefinition(
                EmailSettingNames.Smtp.Host,
                "smtp.qiye.aliyun.com",
                L("DisplayName:Abp.Mailing.Smtp.Host"),
                L("Description:Abp.Mailing.Smtp.Host")),

            // ABP 默認就是 25 端口
            //new SettingDefinition(EmailSettingNames.Smtp.Port,
            //    "25",
            //    L("DisplayName:Abp.Mailing.Smtp.Port"),
            //    L("Description:Abp.Mailing.Smtp.Port")),

            // 需要注意的是,阿里雲企業郵箱 postmaster 賬號默認無法登錄,因為沒有開啟 SMTP 服務,需要在 http://mail.yourdomain.com/admin/#/account-email 頁面找到該賬號,進入詳情,
            // 必須使用其他賬號,通過下面的鏈接找到 "三方客戶端登錄安全管理",開啟 "三方客戶端安全密碼",並生成新密碼應用到下面的 Password
            // 三方客戶端登錄安全管理:http://mail.secondstrust.com/alimail/entries/v5.1/setting/account-security
            new SettingDefinition(
                EmailSettingNames.Smtp.UserName,
                defaultValue: "這裡填寫發件人郵箱,比如 x@q.com",
                displayName: L("DisplayName:Abp.Mailing.Smtp.UserName"),
                description: L("Description:Abp.Mailing.Smtp.UserName")),

            new SettingDefinition(
                EmailSettingNames.Smtp.Password,
                defaultValue: "這裡填寫生成的三方客戶端密碼",
                displayName: L("DisplayName:Abp.Mailing.Smtp.Password"),
                description: L("Description:Abp.Mailing.Smtp.Password"),
                // 如果要設置為 isEncrypted:true, 表示存儲的 defaultValue 是已經自己手動加密後的字符串,在使用時會自動使用 IStringEncryptionService.Decrypt 解密
                isEncrypted: false),

            new SettingDefinition(
                EmailSettingNames.Smtp.Domain,
                defaultValue: "這裡填寫郵箱域名,比如 q.com",
                displayName: L("DisplayName:Abp.Mailing.Smtp.Domain"),
                description: L("Description:Abp.Mailing.Smtp.Domain")),

            // 如果為 true,則使用默認憑據,而不是上面提供的用戶名和密碼 (“true” 或 “false”.默認值:“true”)。
            new SettingDefinition(
                EmailSettingNames.Smtp.UseDefaultCredentials,
                "false",
                L("DisplayName:Abp.Mailing.Smtp.UseDefaultCredentials"),
                L("Description:Abp.Mailing.Smtp.UseDefaultCredentials")),

            // 不要啟用 SSL,否則會報錯
            //new SettingDefinition(
            //    EmailSettingNames.Smtp.EnableSsl,
            //    "true",
            //    L("DisplayName:Abp.Mailing.Smtp.EnableSsl"),
            //    L("Description:Abp.Mailing.Smtp.EnableSsl")),

            new SettingDefinition(
                EmailSettingNames.DefaultFromAddress,
                "這裡填寫發件人郵箱,比如 x@q.com",
                L("DisplayName:Abp.Mailing.DefaultFromAddress"),
                L("Description:Abp.Mailing.DefaultFromAddress")),

            new SettingDefinition(EmailSettingNames.DefaultFromDisplayName,
                "發件人郵箱顯示名稱,比如 x",
                L("DisplayName:Abp.Mailing.DefaultFromDisplayName"),
                L("Description:Abp.Mailing.DefaultFromDisplayName"))
            );
    }

    private static LocalizableString L(string name)
    {
        return LocalizableString.Create<IdentityResource>(name);
    }

注意:如果程序部署在阿里雲服務器上,可能會無法訪問 25 端口,需要修改為:

// ABP 默認就是 25 端口,啟用 SSL 後端口改為 465
new SettingDefinition(EmailSettingNames.Smtp.Port,
    "465", //"25",
    L("DisplayName:Abp.Mailing.Smtp.Port"),
    L("Description:Abp.Mailing.Smtp.Port")),

// 阿里雲服務器:由於國際與國內均對垃圾郵件進行嚴格管控,我國《互聯網信息服務管理辦法》、《中國互聯網協會反垃圾郵件規範》均對垃圾郵件進行說明與管理規範。
// 為了共同維護良好的網絡環境,阿里雲新購服務器不再提供25端口郵件服務,建議您嘗試使用465加密端口發送郵件,或與郵件發信提供商諮詢是否還有其他smtp發信端口,給您帶來的不便深表歉意,
new SettingDefinition(
    EmailSettingNames.Smtp.EnableSsl,
    "true",
    L("DisplayName:Abp.Mailing.Smtp.EnableSsl"),
    L("Description:Abp.Mailing.Smtp.EnableSsl")),    

原因是:
image

測試#

啟動 Web 項目,使用管理員賬號登錄,然後打開下面的頁面,點擊 "發送測試郵件" 按鈕,點了之後會顯示一個彈出層確認收發信息,點發送,就可以發出去了。

image
image
image

如果不放心,可以使用發件賬號登錄 阿里雲企業郵箱,然後在發件箱裡面查看。

被退信#

有些時候,雖然郵件發成功了 (代碼不會報錯),但收件人可能收不到,因為被阿里雲官退信了:
image

解決辦法:https://help.aliyun.com/document_detail/36620.html

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。