在 RaspberryPi 上以 root 身份通过 mutt 发送电子邮件

在 RaspberryPi 上以 root 身份通过 mutt 发送电子邮件

我有一个应用程序需要以 root 身份运行才能访问 Raspberry Pi 上的硬件。在此应用程序中,我需要发送带有包含数据的附件的电子邮件。

我能够编写一个使用 mutt 成功发送电子邮件的 bash 脚本。在使用 C++ 代码的快速测试中,我能够调用此脚本并且它成功运行。

但是,当我将其集成到更大的项目中时,我被迫以 root 身份运行,但它无法发送。然后我注意到,如果我使用 sudo 单独运行脚本,它也会失败。

我假设 root 用户的配置丢失,并且通常使用的配置未与 sudo 一起使用。就用户配置而言,pi 处于默认设置。我尝试将我用配置详细信息编辑的“muttrc”文件放在 /etc/、/etc/Mutt、/etc/mutt 和 /etc/.mutt 中,但这些都不起作用。

编辑:

这是电子邮件脚本

    #!/bin/bash  
    DATAFILE=$1  
    RECIPIENT=$2  
    echo "Sending email with data..."  
    echo "Recipient: " $RECIPIENT  
    echo "Attached file: " $DATAFILE  
    echo "" | mutt -s "Update" -i /home/pi/msgbody.txt $RECIPIENT -a $DATAFILE

当提供参数并直接从终端调用而无需 sudo 时,此脚本将按预期运行。使用 sudo 则不起作用。我倾向于认为 mutt 配置是问题的根本原因(双关语),而不是 C 代码。

这是 ls -l 权限的输出(不确定是否有用)

-rwxr-xr-x  1 pi   pi    222 Mar 19 21:51 emailscript

我相信默认用户是 pi

C++ 代码(无需 sudo 即可运行):

void sendFile()
{
    string command = "/home/pi/emailscript " + lastFile + " " + emailAddress;
    system(command.c_str());
}

int main()
{

    cout << "Testing file sending function" << endl;
    sendFile();

    return 0;

}

其中文件名和电子邮件地址在上面初始化为全局变量。这在没有 sudo 的情况下运行时也有效,但在使用 sudo 运行时停止。

此代码的 ls -l 输出:

-rwxr-xr-x 1 pi pi 68540 Mar 19 22:49 emailTestCode

据我所知,主要项目是一个过程。它大约有 400 行代码,并使用了几个库。主项目中的权限与上面给出的测试代码完全相同。

编辑2:(C++而不是C)

以 root 身份运行 C++ 代码会导致预期的回显输出到 std(此处未包含,因为它只是我的电子邮件地址和文件名(为文件提供了绝对路径))

标准错误:

/home/pi/emailscript: line 8:  1911 Done                    echo ""
      1912 Alarm clock             | mutt -s "Update" -i /home/pi/msgbody.txt $RECIPIENT -a $DATAFILE

答案1

我收到了一些建议,为我解决了这个问题,有些人可能会认为这是一种解决方法。

我编辑了命令以强制脚本以用户 Pi 身份运行:

void sendFile()
{
    string command = "su pi -c \"/home/pi/emailscript " + lastFile + " " + emailAddress + "\"";
    system(command.c_str());
}

“正确的”解决方案可能是将 mutt 配置包含在 /root 中,但这似乎对我不起作用。

答案2

我不知道你是否仍然遇到这个问题,但这为我解决了这个问题:

sudo sh -c“echo >> /etc/Muttrc && cat /home/pi/.muttrc >> /etc/Muttrc”

当我遇到 mutt 无法使用 sudo 时,我尝试查找错误,但没有找到任何错误。无论如何,不​​在 /home/pi/.muttdebug0 中,结果我必须查看 /root/.muttdebug0 ,但那里也没有错误,即使使用“-d 2”也没有错误。只是与 /home/pi/.muttdebug0 相比缺乏信息,几乎就像 mutt 在使用 sudo 执行时甚至没有尝试发送电子邮件一样。

当谷歌搜索时,我遇到了这个页面,并认为“在 /root 中包含 mutt 配置”可能是诀窍,但你说它不起作用,我可能知道为什么。

日志文件 /root/.muttdebug0 没有显示任何错误,但它确实显示了以下内容:“读取配置文件“/etc/Muttrc”。

与 /home/pi 中的配置文件名不同,该配置文件名不以 ,也许这就是它对你不起作用的原因?您可能不知道文件名是不同的,哦,不要忘记大写的 M ;)

相关内容