我必须构建一个.Net控制台应用程序,它作为一个批处理在服务器端运行,并使用Office365和MailKit向收件人发送电子邮件。
我们公司最近推出了MultiFactor身份验证;我已经重写了一个交互式应用程序,允许用户使用MailKit和MFA发送电子邮件,但我无法在无人值守的应用程序中实现相同的功能。
我已经在Microsoft上注册了应用程序,创建了客户端秘密并实现了以下类:
public class Mailer {
public async static void Send(string subject, string body) {
string tenantID = "abcdef";
string clientId = "ghilmn";
string clientSecret = "opqrst";
string appName = "MyApp";
//clientSecret = Uri.EscapeDataString(clientSecret);
//clientSecret = Uri.EscapeUriString(clientSecret);
var MyConfidentialClientApplication = ConfidentialClientApplicationBuilder.Create(clientId)
.WithClientSecret(clientSecret)
.WithTenantId(tenantID)
.Build();
var scopes = new string[] {"https://graph.microsoft.com/.default"};
try {
var authToken = await MyConfidentialClientApplication.AcquireTokenForClient(scopes).ExecuteAsync();
var oauth2 = new SaslMechanismOAuth2(appName, authToken.AccessToken); // SaslMechanismOAuth2(appName, authToken.AccessToken);
var m_client = new SmtpClient(new ProtocolLogger("smtp.log"));
await m_client.ConnectAsync("outlook.office365.com", 587, SecureSocketOptions.StartTls);
await m_client.AuthenticateAsync(oauth2);
}
catch (Exception ex) {
Debug.WriteLine(ex.Message);
// do nothing;
}
return;
}
虽然令牌似乎是正确获得的( authToken.AccessToken不是空的),但是
等待m_client.AuthenticateAsync(oauth2);
生成以下错误:
Eccezione generata: 'MailKit.Security.AuthenticationException' in System.Private.CoreLib.dll
535: 5.7.3 Authentication unsuccessful [ZR0P278CA0036.CHEP278.PROD.OUTLOOK.COM]
基本上我不明白
如果
如有任何提示将不胜感激,谢谢。
保罗
P.S.是正在工作的交互式应用程序,它使用以下代码使用PublicClientApplicationBuilder和AcquireTokenInteractive调用。
public async Task Connect_MFA() {
var options = new PublicClientApplicationOptions {
ClientId = "abcd",
TenantId = "efgh",
RedirectUri = "https://login.microsoftonline.com/common/oauth2/nativeclient"
};
var publicClientApplication = PublicClientApplicationBuilder
.CreateWithApplicationOptions(options)
.Build();
var scopes = new string[] {
"email",
"offline_access",
//"https://outlook.office.com/IMAP.AccessAsUser.All", // Only needed for IMAP
//"https://outlook.office.com/POP.AccessAsUser.All", // Only needed for POP
"https://outlook.office.com/SMTP.Send", // Only needed for SMTP
};
var authToken = await publicClientApplication.AcquireTokenInteractive(scopes).ExecuteAsync();
var oauth2 = new SaslMechanismOAuth2(authToken.Account.Username, authToken.AccessToken);
m_client = new SmtpClient(new ProtocolLogger("smtp.log"));
await m_client.ConnectAsync("outlook.office365.com", 587, SecureSocketOptions.StartTls);
await m_client.AuthenticateAsync(oauth2);
}
发布于 2022-07-21 17:39:13
反应晚了,但我希望这能挽救我研究这一周的另一个人。
最简单/最好的答案是使用Microsoft.Graph。参见:https://learn.microsoft.com/en-us/graph/api/user-sendmail?view=graph-rest-1.0&tabs=csharp
https://stackoverflow.com/questions/67279556
复制相似问题