GitHub Actions 教程:定时发送天气邮件

作者: 阮一峰

日期: 2019年12月22日

2019年11月,GitHub 正式开放了 GitHub Actions 这个功能,现在不用申请就能使用。

GitHub Actions 是一个 CI/CD(持续集成/持续部署)工具,但也可用作代码运行环境。功能非常强大,能够玩出许多花样。

我写的《GitHub Actions 入门教程》 已经介绍了它的基本用法。本文紧接前一篇教程,给出一个简单实用的例子:每天定时运行一次脚本,获取天气预报,然后发送电子邮件。

完整代码可以从 GitHub 仓库 ruanyf/weather-action 获取。

第一步:获取天气预报

网站 wttr.in 支持命令行请求天气预报。


$ curl wttr.in

上面的命令会返回,你的 IP 地址所在位置的天气。

它还允许 URL 里面指定城市。


$ curl wttr.in/Shanghai

返回的数据可以通过curl命令-o参数,保存成文件,以便后面发送。


$ curl -o result.html wttr.in/Shanghai

wttr. in 允许定制天气预报的格式和内容,详见它的文档,这里就不展开了。最后封装好的脚本weather.sh,完整代码看这里

第二步:发送邮件

拿到天气预报以后,只要放在邮件里面,发出去就可以了。

我用的是网易 163 邮件的免费发送服务,需要在它的网站上开通,本地的配置请看下一步。

第三步:配置 GitHub Actions

触发 GitHub Actions 需要在项目仓库新建一个.github/workflows子目录,里面是 YAML 格式配置文件,文件名可以随便取。GitHub 只要发现配置文件,就会运行 Actions。

配置文件的第一部分是触发条件。


name: 'GitHub Actions Weather Bot'
 
on:
  push:
  schedule:
    - cron: '0 21 * * *'

上面代码中,name字段是配置文件的描述,on字段是触发条件。我们指定两种情况下触发,第一种是代码 Push 进仓库,第二种是定时任务,每天在国际标准时间21点(北京时间早上5点)运行。

接着,就是运行流程。


runs-on: ubuntu-latest
steps:
  - name: 'Checkout codes'
    uses: actions/checkout@v1

上面代码中,运行环境指定为最新版的 Ubuntu。流程的第一步是从代码仓库获取代码。

拿到代码以后,就可以获取天气预报了。


- name: 'Get weather report'
  run: bash ./weather.sh

上面代码中,run字段就是所要运行的命令。

最后,发送邮件。


- name: 'Send mail'
  uses: dawidd6/action-send-mail@master
  with:
    serveraddress: smtp.163.com
    serverport: 465
    username: ${{ secrets.MAILUSERNAME }}
    password: ${{ secrets.MAILPASSWORD }}
    subject: Shanghai Weather Report
    body: file://result.html
    to: [email protected]
    from: GitHub Actions
    content_type: text/html

上面代码中,发送邮件使用的是一个已经写好的 action,只要配几个参数就可以用。参数之中,邮件 SMTP 服务器的用户名和密码,使用的是加密变量,需要在项目的settings/secrets菜单里面设置。

完整的配置文件看这里。更具体的语法解释可以参考《GitHub Actions 入门教程》

写好配置,推送到仓库以后,就可以每天清早收到一封天气预报邮件了。在这个基础上不难扩展,可以定时执行各种脚本(比如每5分钟检查一次某个网站是否在线),然后将结果发到指定的渠道,这里就有一个发到社交媒体 Telegram 的例子

(完)

留言(33条)

GitHub 被微软收购后确实更加牛皮了,感谢阮老师的教程 >_

`curl wttr.in`返回的信息是乱码的

引用NikolausLiu的发言:

`curl wttr.in`返回的信息是乱码的

在bash环境下试就可以了

fork 不可以吗

wttr.in 这个网站好像被你玩跪了! ????

怎么不到3分钟就发送一次啊,不怎么会sh

该怎么隐藏stmp的密码呢

win10 curl wttr.in改成utf-8页乱码.....咋解决

要是能发微信 就更好了

学习了,我也开通了 github actions 但是一直没使用,回头试用下。

哈哈 我用 GitHub Actions做了一个定时的百度链接推送

引用NikolausLiu的发言:

`curl wttr.in`返回的信息是乱码的

先输入 chcp 65001 将运行环境改为 UTF-8

请问如何自定义发变的内容格式呢

引用暖暖的发言:

该怎么隐藏stmp的密码呢

用GitHub的Secrets

在设置里面可以找到Secrets这个选项

引用Shawn的发言:

要是能发微信 就更好了

ServerChan 了解一下

玩完发现邮箱给我发送了一个《网易邮箱帐号异常登录提醒》的邮件,告诉我有异常登录,我应该怎么弄,很方~

登录时间 2020-01-06 19:32
登录地点 美国(52.177.122.*)
登录产品 邮箱客户端(通过POP3/IMAP协议)

好像找到个错误,action.yml文件 TZ=':Asia/Shanghai' 这里的Asia前面多了个冒号。

那个wttr.in网站好像已经被玩坏了。。打开会显示这个:

Sorry, we processed more than 1M requests today and we ran out of our datasource capacity.
We hope to solve the problem as soon as possible, so you can enjoy
your favourite weather service 24x365 even if it rains or snows.

阮大大,Send Emil这一步错了是什么原因呀

Error: 554 DT:SPM 163 smtp1,GdxpCgCHBIaigBVeW2UhAQ--.8S2 1578467493,please see http://mail.163.com/help/help_spam_16.htm?ip=40.122.165.120&hostid=smtp1&time=1578467493
##[error]Docker run failed with exit code 1

引用fuchao的发言:

玩完发现邮箱给我发送了一个《网易邮箱帐号异常登录提醒》的邮件,告诉我有异常登录,我应该怎么弄,很方~

登录时间 2020-01-06 19:32
登录地点 美国(52.177.122.*)
登录产品 邮箱客户端(通过POP3/IMAP协议)

翻墙了不是

### ERRORED 06:45:23Z

- Workflows can't be executed on this repository. Please check your payment method or billing status.

请问阮老师,这是什么意思

引用MangoCool的发言:

### ERRORED 06:45:23Z

- Workflows can't be executed on this repository. Please check your payment method or billing status.

请问阮老师,这是什么意思

你的可能是 Github 帐号欠费了

如果让那个wttr的网站返回图片,就会报错,可以帮我看看是为什么吗?
Error: invalid byte sequence in UTF-8

引用Asamu的发言:

阮大大,Send Emil这一步错了是什么原因呀

Error: 554 DT:SPM 163 smtp1,GdxpCgCHBIaigBVeW2UhAQ--.8S2 1578467493,please see http://mail.163.com/help/help_spam_16.htm?ip=40.122.165.120&hostid=smtp1&time=1578467493
##[error]Docker run failed with exit code 1

访问http://mail.163.com/help/help_spam_16.htm就能看到啊,应该是调用action发送的邮件数量太多了吧..

您好,问一下,这个项目是和操作系统有关是吗?

哇,受教了,但是有没有方法能自动提交代码呢?

例如:

$ terser ./src/name.js -c toplevel=true -m -o ./dist/name.min.js

这样之后提交代码到GitHub

经测试,这个定时不准确,如果不需要准确定时任务,可以尝试

username: ${{ secrets.MAILUSERNAME }}
password: ${{ secrets.MAILPASSWORD }}

!==

username: ${{ secrets.MAIL_USERNAME }}
password: ${{ secrets.MAIL_PASSWORD }}

那个cron明明是晚上9点吧?不是文中所说的早上5点。。。

引用Danny的发言:

那个cron明明是晚上9点吧?不是文中所说的早上5点。。。

有时区问题

引用Danny的发言:

那个cron明明是晚上9点吧?不是文中所说的早上5点。。。

这个时区是UTC

没玩过网易邮箱的发送,在配置secrets.MAILPASSWORD这个密码变量的时候配成了邮箱的登录密码,百度完网易的535错误后才知道要填写授权码,改成授权码之后就登录成功了。收到了第一封天气预报邮件,哈哈,阮老师的教程太赞了

有没有用这东西搞下载的,把github当网盘用,我好像没看到单个仓库限制的大小。

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接