一直挂载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下加入维护命令,每天掉用就是了。

标签: , , , ,

13 条评论 发表在“Office E5 Develop的outlook邮件和onedrive文件调用api实现”上

  1. smy说道:

    大佬,o365的使用方法可以再讲的详细一点吗?发邮件的那些代码是写个脚本运行吗?

    • wingwy说道:

      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()

  2. Xiao说道:

    我的windows是在加了域的环境,我的开发机不在域内,网络是要连接代理服务器的,每次都要验证域账号和密码才行,需要怎么设置本地代理的验证呢?求大神指导。API看不懂啊,python小白。。。

    • wingwy说道:

      你好,他这个封装完了的api我没见到,可能你要查看ms的底层api

      • Xiao说道:

        我查找了相关的API已经可以通过本地代理访问了。
        rclone能再详细点么,描述太简单了,可能我还是linux的小白,很多都看不懂啊!!

          • Xiao说道:

            感谢提供的文档资料,我已经可以正常挂载服务器了。我是在本地GUI的linux服务器中测试后,然后再迁移到远程服务器中。最后在crontab下加入维护命令 这个是调用什么命令,具体能提供下源码么?又来麻烦您了~

            • wingwy说道:

              不客气。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/

              就是前面加时间 后面是你的维护命令

  3. a.zuo说道:

    onedrive访问速度太慢了,所以弃之,不过5T的容量比较吸引人。

    • wingwy说道:

      嗯,国际版确实不快,国内版本要好些。这东西还有一个用途是vps间中转和备份数据。

留下回复(本站有评论邮件通知功能)