- 在发送时在 GUI 中可见
- 如果 Mail 不是当前应用程序,则会窃取焦点
- 它依赖于将来 Mail.app 的帐户设置有效性
更新:我发现了 Sendmail 的
-bs
选项,这似乎是我需要的,但我不知道如何指定设置。另外,为了澄清一下,我想指定 SMTP 设置的原因是,从端口 25 发送的 localhost 邮件会被大多数企业防火墙阻止,但如果我指定服务器和备用端口,则不会遇到这个问题。
-bs
选项,这似乎是我需要的,但我不知道如何指定设置。考虑使用Python脚本替代Bash脚本,因为Mac OS X 包含Python。我没有测试发送部分,但它遵循标准示例。
# Settings
SMTP_SERVER = 'mail.myisp.com'
SMTP_PORT = 25
SMTP_USERNAME = 'myusername'
SMTP_PASSWORD = '$uper$ecret'
SMTP_FROM = 'sender@example.com'
SMTP_TO = 'recipient@example.com'
TEXT_FILENAME = '/script/output/my_attachment.txt'
MESSAGE = """This is the message
to be sent to the client.
"""
# Now construct the message
import smtplib, email
from email import encoders
import os
msg = email.MIMEMultipart.MIMEMultipart()
body = email.MIMEText.MIMEText(MESSAGE)
attachment = email.MIMEBase.MIMEBase('text', 'plain')
attachment.set_payload(open(TEXT_FILENAME).read())
attachment.add_header('Content-Disposition', 'attachment', filename=os.path.basename(TEXT_FILENAME))
encoders.encode_base64(attachment)
msg.attach(body)
msg.attach(attachment)
msg.add_header('From', SMTP_FROM)
msg.add_header('To', SMTP_TO)
# Now send the message
mailer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
# EDIT: mailer is already connected
# mailer.connect()
mailer.login(SMTP_USERNAME, SMTP_PASSWORD)
mailer.sendmail(SMTP_FROM, [SMTP_TO], msg.as_string())
mailer.close()
希望这有所帮助。
mailer = smtplib.SMTP(SMTP_SERVER, SMTP_PORT)
并在“connect”调用中传递它们。有人能确认/解释一下吗?(Python 2.7.2,OS x 10.8) - KillerXconnect
。第二次调用connect仅尝试重新连接到“localhost:25”,这可能是不正确的。 我已更新示例以省略对connect的调用(但将其作为注释保留)。只向connect方法提供主机/端口的方法也是有效的。感谢您的反馈。 - Jason R. Coombsadd_header('To', ...)
之后,使用 msg.add_header('Subject', SUBJECT)
,其中 SUBJECT
是一个字符串字面量或包含主题字符串的变量。 - Jason R. CoombsEmailMessage
API,而不是传统的MIMEMultipart
等混乱的方法。email
模块文档中的示例是一个很好的起点。还可以参考smtplib
文档了解发送部分。关于具体可行的方法(例如使用端口587的SMTP
与startts
,或者使用端口465的SMTP_SSL
,或其他方式),取决于您尝试使用的个别服务器。 - tripleee实际上,“mail”同样有效。
mail -s "subject line" name@address.ext < filename
只要您的机器上设置了SMTP,那么这将完美运行。我认为大多数Mac默认都有SMTP。
如果您没有SMTP,则唯一能做的就是通过Mail.app发送邮件。通过AppleScript进行邮件.app的替代方式是一种选择。当您通过AppleScript告诉Mail.app发送邮件时,您可以告诉它不弹出任何窗口...(但确实需要配置Mail.app)。
介绍如何使用AppleScript操作Mail对如何在AppleScript中处理邮件有一个很好的描述。
mail -s "主题" name@address.ext "你好"
,但它一直等待着什么。我做错了什么? - Anton Tarasenkomail
本身只是连接到您的本地Sendmail / Postfix,所以这并不是对问题的真正回答。如果您已经配置了本地MTA以通过Gmail或其他方式发送邮件,则当然可以使用该服务器进行传出电子邮件提交(就像使用Mail.app或Thunderbird等一样);但是OP想要避免这种情况。 - tripleee有一个名为Sendmail的程序。
除非像马丁的例子一样以原始SMTP形式发送,否则您可能不想使用-bs
命令。 -bs
用于作为守护进程运行SMTP服务器。 Sendmail会直接发送到接收邮件服务器(端口25),除非您在配置文件中覆盖它。您可以通过-C
参数指定配置文件。
在配置中,您可以指定中继服务器(任何邮件服务器或在另一台机器上运行-bs
的sendmail)
使用经过适当配置的中继服务器是个好主意,因为在IT管理邮件服务器时,他们会实施SPF和domain keys。 这使得您的邮件不会落入垃圾箱。
如果端口25被阻止,则只剩下两个选项。
sendmail -bd
,并侦听端口25以外的端口。我相信您可以在命令行上添加配置参数。您需要的是SMART_HOST选项。因此,像这样调用Sendmail:sendmail -OSMART_HOST=nameofhost.com
。
如果您直接从客户端访问SMTP服务器,则可能是保持程序自给自足的唯一方法。
如果您确实可以直接访问SMTP服务器,则可以使用维基百科上的SMTP示例并将其转换为类似以下内容:
#!/bin/bash
telnet smtp.example.org 25 <<_EOF
HELO relay.example.org
MAIL FROM:<joe@example.org>
RCPT TO:<jane@example.org>
DATA
From: Joe <joe@example.org>
To: Jane <jane@example.org>
Subject: Hello
Hello, world!
.
QUIT
_EOF
处理错误时,我会将telnet的输出重定向到文件中,然后稍后使用grep搜索“成功消息”。我不确定消息的格式应该是什么样子的,但我可以从我的SMTP服务器的输出中看到类似于“250 2.0.0 Ok: queued as D86A226C574”的内容。这使我可以使用grep搜索"^250.*queued as"。
我为这个挑战做了这个。如果你删除调用“dig”获取邮件中继的部分,它就是一个100%本地的Bash脚本。
#!/bin/bash
MAIL_FROM="sfinktah@bash.spamtrak.org"
RCPT_TO="sfinktah@bash.spamtrak.org"
MESSAGE=message.txt
SMTP_PORT=25
SMTP_DOMAIN=${RCPT_TO##*@}
index=1
while read PRIORITY RELAY
do
RELAY[$index]=$RELAY
((index++))
done < <( dig +short MX $SMTP_DOMAIN )
RELAY_COUNT=${#RELAY[@]}
SMTP_COMMANDS=( "HELO $HOSTNAME" "MAIL FROM: <$MAIL_FROM>" "RCPT TO: <$RCPT_TO>" "DATA" "." "QUIT" )
SMTP_REPLY=([25]=OK [50]=FAIL [51]=FAIL [52]=FAIL [53]=FAIL [54]=FAIL [55]=FAIL [45]=WAIT [35]=DATA [22]=SENT)
for (( i = 1 ; i < RELAY_COUNT ; i++ ))
do
SMTP_HOST="${RELAY[$i]}"
echo "Trying relay [$i]: $SMTP_HOST..."
exec 5<>/dev/tcp/$SMTP_HOST/$SMTP_PORT
read HELO <&5
echo GOT: $HELO
for COMMAND_ORDER in 0 1 2 3 4 5 6 7
do
OUT=${SMTP_COMMANDS[COMMAND_ORDER]}
echo SENDING: $OUT
echo -e "$OUT\r" >&5
read -r REPLY <&5
echo REPLY: $REPLY
# CODE=($REPLY)
CODE=${REPLY:0:2}
ACTION=${SMTP_REPLY[CODE]}
case $ACTION in
WAIT ) echo Temporarily Fail
break
;;
FAIL ) echo Failed
break
;;
OK ) ;;
SENT ) exit 0
;;
DATA ) echo Sending Message: $MESSAGE
cat $MESSAGE >&5
echo -e "\r" >&5
;;
* ) echo Unknown SMTP code $CODE
exit 2
esac
done
done
sendEmail是一个脚本,您可以使用它来发送电子邮件,包括连接到远程smtp服务器等更复杂的设置,从命令行发送。 http://caspian.dotconf.net/menu/Software/SendEmail/
在OSX上,您可以通过macports轻松安装它:http://sendemail.darwinports.com/
以下是该命令的帮助页面,请注意-s、-xu、-xp标志:
Synopsis: sendEmail -f ADDRESS [options]
Required:
-f ADDRESS from (sender) email address
* At least one recipient required via -t, -cc, or -bcc
* Message body required via -m, STDIN, or -o message-file=FILE
Common:
-t ADDRESS [ADDR ...] to email address(es)
-u SUBJECT message subject
-m MESSAGE message body
-s SERVER[:PORT] smtp mail relay, default is localhost:25
Optional:
-a FILE [FILE ...] file attachment(s)
-cc ADDRESS [ADDR ...] cc email address(es)
-bcc ADDRESS [ADDR ...] bcc email address(es)
Paranormal:
-xu USERNAME authentication user (for SMTP authentication)
-xp PASSWORD authentication password (for SMTP authentication)
-l LOGFILE log to the specified file
-v verbosity, use multiple times for greater effect
-q be quiet (no stdout output)
-o NAME=VALUE see extended help topic "misc" for details
Help:
--help TOPIC The following extended help topics are available:
addressing explain addressing and related options
message explain message body input and related options
misc explain -xu, -xp, and others
networking explain -s, etc
output explain logging and other output options
使用一行代码在Bash中发送电子邮件:
echo "your mail body" | mail -s "your subject" yourmail@yourdomain.com -a "From: sender@senderdomain.com"
echo "你的邮件正文" | mail -s "你的主题" -F 收件人@域名.com
对我有用。 - mossmanmail
不支持-a
选项。(也许可以参考https://dev59.com/OnVD5IYBdhLWcg3wU5-H#48588035了解不同`mail`版本的详细说明。) - tripleeerequire 'net/smtp'
SMTPHOST = 'replace.yoursmtpserver.example.com'
FROM = '"Your Email" <youremail@replace.example.com>'
def send(to, subject, message)
body = <<EOF
From: #{FROM}
To: #{to}
Subject: #{subject}
#{message}
EOF
Net::SMTP.start(SMTPHOST) do |smtp|
smtp.send_message body, FROM, to
end
end
send('someemail@replace.example.com', 'testing', 'This is a message!')
ruby << EOF
... script here ...
EOF
如果您想了解其他发送Ruby电子邮件的方法,请参阅Stack Overflow问题如何从Ruby程序发送邮件?。
您还可以使用随Mac OS X捆绑的其他语言:
sendmail
甚至postfix
可能太大了,如果你只想从你的脚本中发送几封电子邮件。
例如,如果您有一个Gmail帐户,您可以使用Google的服务器使用SMTP发送电子邮件。如果您不想使用Google的服务器,只要您有访问某些SMTP服务器的权限,就应该可以正常工作。
一个非常轻量级的程序,使这变得容易的是msmtp。他们在他们的文档中提供了配置文件示例。
最简单的方法是设置一个系统范围的默认值:
account default
host smtp.gmail.com
from john.doe@gmail.com
user john.doe@gmail.com
password XXX
port 587
msmtp
应该很容易安装。实际上,有一个端口可供使用,因此只需执行port install msmtp
即可。
安装和配置msmtp
后,您可以使用以下命令将电子邮件发送到john.doe@gmail.com
:
mail -s <subject> john.doe@gmail.com <<EOF
<mail text, as many lines as you want. Shell variables will be expanded>.
EOF
man mail
。1) 为什么不配置postfix
只处理出站邮件并通过邮件网关进行中继呢?它最大的优点是已经安装在OS X客户端上。
2) 安装和配置其中一个轻量级MTA,如nullmailer
或ssmtp
(可通过MacPorts获取),仅处理出站邮件。
在这两种情况下,使用mailx(1)
(或如果您想要高级一些则使用mutt
)从shell脚本发送邮件。
在Server Fault上有几个问题详细讨论了这些内容。
sendmail
程序。 - Jeffrey Aylesworth