Отправка почты из сценария оболочки Bash

"подоприте" и поразите вкладку.. гасит свойство для Вас...

35
задан Peter Mortensen 5 October 2013 в 21:23
поделиться

9 ответов

Поскольку Mac OS X включает Python, рассмотрите возможность использования сценария Python вместо сценария Bash. Я не тестировал отправляющую часть, но она соответствует стандартному примеру .

Python script

# 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()

Надеюсь, это поможет.

54
ответ дан 27 November 2019 в 06:24
поделиться

Существует программа под названием Sendmail .

Вероятно, вы не захотите использовать команду -bs , если только вы не отправляете ее как необработанный SMTP, как в примере Мартина. -bs предназначен для запуска SMTP-сервера в качестве демона. Sendmail будет отправлять прямо на получающий почтовый сервер (на порт 25), если вы не переопределите его в файле конфигурации. Вы можете указать файл конфигурации с помощью параметра -C .

В конфигурации вы можете указать сервер ретрансляции (любой почтовый сервер или sendmail, выполняющий -bs на другом компьютере)

Использование правильно настроенного сервера ретрансляции является хорошей идеей, потому что, когда ИТ-отдел управляет почтовыми серверами, они реализуют ключи домена SPF и . Это убережет вашу почту от мусорной корзины. корпоративный брандмауэр, который слушает на порту, отличном от 25.

Я считаю, что вы можете добавить параметры конфигурации в командную строку. Вам нужна опция SMART_HOST. Поэтому вызовите Sendmail, например, sendmail -OSMART_HOST = nameofhost.com .

15
ответ дан 27 November 2019 в 06:24
поделиться

1) Почему бы не настроить постфикс для обработки только исходящей почты и ее ретрансляции через почтовый шлюз? Его самым большим преимуществом является то, что он уже установлен на клиентах OS X.

3
ответ дан 27 November 2019 в 06:24
поделиться

На самом деле, "почта" тоже работает.

mail -s "subject line" name@address.ext < filename

работает отлично, если на вашем компьютере настроен SMTP. Я думаю, что большинство компьютеров Mac это делают по умолчанию.

Если у вас нет SMTP, то единственное, что вы сможете сделать, это пройти через Mail.app. АЛЬТЕРНАТИВНЫЙ способ пройти через mail.app - через AppleScript . Когда вы указываете Mail.app отправлять почту через AppleScript, вы можете запретить ему открывать какие-либо окна ... (для этого по-прежнему требуется настройка Mail.app).

Введение в создание сценариев почты имеет хороший описание работы с почтой в AppleScript.

39
ответ дан 27 November 2019 в 06:24
поделиться

Probably the only way you could do this, while keeping the program self-sufficient, is if you have direct access to an SMTP server from the clients.

If you do have direct access to an SMTP server you can use the SMTP example from wikipedia and turn it into something like this:

#!/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

To handle errors I would redirect the output from telnet to a file and then grep that for a "success message" later. I am not sure what format the message should be, but I see something like "250 2.0.0 Ok: queued as D86A226C574" in the output from my SMTP server. This would make me grep for "^250.*queued as".

10
ответ дан 27 November 2019 в 06:24
поделиться

Вот простой Ruby скрипт для этого. Ruby поставляется с упомянутыми вами версиями Mac OS X.

Замените все биты, помеченные как «заменить». В случае неудачи он возвращает ненулевой код выхода и обратную трассировку Ruby.

require '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!')

Вы можете встроить это в сценарий Bash следующим образом:

ruby << EOF
 ... script here ...
EOF

О других способах отправки электронных писем Ruby см. Вопрос о переполнении стека ] Как мне отправить почту из программы Ruby? .

Вы также можете использовать другие языки, которые поставляются с Mac OS X:

4
ответ дан 27 November 2019 в 06:24
поделиться

Вот модифицированный фрагмент сценария оболочки, который я использовал в различных системах UNIX ... (echo "$ {MESSAGE}" | $ {uuencode} $ {ATTACHMENT} $ basename $ {ATTACHMENT} ) | $ {mailx} -s "$ {SUBJECT}" "$ {TO_LIST}"

uuencode и mailx установлены на исполняемые файлы. Другие переменные взяты из пользовательского ввода, проанализированного с помощью getopts.

Это действительно работает, но я должен признать, что чаще всего я использую простую программу Java для отправки сообщений электронной почты с консоли.

0
ответ дан 27 November 2019 в 06:24
поделиться

sendmail и даже postfix может быть слишком большим для установки, если все, что вы хотите сделать, это отправить несколько писем из ваших скриптов.

Если у вас есть аккаунт Gmail, например, вы можете использовать серверы Google для отправки писем, используя SMTP. Если Вы не хотите использовать сервер gGoogle, до тех пор, пока у Вас есть доступ к какому-либо SMTP-серверу, он должен работать.

Очень легкая программа, которая делает это легким, это msmtp. У них есть примеры конфигурационных файлов в документации .

Самым простым способом сделать это было бы установить общесистемное значение по умолчанию:

account default
host smtp.gmail.com
from john.doe@gmail.com
user john.doe@gmail.com
password XXX
port 587

msmtp должно быть очень легко установить. На самом деле, для него есть порт , так что он может быть так же прост, как порт для установки 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.

.
3
ответ дан 27 November 2019 в 06:24
поделиться

sendEmail - это скрипт, который можно использовать для отправки электронной почты из командной строки, используя более сложные настройки, в том числе подключение к удаленному серверу smtp: http://caspian.dotconf.net/menu/Software/SendEmail/

На OSX его легко установить через макропорты: 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
6
ответ дан 27 November 2019 в 06:24
поделиться