You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

树莓派Zero W运动检测相机无法触发邮件通知求助

解决树莓派Zero W运动检测相机on_event_start邮件通知失败问题

看起来你已经完成了大部分正确的配置——终端能正常发邮件,但motion触发事件时却连不上SMTP服务器,这大概率是配置细节或运行环境的问题,咱们一步步排查解决:

1. 先修正revaliases的拼写错误

你的revaliases配置里有两处明显的错误:

root:myEmail@gmail:mail.google.com:587
  • 邮箱地址不完整:应该是myEmail@gmail.com(少了.com后缀)
  • SMTP服务器域名写错:应该是smtp.gmail.com而非mail.google.com

修正后的revaliases内容应为:

root:myEmail@gmail.com:smtp.gmail.com:587

修改后重启ssmtp服务:sudo systemctl restart ssmtp,再测试motion的事件触发。

2. 给motion用绝对路径调用邮件工具

motion运行时的环境变量可能和你终端的不一样,导致找不到mail或echo命令。试试把on_event_start改成绝对路径的形式:

on_event_start /usr/bin/echo "Motion detected!" | /usr/bin/mail -s "Pi Camera Alert" myEmail@gmail.com

如果还是不行,可以显式指定ssmtp的路径给mail命令:

on_event_start /usr/bin/echo "Motion detected!" | /usr/bin/mail -S sendmail=/usr/sbin/ssmtp -s "Pi Camera Alert" myEmail@gmail.com

3. 检查Gmail的安全验证设置

如果你开启了谷歌账号的两步验证(2FA),那ssmtp.conf里填的普通密码是无效的,必须使用App Password:

  1. 登录谷歌账号,进入App Passwords页面(需先开启2FA才能看到该选项)
  2. 创建一个新的App Password,选择"Mail"和"Other (Custom name)"(比如填Raspberry Pi)
  3. 把生成的16位密码替换ssmtp.conf里的AuthPass值

如果没开2FA,确保你已经开启了"不太安全的应用访问"(不过谷歌现在逐步淘汰该选项,更推荐用App Password)

4. 排查motion进程的网络连接问题

终端能连接不代表motion进程能连接,试试在on_event_start里先做网络测试:

on_event_start ping -c 3 smtp.gmail.com >> /tmp/motion_network_test.log 2>&1 && echo "Motion detected!" | mail -s "Alert" myEmail@gmail.com

然后查看/tmp/motion_network_test.log,看能否解析到smtp.gmail.com的IP。如果DNS解析有问题,可以直接在ssmtp.conf里用IP地址代替域名:

mailhub=172.253.122.108:587

(这个是smtp.gmail.com的其中一个IP,你可以用nslookup smtp.gmail.com查询最新的可用IP)

5. 替代方案:用Python脚本发送邮件

如果ssmtp的方式始终有问题,换用Python脚本会更灵活可控,也更容易排查错误:

  1. 创建一个send_motion_alert.py脚本:
import smtplib
from email.mime.text import MIMEText

def main():
    sender_email = "myEmail@gmail.com"
    receiver_email = "myEmail@gmail.com"
    app_password = "你的App Password或普通密码"
    subject = "树莓派相机检测到运动!"
    body = "你的监控相机刚刚捕捉到了运动事件。"

    # 构造邮件内容
    msg = MIMEText(body, 'plain', 'utf-8')
    msg['Subject'] = subject
    msg['From'] = sender_email
    msg['To'] = receiver_email

    try:
        # 连接Gmail SMTP服务器
        with smtplib.SMTP('smtp.gmail.com', 587) as server:
            server.starttls()  # 启动TLS加密
            server.login(sender_email, app_password)
            server.send_message(msg)
        print("邮件发送成功")
    except Exception as e:
        print(f"发送失败:{str(e)}")

if __name__ == "__main__":
    main()
  1. 给脚本加执行权限:sudo chmod +x send_motion_alert.py
  2. 修改motion的配置:
on_event_start python3 /home/pi/send_motion_alert.py >> /tmp/motion_email_log.log 2>&1

这样可以通过/tmp/motion_email_log.log查看脚本的执行日志,更容易定位问题。

6. 检查motion的运行权限

用ps aux | grep motion查看motion进程的运行用户,如果是motion用户而非root,它可能没有读取/etc/ssmtp下配置文件的权限。可以修改配置文件的权限:

sudo chmod 644 /etc/ssmtp/ssmtp.conf
sudo chmod 644 /etc/ssmtp/revaliases

不过更推荐用上面的Python脚本,避免权限相关的麻烦。

内容的提问来源于stack exchange,提问作者Lamola Rabogale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:48:47