Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否可以通过smtp通过bash脚本发送邮件?_Bash_Smtp_Postfix Mta - Fatal编程技术网

是否可以通过smtp通过bash脚本发送邮件?

是否可以通过smtp通过bash脚本发送邮件?,bash,smtp,postfix-mta,Bash,Smtp,Postfix Mta,我有postfix+dovecot。我想做一个bash脚本,它可以使用SMTP来完成这个任务。我不想使用sendmail 可能吗?可能有人有一些代码示例?您希望bash直接与SMTP服务器对话吗?那真的不会发生。从技术上讲,使用bash中提供的对网络通信的支持是可能的,但实际上,您不想走这条路 这意味着您真正需要的是调用一个外部程序,该程序将为您接收SMTP。通常情况下,这将是sendmail,但如果您试图避免这种情况,还有很多其他选择,包括: 传家宝 这两种方法都可以处理与远程SMTP服

我有postfix+dovecot。我想做一个bash脚本,它可以使用SMTP来完成这个任务。我不想使用sendmail


可能吗?可能有人有一些代码示例?

您希望
bash
直接与SMTP服务器对话吗?那真的不会发生。从技术上讲,使用bash中提供的对网络通信的支持是可能的,但实际上,您不想走这条路

这意味着您真正需要的是调用一个外部程序,该程序将为您接收SMTP。通常情况下,这将是
sendmail
,但如果您试图避免这种情况,还有很多其他选择,包括:

  • 传家宝

这两种方法都可以处理与远程SMTP服务器的通信,而不涉及sendmail。

男孩,当这个挑战被抛出时,它总是
bash
es我的头朝上!:-)

#/垃圾箱/垃圾箱
功能检查状态{
期望值=250
如果[$#-eq 3];那么
expect=“${3}”
fi
如果[$1-ne$expect];则
echo“错误:${2}”
出口
fi
}
MyHost=`hostname`
阅读-p“输入邮件主机:”邮件主机
邮箱=25
读-p“From:”FromAddr
读-p“至:”ToAddr
阅读-p“主题:”主题
阅读-p“消息:”消息
exec 3/dev/tcp/${MailHost}/${MailPort}
read-U3STS线
检查状态“${sts}”“${line}”220
echo“HELO${MyHost}”>&3
read-U3STS线
检查状态“$sts”“$line”
回显“邮件发件人:${FromAddr}”>&3
read-U3STS线
检查状态“$sts”“$line”
echo“RCPT TO:${ToAddr}”>&3
read-U3STS线
检查状态“$sts”“$line”
回显“数据”>&3
read-U3STS线
检查状态“$sts”“$line”354
回显“Subject:${Subject}”>&3
回显“${Message}”>&3
回声“>&3”
read-U3STS线
检查状态“$sts”“$line”

通过gmail测试,目前可以正常工作

#!/bin/bash
# Use "host -t mx yourispdomain" to find out yourispmailserver
exec 1<>/dev/tcp/yourispmailserver/25
a=$(cat <<"MAILEND"
HELO local.domain.name
MAIL FROM: <me@local.domain.name>
RCPT TO: <you@local.domain.name>
DATA
From: me@local.domain.name
To: you@local.domain.name
Subject: test
send your orders for pizza to the administrator.
.
QUIT
.
MAILEND
)
IFS='
'
declare -a b=($a)
for x in "${b[@]}"
 do
   echo $x
   sleep 1
 done
#/bin/bash
#使用“主机-t mx yourispdomain”查找您的ISPMailServer
exec 1/dev/tcp/yourispmailserver/25

a=$(cat我不清楚您何时说不想使用sendmail。可能是您不想使用sendmail进程

Postfix有一个名为“sendmail”的可执行文件,可能你想使用它,因为我想不出你为什么不应该使用它

#/bin/bash

FROM='from@test.com'
TO='to@test.com'
SUBJECT='This is a test message'

BODY="This is a test mail message body.
Hi there.
"

printf "From: <%s>\nTo: <%s>\nSubject: %s\n\n%s" "$FROM" "$TO" "$SUBJECT" "$BODY" | sendmail -f "$FROM"
#/bin/bash
来自from@test.com'
到to@test.com'
SUBJECT='这是一条测试消息'
BODY=“这是一个测试邮件邮件正文。
你好。
"
printf“From:\nTo:\n对象:%s\n\n%s”“From”“TO”“SUBJECT”“BODY”“sendmail-f”“From”

您可以使用SSMTP。也许这一个也有帮助:


我们刚刚发现了这个小巧而奇妙的实用工具
sendmail
(不是
sendmail
)。语法太简单了,无法解释

例如:

SERVER="smtp.company.com"
FROM="sender@company.com"
TO="recepient@company.com"
SUBJ="Some subject"
MESSAGE="Some message"
CHARSET="utf-8"

sendemail -f $FROM -t $TO -u $SUBJ -s $SERVER -m $MESSAGE -v -o message-charset=$CHARSET
更多信息可通过帮助或作者网站获得: .

  • 安装sSMTP,例如:

    apt get install ssmtp

  • 配置ssmtp:

    sudo nano/etc/ssmtp/ssmtp.conf

    ·服务器:
    mailhub=smtp.1和1.de:587

    ·主机名:
    Hostname=subdomain.domain.com

    ·用户:
    AuthUser=user@domain.com

    ·通过:
    AuthPass=您的密码

然后在您的sh文件中,执行您需要的操作并通过管道将其发送到mail,例如:

!/bin/bash
du-sh | mail-s“磁盘使用情况报告”user@domain.com

!/bin/bash

echo“今天的数据库备份正常。”| mail-s“数据库每日备份警报”user@domain.com

我喜欢dldnh的答案!

通过专用smtp中继发送管理警报的完美解决方案(我知道您有一个)。将smtp/Postfix/etc放在多个服务器上没有意义,对吗

我有一个建议:在消息文本之前发送一条空行,让中继知道不再有标题出现。如果没有空行,您的消息文本可能不会被发送;例如,如果消息的第一行中有冒号。

以下是我随意修改的一个小版本:

#!/bin/bash
MyHost=$(hostname)
MailHost="mail"
MailPort=25

function checkStatus {
  read -u 3 sts line
  expect=250
  if [ $# -eq 1 ] ; then
    expect="${1}"
  fi
  if [ $sts -ne $expect ] ; then
    echo "Error: ${line}"
    exit
  fi
}

FromAddr="$(whoami)@${MyHost}"
ToAddr="admin@SomeDomain.com"
Subject="Status Alert"
Message='Msg: hello bozo!!'

# Brilliant!!
exec 3<>/dev/tcp/${MailHost}/${MailPort} ; checkStatus 220

echo "HELO ${MyHost}" >&3 ; checkStatus
echo "MAIL FROM: ${FromAddr}" >&3 ; checkStatus
echo "RCPT TO: ${ToAddr}" >&3 ; checkStatus
echo "DATA" >&3 ; checkStatus 354
echo "Subject: ${Subject}" >&3

# Insert one blank line here to let the relay know you are done sending headers
# Otherwise a colon ":" in the message text will result in no text being sent.
echo "" >&3

# Send the message text and close
echo "${Message}" >&3
echo "." >&3 ; checkStatus
!/bin/bash
MyHost=$(主机名)
MailHost=“邮件”
邮箱=25
功能检查状态{
read-U3STS线
期望值=250
如果[$#-eq 1];则
expect=“${1}”
fi
如果[$sts-ne$expect];则
echo“错误:${line}”
出口
fi
}
FromAddr=“$(whoami)@${MyHost}”
ToAddr=”admin@SomeDomain.com"
主题=“状态警报”
Message='Msg:hello bozo!!'
#太棒了!!
exec 3/dev/tcp/${MailHost}/${MailPort};检查状态220
echo“HELO${MyHost}”>&3;检查状态
回显“邮件发件人:${FromAddr}”>&3;检查状态
回显“RCPT TO:${ToAddr}”>&3;检查状态
回显“数据”>&3;检查状态354
回显“Subject:${Subject}”>&3
#在此处插入一个空行,让中继知道您已完成发送标题
#否则,消息文本中的冒号“:”将导致不发送文本。
回显“”>&3
#发送消息文本并关闭
回显“${Message}”>&3
回显“>&3;检查状态

还想在这里加入另一个解决方案,如果您无法访问sendmail等,这个解决方案很有用。大多数linux服务器都有telnet,所以我们可以使用它

function send_email{

echo "EHLO my_mail_server.example.com"   # replace this with your mail server domain
sleep 1
echo "MAIL FROM: my_from_address@example.com
sleep 1
echo "RCPT TO: my_to_address@example.com
sleep 1
echo "DATA
sleep 1
echo "Subject: My Subject Line"
sleep 1
echo "To: my_to_address@example.com"
sleep 1
echo "From: my_from_address@example.com"
sleep 1
echo "This is the body of my email. Put whatever in here."
sleep 1
echo "." # signifies the end of data entry, mail will be queued to send.
}

send_email | telnet 1.2.3.4 25 # call the function and pass it into telnet command.

你为什么不想使用SMTP客户端?postfix“
sendmail
wrapper”有什么问题?可能会回答你的问题。Ssmtp。我同意,可能是我说的不清楚。我的意思是,我想知道bash脚本使用SMTP auth连接到远程SMTP服务器并发送邮件的可能性。这似乎是我在寻找的。谢谢。很高兴我能找到它为您吃这个!邮件客户端中的收件人为空,并且允许通过SMTP服务器发送电子邮件。还有另一个选项可以使用sendEmail命令。或者人们经常这样做,因为可能未安装和配置sendmail、msmtp.postfix等
function send_email{

echo "EHLO my_mail_server.example.com"   # replace this with your mail server domain
sleep 1
echo "MAIL FROM: my_from_address@example.com
sleep 1
echo "RCPT TO: my_to_address@example.com
sleep 1
echo "DATA
sleep 1
echo "Subject: My Subject Line"
sleep 1
echo "To: my_to_address@example.com"
sleep 1
echo "From: my_from_address@example.com"
sleep 1
echo "This is the body of my email. Put whatever in here."
sleep 1
echo "." # signifies the end of data entry, mail will be queued to send.
}

send_email | telnet 1.2.3.4 25 # call the function and pass it into telnet command.