一直挂载dropbox和gdrive用,虽然都还算好用,但一来直接访问不方便,二来这两个都不大。最近申请了微软的Office 365开发者试用订阅E5。5T的onedrive同时解决了直接访问问题和容量问题,以前我的域名邮箱托管在zoho老出问题,现在也一并迁移到微软了。
申请链接 https://developer.microsoft.com/zh-cn/office/dev-program
管理链接 https://portal.office.com/AdminPortal/Home#/homepage
https://admin.microsoft.com
这东西网上资料很多,申请了之后是onedrive原始容量是1T,自己在设置里改成5T就行。但微软给的试用期是3个月,需要开发者身份才能续订,一般的说法是要多用它的API操作。事实上我看了一下,Office 365的api出来好几年了,但似乎个人用户相对较少(网上资料少)。对个人比较实用的是Office 365 REST API,直接操作Onedrive和Outlook。
当然,我们都不想直接处理微软的底层api,最好有个二次封包的东西来简化操作。Onedrive的文件操作可以用rclone,Outlook的邮件操作可以用python3的O365模块。
首先,要调用api先要去申请
这是api的申请地址 https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
api权限以及从属非常多,个人用户一般情况下可以认为微软给了2种权限,一种可以看作个人的,一种可以看作你的整个域的。一种要登陆验证,一种可以不登陆验证。然后每个api有不同的权限,比如文件读写,邮件读写等等。
我们先看下Outlook邮件的O365 这是介绍 https://pypi.org/project/O365/
先安装
apt install python3-pip
pip3 install O365
然后看看他的介绍,非常简单。
1、去申请一个全域可用的api(建议选后台程序这样可以少登录验证),转跳uri填入 https://login.microsoftonline.com/common/oauth2/nativeclient
2、记录api的client_id和client_secret。
3、给这个api赋予3个权限Mail.ReadWrite,Mail.Send和User.Read。
好了,这样就可以发邮件了,类似下面这样
from O365 import Account
credentials = ('client_id', 'client_secret')
account = Account(credentials)
m = account.new_message()
m.to.add('to_example@example.com')
m.subject = 'Testing!'
m.body = "George Best quote: I've stopped drinking, but only while I'm asleep."
m.send()
但我们为了少登录验证选的后台程序,所以需要微软的tenant_ID,这东西可以访问
https://login.windows.net/XXX.onmicrosoft.com/.well-known/openid-configuration
直接得到,注意把XXX.onmicrosoft.com换成你的域
4、得到tenant_ID后稍微改下如下(很简单,应该直接能看懂)
from O365 import Account
from O365 import Connection, MSGraphProtocol
from O365.message import Message
from O365.mailbox import MailBox
credentials = ('client_id', 'client_secret')
protocol = MSGraphProtocol(default_resource='master@wingwy.com')
account = Account(credentials, auth_flow_type='credentials', tenant_id='tenant_id',protocol=protocol)
if account.authenticate():
print('Authenticated!')
mailbox = account.mailbox('master@wingwy.com')
message = mailbox.new_message()
message.to.add('master@wingwy.com')
message.subject='System information'
message.sender.address = 'master@wingwy.com'
message.body = '邮件正文,可以调用系统shell得到系统信息'
message.send()
这样就可以成功调用outlook发送邮件了,主要就三个东西’client_id’, ‘client_secret’和’tenant_id’。
其他可以参考O365的帮助,这个模块做的确实不错,如果你愿意,也可以用O365模块直接操作Onedrive文件等。但文件操作我还是喜欢rclone。
接下来我们看下Onedive文件操作的rclone
先去rclone官网下载装好 https://rclone.org/
1、同样去https://portal.azure.com/#blade/Microsoft_AAD_RegisteredApps/ApplicationsListBlade 申请api。转跳uri填入http://localhost:53682/
2、记录api的client_id和client_secret。
3、给这个api赋予6个权限Files.Read, Files.ReadWrite, Files.Read.All, Files.ReadWrite.All, offline_access, User.Read。
4、rclone config 一步一步下来就行了。
注意:
4.1、填client_id和client_secret的时候不要用默认的,填自己的api,这样快些。
4.2、如果在远程vps上遇到授权回调127.0.0.1,这时候可以再开一个窗口,然后再远程vps上curl “http://127.0.0.1/XXXXXX”得到返回信息后再到本地电脑打开连接。遇到转跳授权同样可以用curl解决。
5、然后挂载到系统。
rclone mount onedrive:wingwy.com /mnt/onedrive --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000
Restart=on-abort
这时候运行df -lh 应该可以看到了。
6、设置服务自启动
vi \usr\lib\systemd\system\rclone.service
写入
[Unit]
Description=rclone
[Service]
User=root
ExecStart=/usr/bin/rclone mount onedrive:wingwy.com /mnt/onedrive --copy-links --no-gzip-encoding --no-check-certificate --allow-other --allow-non-empty --umask 000 --vfs-cache-mode writes
Restart=on-abort
[Install]
WantedBy=multi-user.target
加入自启动
systemctl enable rclone
搞定!
最后在crontab下加入维护命令,每天掉用就是了。
大佬,o365的使用方法可以再讲的详细一点吗?发邮件的那些代码是写个脚本运行吗?
pip3 install O365
然后可以用模板
import os
import subprocess
from O365 import Account
from O365 import Connection, MSGraphProtocol
from O365.message import Message
from O365.mailbox import MailBox
credentials = (‘改成自己的’, ‘改成自己的’)
protocol = MSGraphProtocol(default_resource=’改成自己的’)
account = Account(credentials, auth_flow_type=’credentials’, tenant_id=’改成自己的’,protocol=protocol)
if account.authenticate():
print(‘Authenticated!’)
mailbox = account.mailbox(‘改成自己的’)
message = mailbox.new_message()
message.to.add([‘改成自己的’])
message.subject=’改成自己的’
message.sender.address = ‘改成自己的’ # changing the from address
message.body = ‘改成自己的’
message.send()
谢谢大佬
怎么查看有没有调用成功呀
直接看收到邮件没有
我的windows是在加了域的环境,我的开发机不在域内,网络是要连接代理服务器的,每次都要验证域账号和密码才行,需要怎么设置本地代理的验证呢?求大神指导。API看不懂啊,python小白。。。
你好,他这个封装完了的api我没见到,可能你要查看ms的底层api
我查找了相关的API已经可以通过本地代理访问了。
rclone能再详细点么,描述太简单了,可能我还是linux的小白,很多都看不懂啊!!
你可以看写这个 https://rclone.org/onedrive/
感谢提供的文档资料,我已经可以正常挂载服务器了。我是在本地GUI的linux服务器中测试后,然后再迁移到远程服务器中。最后在crontab下加入维护命令 这个是调用什么命令,具体能提供下源码么?又来麻烦您了~
不客气。crontab一搜就很多,
比如这样:
# For example, you can run a backup of all your user accounts
# at 5 a.m every week with:
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/
就是前面加时间 后面是你的维护命令
onedrive访问速度太慢了,所以弃之,不过5T的容量比较吸引人。
嗯,国际版确实不快,国内版本要好些。这东西还有一个用途是vps间中转和备份数据。