利用Mutt和Msmtp发送邮件

树莓派使用的wifi联网,在宿舍使用的是公共网络,不能设置静态ip,每次树莓派上电开机后ip地址可能会改变,所以让树莓派开机联网后自动发送ip地址到QQ邮箱

一、安装mutt和msmtp

mutt: 是一个Linux下的邮件程序,Mutt 更像一个文件管理器,只不过它管理的是email。

msmtp: 是Linux下一个非常简单易用的smtp客户端。

sudo apt-get install mutt
sudo apt-get install msmtp

二、配置mutt和msmtp

1、配置msmtp,在用户的根目录下新建文件.msmtprc,内容如下:

account default
host smtp.aliyun.com
from 你的邮箱地址
auth plain
user 你的邮箱地址
password 你的邮箱密码
logfile /var/log/msmtp.log
  • host 你的邮箱的SMTP服务器地址,可以在邮件的网站上查到,我用的阿里云的邮箱,所以是aliyun.com后缀
  • from 这里是发件人地址,在收件方会显示,设置成你给树莓派申请的邮箱地址
  • user 这里是用户名,网上有用户说这里设置邮箱的用户名即@符号前面的字符串就可以,我没有尝试,还是设置的我的邮箱地址,建议先使用邮箱地址,配置成功之后可以自己进行修改
  • password 这个就是自己邮箱的密码,没什么好说的,但是这里是明文密码,要注意保密:)
  • logfile 这是msmtp的程序运行日志文件路径,需要自己创建,msmtp自己不会创建.在发送邮件之后程序会把发送日志写到这个路径的文件里。

2、配置mutt的文件,同样在用户根目录下新建文件.muttrc,内容如下:

set sendmail="/usr/bin/msmtp"
set use_from=yes
set realname="RaspberryPi"
set editor="vim"

 使用以下命令测试发送邮箱是否成功:

echo “hello world” | mutt -s “title” xxx@gmail.com

二、设置树莓派读取Ip地址并通过邮件发送

以下脚本文件参考网上的文章 send-ip-mail.sh

#!/bin/bash
# check network availability
while true
do
TIMEOUT=5
SITE_TO_CHECK="www.126.com"
RET_CODE=`curl -I -s --connect-timeout $TIMEOUT $SITE_TO_CHECK -w %{http_code} | tail -n1`
if [ "x$RET_CODE" = "x200" ]; then
echo "Network OK, will send mail..."
break
else
echo "Network not ready, wait..."
sleep 1s
fi
done
# get the IP address of eth0, e.g. "192.168.16.5"
ETH0_IP_ADDR=`ifconfig eth0 | sed -n "2,2p" | awk '{print substr($2,1)}'`
# send the Email
echo "Current time: `date '+%F %T'`. Enjoy it" | mutt -s "IP Address of Raspberry Pi: $ETH0_IP_ADDR" xxx@gmail.com

使用chmod +x send-ip-mail.sh添加执行权限后,运行查看是否可以发送ip地址。

在rc.local文件中添加开机执行该脚本的命令后,上电重启发现不能接收到邮件,后来上网查看发现是权限问题,经过一番折腾,后来选择把.muttrc,.msmtprc和send-ip-mail.sh文件都复制到/boot目录下,在rc.local中添加如下内容,最后重新上电可以接收到树莓派发来的邮件,通过邮件里的ip地址ssh登录正常。

因为只在/home/pi下设置了pi的msmtp所以,只有/home/pi下的文件才有权限被mutt发送
于是新建/home/pi/ip.txt, 并修改了.sh文件的被执行文件文/home/pi/ip.txt
试了一下
echo “$ip2” | mutt -s “ip” siemen.zem@gmail.com <ip.txt
gmail能收到我的ip.txt了,
又试了一下sh一下我的.sh
vim /home/pi/ip.txt (故意引来比对错误重而出发overwrite这个ip.txt的修改)
201.197.24.10 // wq!保存
执行通道:
echo “you get a new IP” | mutt -s “New IP address” siemen.zem@gmail.com <ip.txt
查看邮箱
///////////////////////////Gmail/////////////////////////
New IP address
收件箱

raspberryPi siemen.zem@gmail.com
下午11:04 (1分钟前)
发送至 我

101.127.23.195
//////////////////////////END///////////////////////
在此验证.sh的功能
串改/home/pi/ip.txt
vim /home/pi/ip.txt 201.127.23.195
执行 sh
sudo sh /var/mail/MailPubIP.sh
发送ip.txt
echo “you get a new IP” | mutt -s “New IP address” siemen.zem@gmail.com <ip.txt
查看邮件,成功改回正确的ip:101.127.23.195
就此,gmail的设置已经完成。

可惜啊,哪怕我修改MailPubIP.sh的也没有能在sh里面执行完成mail的功能,

sendmail: 530 5.7.0 Must issue a STARTTLS command first. g26sm10938491pfo.57 – gsmtp
Error sending message, child exited 1 ().
Could not send the message //原以为是useSTARTTLS的顺序问题,实际是msmtp只会拥有/home/pi/下的700,而在/var/mail下的MailPubIP.sh不能被执行,cp这个MailPubIP.sh复制一个到/home/pi下,直接执行sh MailPubIP.sh就搞定了。接下来直接crontab -e,每20分钟执行一次shell。

[wpedon id=1432]

One comment

  1. 修改
    /home/pi/.msmtprc
    最终编辑好里面的设置,一开始改了很多次,试发邮件都是失败的
    echo “hello world” | msmtp -s “title” siemen.zem@gmail.com
    或者
    echo “hello world” | mutt -s “title” siemen.zem@gmail.com
    都是失败的
    后来把gmail的安全级别降了降,猜怎么着?齐活!
    现在想怎么把msmtp改进sh里面,可惜时间紧,不懂的就是不会,失败了
    pi@raspberrypi:~ $ sudo sh /var/mail/MailPubIP.shsendmail: 530 5.7.0 Must issue a STARTTLS command first. r7sm12035588pjd.8 – gsmtp
    Error sending message, child exited 1 ().
    Could not send the message.

Comments are closed.