无需本地邮件服务器即可通过 shell 脚本发送电子邮件

无需本地邮件服务器即可通过 shell 脚本发送电子邮件

如何从 shellscript(通常是 cronjob)发送电子邮件,而无需在同一主机上运行邮件服务器。使用 smtp 服务器。运行 Ubuntu。

我查看了各种教程,但找不到合适的方法(简单又安全)。

谢谢

斯文

答案1

您可以以中继模式安装 postfix 或其他程序,然后使用 mail(x) 或 mutt 发送邮件。两者都可以从命令行发送邮件。

Ubuntu 上的一个好选择可能是将 nullmailer 作为 MTA,因为它是为仅中继操作而设计的。

答案2

如果是 ubuntu,那么您就有 python 并且可以使用它的 smtplib 模块(意味着同一主机上没有 MTA)。下面发布了一个小示例来帮助您入门(您可能希望将用户名/密码/配置放在 ini 文件中,进行一些错误检查等,但如果服务器支持,则“starttls”行会加密 smtp 会话的其余部分。)这让您简单而安全。只需做一点额外的工作就可以添加附件等。

您可以这样调用它:mailsender.py“这是我的消息”。

#!/usr/bin/python

import smtplib
import sys

message = sys.argv[1]

server = smtplib.SMTP('smtp.gmail.com', 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login('[email protected]', 'password')
server.sendmail('[email protected]', '[email protected]', message)
server.rset()
server.quit()

您可以从 cron 作业或 shellscripts 中调用“mailsender.py”。

答案3

遇到了同样的问题,容器中已经有 Docker 环境和功能齐全的 MTA,因此所有典型端口都已被使用,因此无法在 Docker 主机上照常运行 MTA,而每次备份完成时我都想发送邮件。

感谢@davey,我可以扩展他的 python 脚本来发送有效的邮件:

#!/usr/bin/python

# script to send mail via smarthost
# (do NOT name this script "smtplib.py")

# edit settings
debuglevel   = 0
server_host  = 'localhost'
server_port  = 587
server_user  = '[email protected]'
server_pass  = 'MyVerySecretP455W0RD'
address_from = '[email protected]'
address_to   = '[email protected]'
mail_subject = 'backup completed'

# load requirements
import datetime
import smtplib
import sys
# check if message was given, else show usage
try:
    sys.argv[1]
except IndexError:
    print 'No message given! Usage: ' + sys.argv[0] + ' "my test message"'
    quit(1)
else:
    msg_content = sys.argv[1]
# format mailheader
msg_content = sys.argv[1]
msg_from = "From: " + address_from + "\r\n"
msg_to = "To: " + address_to + "\r\n"
msg_subject = "Subject: " + mail_subject + "\r\n"
msg_timestamp = '{:%a, %d %b %Y %H %M:%S %z}'.format(datetime.datetime.now())
msg_date = "Date: " + msg_timestamp + "\r\n"
msg = msg_from + msg_to + msg_subject + msg_date + "\r\n" + msg_content
# connect to smarthost, login, send mail and disconnect
server = smtplib.SMTP(server_host, server_port)
server.ehlo()
server.starttls()
#server.ehlo()
server.login(server_user, server_pass)
server.set_debuglevel(debuglevel)
server.sendmail(address_from, address_to, msg)
server.rset()
server.quit()

答案4

您可以使用提供 REST API 的电子邮件服务。我使用邮件喷射。他们还提供完全免费的(无需 CC)帐户。只需向他们注册并使用 curl 发送帖子消息即可。

相关内容