コメント デバッグ 空実装#
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
パッケージがダウングレードされる可能性があります。したがって、これらの 2 つのパッケージのバージョン番号は一致させるのが望ましいです:
デフォルト設定の変更#
注意が必要なのは、メールアカウントに SMTP サービスが有効になっていることを確認することです。
デフォルトの管理者アカウント postmaster
でメールにログインし、アカウントリストを開いて、送信メールアカウントの設定が以下のようになっていることを確認します:
次に、送信メールアカウントでログインし、アカウントセキュリティを開き、一番下までスクロールして「三方クライアントログインセキュリティ管理」を見つけ、「三方クライアントセキュリティパスワード」を有効にし、「新しいパスワードを生成」をクリックします。後続のコードで使用されます。
Domain
プロジェクトの Settings/?SettingDefinitionProvider
に以下のコードを追加します:
public class ?SettingDefinitionProvider : SettingDefinitionProvider
{
public override void Define(ISettingDefinitionContext context)
{
//ここに独自の設定を定義します。例:
//context.Add(new SettingDefinition(?Settings.MySetting1));
// context.Add はキーの値を上書きします:https://github.com/abpframework/abp/blob/f47e9252a3d57c12c2ac06e1f09034acd70582e0/framework/src/Volo.Abp.Settings/Volo/Abp/Settings/SettingDefinitionContext.cs#L25
// 注意:設定を追加または変更した後、Web プロジェクトを再起動することで有効になります
context.Add(
// メール設定: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.secondstrust.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
プロジェクトを起動し、管理者アカウントでログインして、次のページを開き、「テストメールを送信」ボタンをクリックします。クリックすると、送受信情報を確認するポップアップが表示され、送信をクリックすると送信されます。
心配な場合は、送信アカウントで 阿里云企業メール にログインし、送信箱で確認できます。
返送メール#
時々、メールが正常に送信された(コードはエラーを報告しない)が、受信者が受け取れない場合があります。これは阿里云によって返送されたためです: