注釋 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
包降級,所以,這兩個包的版本號最好一致:
修改默認配置#
需要注意的是,確保為郵箱賬號開啟了 SMTP 服務。
使用默認的管理員賬號 postmaster
登錄郵箱,打開 賬號列表,確保發件郵箱賬號配置如下:
然後再使用 發件郵箱登錄,再打開 賬號安全,滑到最下面,找到 "三方客戶端登錄安全管理",開啟 "三方客戶端安全密碼",並點擊 “生成新密碼”,後續代碼中會用到。
在 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")),
原因是:
測試#
啟動 Web
項目,使用管理員賬號登錄,然後打開下面的頁面,點擊 "發送測試郵件" 按鈕,點了之後會顯示一個彈出層確認收發信息,點發送,就可以發出去了。
如果不放心,可以使用發件賬號登錄 阿里雲企業郵箱,然後在發件箱裡面查看。
被退信#
有些時候,雖然郵件發成功了 (代碼不會報錯),但收件人可能收不到,因為被阿里雲官退信了: