コメント デバッグ 空の実装#
DomainModule
では、デフォルトでメール送信の空の実装が追加されています。私のローカルでテストする必要があったので、コメントアウトしました。もちろん、これは完全に自分のニーズ次第です:
//#if DEBUG
// context.Services.Replace(ServiceDescriptor.Singleton<IEmailSender, NullEmailSender>());
//#endif
MailKit の統合#
MailKit
を使用する理由は、ABP ソースコード Volo.Abp.Emailing.Smtp.SmtpEmailSender
の推奨です:
Logger.LogWarning("新しい開発には SmtpClient クラスの使用をお勧めしません。SmtpClient は多くの現代的なプロトコルをサポートしていません。" +
"代わりに MailKit(https://docs.abp.io/en/abp/latest/MailKit) または他のライブラリを使用してください。" +
"詳細については、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.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
プロジェクトを起動し、管理者アカウントでログインします。次に、以下のページを開き、「テストメールを送信」ボタンをクリックします。クリックすると、送受信情報を確認するポップアップが表示され、送信をクリックすると送信されます。
もし心配であれば、送信アカウントで 阿里云企業メール にログインし、送信トレイで確認できます。
返送メール#
時々、メールが成功裏に送信されても(コードはエラーを報告しません)、受信者が受け取れないことがあります。なぜなら、阿里云によって返送されるからです: