最近 outlook 正式禁用了 app password,强制使用 oauth2 来登陆邮箱 (Modern Authentication Methods now needed to continue syncing Outlook Email in non-Microsoft email apps - Microsoft Support)
我习惯使用 mbsync+msmtp+notmuch
的非常 “unix” 风格的邮件工作流,这对于我自然是一个沉重的打击。经过了无数的折腾,终于搞定了。以下给大家写一个简要的分享:
以下的分享假设你已经熟悉了如何使用 gpg
,并且已经有了一个过去曾可用的 mbsync
的配置。
配置Outlook的oauth2支持
设置mutt脚本以进行oauth2认证
我使用了来自neomutt的脚本进行oauth2认证,并进行了一些修改,如下面的补丁所示。
diff --git a/mutt_oauth2.py b/bin/mutt_oauth2.py
old mode 100644
new mode 100755
index c973b98..c296dff
--- a/mutt_oauth2.py
+++ b/bin/mutt_oauth2.py
@@ -45,7 +45,7 @@ import readline
# encryption and decryption pipes you prefer. They should read from standard
# input and write to standard output. The example values here invoke GPG,
# although won't work until an appropriate identity appears in the first line.
-ENCRYPTION_PIPE = ['gpg', '--encrypt', '--recipient', 'YOUR_GPG_IDENTITY']
+ENCRYPTION_PIPE = ['gpg', '--encrypt', '--recipient', '<[email protected]>']
DECRYPTION_PIPE = ['gpg', '--decrypt']
registrations = {
@@ -66,17 +66,17 @@ registrations = {
'authorize_endpoint': 'https://login.microsoftonline.com/common/oauth2/v2.0/authorize',
'devicecode_endpoint': 'https://login.microsoftonline.com/common/oauth2/v2.0/devicecode',
'token_endpoint': 'https://login.microsoftonline.com/common/oauth2/v2.0/token',
- 'redirect_uri': 'https://login.microsoftonline.com/common/oauth2/nativeclient',
+ 'redirect_uri': 'https://login.live.com/oauth20_desktop.srf', # use the redirect url of outlook instead of office365
'tenant': 'common',
'pop_endpoint': 'outlook.office365.com',
- 'smtp_endpoint': 'smtp.office365.com',
+ 'smtp_endpoint': 'smtp-mail.outlook.com', # use the SMTP endpoint of outlook instead of office365
'sasl_method': 'XOAUTH2',
'scope': ('offline_access https://outlook.office.com/IMAP.AccessAsUser.All '
'https://outlook.office.com/POP.AccessAsUser.All '
'https://outlook.office.com/SMTP.Send'),
- 'client_id': '',
- 'client_secret': '',
+ 'client_id': 'my app id, see the next section on how to register your own app',
+ 'client_secret': ' ',
},
}
在Azure中设置应用注册
要设置一个应用来同步邮件,请按照以下步骤操作:
-
使用你的个人Outlook邮箱或首选邮箱地址注册一个Azure账户。
-
登录Azure账户后,切换到"默认目录",因为新的应用注册强制要求必须位于某个目录底下。
-
按照neomutt提供的说明进行应用配置。需要注意的就是在
Manage|API permissions
的设置里,要把 IMAP/SMTP/POP 等等在 mutt 脚本里写明要求的权限都打开。
使用mutt脚本获取认证令牌
mutt_oauth2.py --verbose --authorize -t your/path/to/the/oauth/file
运行上述命令时会出现一个向导。只需按照提供的说明完成设置即可。我选择了devicecode
认证流程,但其他方法也应该可以使用。完成以后 mutt 会将加密后的 token 写入 your/path/to/the/oauth/file
请注意,OAuth2令牌的有效期有限,会定期过期。如果你遇到mbsync
的问题,请考虑令牌可能已过期。在这种情况下,你需要再次执行上述脚本以获取新的令牌。
配置mbsync
注意:如果你使用macOS,从homebrew
安装的mbsync
不支持xoauth2
,请按照这个讨论中的说明从源码构建mbsync
。我自己采取了一个非常 hackish 的方法:我开了一个运行支持 xoauth2 的 mbsync 的 Docker 。然后,我将主机的 maildir 文件夹挂载到这个容器中,使 mbsync
能够访问和同步我的邮件。
在你的mbsync配置文件中,像这样配置你的Outlook邮箱:
IMAPAccount myPersonalOutlook
PassCmd "mutt_oauth2.py -t your/path/to/the/outlook/oauth/file"
AuthMechs XOAUTH2
# 其余配置保持不变
配置msmtp
幸运的是,从homebrew
安装的msmtp
可以直接使用,不需要担心从源码构建。更改以下几行应该就足够了。
account outlook
auth xoauth2
passwordeval mutt_oauth2.py -t your/path/to/the/outlook/oauth/file
# 其余配置保持不变