树莓派Zero W运动检测相机无法触发邮件通知求助
看起来你已经完成了大部分正确的配置——终端能正常发邮件,但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:
- 登录谷歌账号,进入App Passwords页面(需先开启2FA才能看到该选项)
- 创建一个新的App Password,选择"Mail"和"Other (Custom name)"(比如填Raspberry Pi)
- 把生成的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脚本会更灵活可控,也更容易排查错误:
- 创建一个
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()
- 给脚本加执行权限:
sudo chmod +x send_motion_alert.py - 修改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

