Как можно прикрепить несколько вложений к e-mail? (Perl, php. bash любой скрипт из консоли. Без поднятия MTA)

Модератор: Модераторы разделов

Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Скрипты отправки на perl.
1. Скрипт.

Код: Выделить всё

#!/usr/bin/perl
use MIME::Base64;       #для кодирования авторизационных параметров, темы и тела письма
use IO::Socket;         #для общения с SMTP-сервером
use Text::Iconv;        #для перекодирования текста


my $mailbox = 'майл';  # ящик-отправитель
my $mailpwd = 'пароль';                # пароль
my $mailrcpt = 'кому';        # ящик-получатель

my $subj = ' тема ';
my $mail = ' тело сообщение ';
my $attachment = 'вложение';               # файл-вложение
my $attachpath = '/путь/';    # путь к нему

# поскольку данный скрипт я пишу в кодировке UTF-8,
# а письмо хочу отправлять в кодировке Windows, то мне просто необходим
# перекодировщик для кодирования из UTF-8(юникод) в CP1251(Windows)
my $cnv = Text::Iconv->new('UTF8','CP1251');
my $reply;      # код ответа сервера
my $message;    # текст ответа сервера
#открываем сокет к SMTP-серверу
my $socket = IO::Socket::INET->new('smtp.сервер:25');
defined $socket or die "ERROR: $!\n";
# читаем ответ
if(ReadReply() ne 220){print "Ошибка установки связи = $message\n"; $socket->close(); exit}
# здороваемся с сервером - не стал использовать ehlo,
# потому что расширенные возможности не требуются
$socket->print ("helo lo\n");
# получаем ответ и проверяем код
if(ReadReply() != 250){print "Ошибка приветствия сервера = $message\n"; $socket->close(); exit}
# теперь проводим авторизацию
$socket->print("AUTH LOGIN\n");
# получаем ответ
if(ReadReply() ne 334){print "Ошибка авторизации = $message\n"; $socket->close(); exit}
# кодируем логин-пароль
$socket->print(encode_base64($mailbox).encode_base64($mailpwd));
# после авторизации выдается две строчки
ReadReply();
if(ReadReply() ne 235){print "Ошибка авторизации = $message\n"; $socket->close(); exit}
# начинаем транзакцию - даем команду отправки письма
$socket->print('mail from: '."$mailbox\n");
if(ReadReply() ne 250){print "Ошибка в почтовом ящике отправителя = $message\n"; $socket->close(); exit}
# указываем получателя
$socket->print("rcpt to: $mailrcpt\n");
if(ReadReply() ne 250){print "Ошибка в почтовом ящике получателя = $message\n"; $socket->close(); exit}
# теперь начинаем формировать письмо
$socket->print("data\n");
if(ReadReply() ne 354){print "Ошибка при начале формирования письма = $message\n"; $socket->close(); exit}

# теперь сформируем тему письма, перекодировав ее из юникода в ср-1251
# и потом закодировав все это в base64.
# Таким образом, в теме письма можно нормально писать по русски
# Если вы используете другую кодировку в системе и/или при подготовке
# этого скрипта под свои нужды - скорректируйте создание конвертера в начале
# или вообще откажитесь от него

$subj = encode_base64($cnv->convert($subj));
$subj =~ s/\n//ig;      # уберем символы перевода строки
$subj =~ s/\r//ig;      # и возврата каретки, поскольку они все ломают :)
$subj = '=?Windows-1251?B?'.$subj.'?=';

# создадим тело письма
$msg = encode_base64($cnv->convert($mail));

# здесь формируем заголовок, минимальная версия
$body = "Mime-Version: 1.0\n";
$body .= "Content-Type: multipart/mixed; boundary=\"-\"\n\n";

# вставляем тело письма
$body .= "---\nContent-Type: text/plain;\n\tcharset=\"Windows-1251\"\nContent-Transfer-Encoding: base64\n\n$msg\n";

# и прицепляем файл-вложение
$body .= "---\nContent-Type: application/octet-stream; name=\"$attachment\"\n";
$body .= "Content-Transfer-Encoding: base64\n";
$body .= "Content-Disposition: inline; filename=\"$attachment\"\n\n";

# чтобы сформировать вложение, открываем файл
# в двоичном режиме, считываем его в память и кодируем в base64

$txt = '';
open f,"$attachpath$attachment";
binmode f;
while($str=<f>){$txt.=$str};
close f;
$body .= encode_base64($txt)."\n---\n";

# и наконец соберем письмо в одну переменную :)

$mailmessage = "From:$mailbox\nTo:$mailrcpt\nSubject:$subj\n$body\n.\n";

# скинем письмо серверу
$socket->print($mailmessage);
# и посмотрим что получилось
if(ReadReply() ne 250){print "Ошибка при отправке письма = $message\n"; $socket->close(); exit}

# если дошли до этого места, значит письмо ушло
$socket->close();
print "Письмо отправлено\n";

sub ReadReply{
        # процедура чтения ответа от сервера
        # цикл используется для того, чтобы прочитать многострочный ответ
        # например, при выдаче ответа на команду EHLO
        # формат строк
        # Трехзначное число-пробел или дефис-текстовое сообщение
        # причем, если ответ многострочный, то дефис используется во всех
        # строках, кроме последней, в которой используется пробел
        # именно по этому признаку и будет определятся конец цикла
        # и возвращаемый код будет браться также из последней строки
        $val = 1;
        while($val eq 1){
                $r = <$socket>;
                $val = $r =~ m/^\d{3}-/g;
        }
        ($reply,$message) = split(/ /,$r,2);
        return $reply;
}

2. Скрипт
смотрим тут
Пример запуска.

Код: Выделить всё

/usr/bin/sendEmail.pl -v -f ваш@ящик -t ваш@ящик -u "Проверка sendEmail" -m "Проверка sendEmail" -s smtp.gmail.com:587 -xu ваш@ящик -xp ваш_пароль -o tls=yes
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение watashiwa_daredeska »

iУведомление от модератора
Отрезано от Как отправить e-mail из консоли?
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение pcodr »

Почему бы не воспользоваться готовым решением?
Вот например, модуль Mail::Builder
remote system type is unix
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Не подходит, мне нужно авторизацию проходит на smtp сервере.
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение pcodr »

А при чем тут авторизация? Mail::Builder лишь формирует сообщение. А после авторизации пишите его в сокет.
remote system type is unix
Спасибо сказали:
pcodr
Сообщения: 283
ОС: Debian

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение pcodr »

Пример вдогонку

Код: Выделить всё

use Mail::Builder;

my $email = Mail::Builder->new();
$email->from('root@localhost.ru');
$email->to->add('root@gmail.com');
$email->subject('test message');
$email->plaintext("Testing Mail::Builder");

my $mblist = Mail::Builder::List->new('Mail::Builder::Attachment');
$mblist->add(Mail::Builder::Attachment::File->new('/tmp/file1'));
$mblist->add(Mail::Builder::Attachment::File->new('/tmp/file2'));
$email->attachment($mblist);

print $email->stringify;

remote system type is unix
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Честно, я просто не знаю перел ни как. Даже не знаю в какую сторону капать.
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Нашел как бы одну програмку ssmtp.

Но есть вопрос, как заставить ее отсылать почту без конфига? Прочитав man ssmtp
Нашел следующее:
-au - имя пользователя
-ap - пароль пользователя
-am - smtp сервер, через :465 порт
-F - смена поля FROM
-С - указать от кого, по умолчанию root

Но вот что не увидел как указать получателя, тему сообщения и само письмо?
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение deadhead »

Voler писал(а):
30.03.2010 19:06
Интересуют специалисты, по perl.
pcodr писал(а):
01.04.2010 18:04
Пример вдогонку
Voler писал(а):
01.04.2010 18:50
Честно, я просто не знаю перел ни как
Voler писал(а):
05.04.2010 09:51
Нашел как бы одну програмку

Вы уж определитесь, батенька, что же вам нужно ;-)
[x] close
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Я ищу способы, отправки сообщения. Можно сменить тему, посик лучшего средства отправки сообщения из bash.
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение deadhead »

Voler писал(а):
05.04.2010 11:23
средства отправки сообщения из bash
можно попробовать так, в частности: mail attachment on commandline (bash)
[x] close
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Описание очень скудное.
Спасибо сказали:
Аватара пользователя
deadhead
Сообщения: 1913
Статус: zzz..z

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение deadhead »

Voler писал(а):
05.04.2010 12:43
Описание очень скудное.

man uuencode
man mail
[x] close
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение diesel »

http://caspian.dotconf.net/menu/Software/SendEmail/ достаточно полезный скрипт, если надо посылать почту с авторизацией на другом smtp-сервере.
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Код: Выделить всё

root=
mailhub=smtp.gmail.com:465
Hostname=ваш@ящик
UseTLS=YES
AuthUser=ваш@ящик
AuthPass=пароль

Сохраняем в вашем домашнем каталоге.
Запуск ssmtp ваш@zobr -С ~/ssmtp.conf и пожалуйста письмо уйдет по назначению.

diesel писал(а):
05.04.2010 13:11
http://caspian.dotconf.net/menu/Software/SendEmail/ достаточно полезный скрипт, если надо посылать почту с авторизацией на другом smtp-сервере.

Это не для win? Случаем, а то exe смущает :unsure:
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение diesel »

да нет, там перловый скрипт в tar.gz: http://caspian.dotconf.net/menu/Software/S...il-v1.56.tar.gz
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

/usr/bin/sendEmail.pl -v -f ваш@ящик -t ваш@ящик -u "Проверка sendEmail" -m "Проверка sendEmail" -s smtp.gmail.com:465 -xu ваш@ящик -xp ваш_пароль -o tls=yes - Не пракатывает.

Вроде все по --help или --help misc сделал. :unsure:

/usr/bin/sendEmail.pl -v -f ваш@ящик -t ваш@ящик -u "Проверка sendEmail" -m "Проверка sendEmail" -s smtp.gmail.com:587 -xu ваш@ящик -xp ваш_пароль -o tls=yes

Вот так прокатывает, через смену порта с 465 на 587.
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение diesel »

Voler писал(а):
05.04.2010 15:26
Вот так прокатывает, через смену порта с 465 на 587.

да, только хотел посоветовать попробовать порт 587
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Лучше посоветуйте еще аналог ssmtp чтобы можно было использовать без поднятия relay, MTA на маршрутизаторе. А то нужно отправлять логи и бэкапы на почту. С этим я разобрался, но хочется полноты. А php скрипты есть?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение diesel »

Voler писал(а):
05.04.2010 15:51
А php скрипты есть?

php, кажется традиционно использует sendmail для отправки почты(в смысле /usr/bin/sendmail, неважно какой там MTA), есть ли аналоги перлового скрипта - не знаю, не искал.
Спасибо сказали:
Аватара пользователя
Voler
Сообщения: 498
ОС: Fedora

Re: Как можно прикрепить несколько вложений к e-mail?

Сообщение Voler »

Жаль. Буду искать, просто интересно. php из баш работает, а значит есть и скрипты с прохождением авторизацией.
Спасибо сказали: