如何从 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 发送帖子消息即可。