Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Операционные системы » UNIX » отправка письма через telnet

Модерирует : ShriEkeR

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Serhi84

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите, пожалуйста, решение данной проблемы.
Необходимо с помощью telnet отправить письмо с прикрепленным к нему файлом (текстовый лог).
Сначала пробую просто отправить письмо - все прекрасно срабатывает. (и в telnet`e ручками вводил команды, и скрипт на bash`e).
Скрипт:
 
(
sleep 1
echo HELO my_server
sleep 1
echo mail from: my_mail_1
sleep 1
echo rcpt to: my_mail_2
sleep 1
echo DATA
sleep 1
echo subject: Letter
sleep 1
echo ""
sleep 1
echo Hello
echo ""
sleep 1
echo "."
echo QUIT
) | telnet my_IP 25
 
А вот со вложением файла бьюсь уже несколько дней. Перечитал rfc, статьи в инете, касающиеся этой темы, все-равно не получается.
 
Отправляю письмо скриптом из UNix, нашел для кодировки (вложения) только файлики uuencode/uudecode.
Также нашел пример (+ еще один пример, но там идет передача данных sendmail`у), но здесь идет передача данных функции mail(что меня не устраивает):
 
uuencode $ATTFILE $ATTFILE | mail -s "$SUBJECT" $MAILTO  
или  
(uuencode $FILE1 $FILE1; uuencode $FILE2 $FILE2) | mail -s "$SUBJECT" $MAILTO  
 
Меня же интересует отправка с аттачем именно с помощью команд. (хотя бы описание какие команды нужно вводить для аттача файла, когда telnet`ом коннекчусь к серваку, а там уж скрипт сам наваяю).  
Если ввожу после команды DATA строки, к примеру:
 
Mime-Version: 1.0
Content-Type: application/x-msdownload;name="myfile.exe"
Content-Transfer-Encoding: base64
Content-Disposition: attachment;filename="myfile.exe"
 
то они просто пишутся в тело письма, если до DATA - просто не воспринимаются.

Всего записей: 45 | Зарегистр. 31-01-2008 | Отправлено: 10:52 04-08-2008
iltmpz

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
если до DATA - просто не воспринимаются

надо именно до data
Не знаю, никогда не пробовал отправлять почту именно через telnet, но по-моему вложения делались как-то не так. Мой скрипт на php, по аналогии должно быть понятно:

Код:
    $un        = strtoupper(uniqid(time()));
    $head      = "From: $from\n";
//    $head     .= "To: $to\n";
    $head     .= "Subject: $subj\n";
    $head     .= "X-Mailer: PHPMail Tool\n";
    $head     .= "Reply-To: $from\n";
    $head     .= "Mime-Version: 1.0\n";
    $head     .= "Content-Type:multipart/mixed;";
    $head     .= "boundary=\"----------".$un."\"\n\n";
    $zag       = "------------".$un."\nContent-Type:text/html;\n";
    $zag      .= "Content-Transfer-Encoding: 8bit\n\n$text\n\n";
    $zag      .= "------------".$un."\n";
    $zag      .= "Content-Type: application/octet-stream;";
    $zag      .= "name=\"".$nametoshow."\"\n";
    $zag      .= "Content-Transfer-Encoding:base64\n";
    $zag      .= "Content-Disposition:attachment;";
    $zag      .= "filename=\"".$nametoshow."\"\n\n";
    $zag      .= chunk_split(base64_encode($filebody))."\n";
    $zag.= "------------".$un."--\n";
 
 

Всего записей: 281 | Зарегистр. 05-04-2006 | Отправлено: 13:19 04-08-2008
Serhi84

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
спасибо, структура понятна - собираем письмо из различных частей - тела и аттачмента, затем отправляем. Но к сожалению, в php не силен, реализовать нужно на bash`e, но не получается((

Всего записей: 45 | Зарегистр. 31-01-2008 | Отправлено: 14:52 04-08-2008
iltmpz

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Serhi84
что не получается? как я понимаю, так же: echo "строка" ; sleep 1
Так же писать в телнет эти строки, подставляя переменные по смыслу.
 
$un - это просто длинная бессмысленная строка,
$nametoshow - имя файла,
$filebody - тело файла, хотя как сделать на баше chunk_split(base64_encode($filebody) - не знаю, надо разбираться.
 
остальное должно быть понятно

Всего записей: 281 | Зарегистр. 05-04-2006 | Отправлено: 17:15 04-08-2008
Drron

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
А сендмайлом пользоваться религия запрещает?
 
Примерно так:
 
#!/bin/sh
 
 
PATH=/bin:/usr/bin:/usr/local/bin:/sbin:/usr/sbin:/usr/local/sbin
 
ADMIN="admin@myfirma.ru"
 
CODE="$1"
SENDER="$2"
shift 2
LOG="/var/log/server.log"
TMP=/tmp
 
TMPMAIL=$TMP/new_mail.$$
trap "rm -f $TMPMAIL; exit" 0 1 2 15
 
BOUNDARY="newlog-`date +%s`-$$"
 
# Create mail header:
echo "To: $ADMIN" > $TMPMAIL
echo "Subject: Log from SERVER " >> $TMPMAIL
echo "Mime-Version: 1.0" >> $TMPMAIL
echo "Content-Type: multipart/mixed; boundary=$BOUNDARY" >> $TMPMAIL
 
# Create first part of the mail
echo "--$BOUNDARY" >> $TMPMAIL
echo "Content-Type: text/plain; charset=koi8-r" >> $TMPMAIL
echo "" >> $TMPMAIL
echo "LOG от SERVER был получен в" >> $TMPMAIL
echo "`date`." >> $TMPMAIL
echo "" >> $TMPMAIL
 
echo "--$BOUNDARY" >> $TMPMAIL
echo "Content-Type: text/plain" >> $TMPMAIL
echo "Content-Transfer-Encoding: base64" >> $TMPMAIL
echo "Content-Disposition: attachment; filename=\"log.txt\"" >> $TMPMAIL
echo "" >> $TMPMAIL
 
cat $LOG | base64 -e >> $TMPMAIL
echo "" >> $TMPMAIL
 
echo "--$BOUNDARY--" >> $TMPMAIL
 
# Send out the created mail:
sendmail -i -f $SENDER -- $ADMIN -- < $TMPMAIL
 
exit 0
 
 
Добавлено:
Или через перл:
 
#!/usr/bin/perl
 
use Net::SMTP;
use Time::localtime;
use MIME::Base64 ();
 
 $gm = localtime();
 $year = ($gm->year()) + 1900;
 $mounth = ($gm->mon()) + 1;
 $mday = $gm->mday();
 $mday=sprintf("%02d",$mday);
 $mounth=sprintf("%02d",$mounth);
 $date = "$mday:$mounth:$year";
 $hour = $gm->hour();
 $min = $gm->min();
 $sec = $gm->sec();
 $hour=sprintf("%02d",$hour);
 $min=sprintf("%02d",$min);
 $sec=sprintf("%02d",$sec);
 $time = "$hour\:$min\:$sec";
 
my $file="/tmp/000.txt";
my $smtphost="192.168.1.1";
my $ehlo="Mailhost";
my $mail_from='root@myfirma.ru';
my $rcpt_to='admin@myfirma.ru';
 
my $boundary="logfile-$time\\$date";
my @mail;
 
open (LOG,$file) || die "can't open :$!";
my $file=<LOG>;
close(LOG);
 
$encoded = MIME::Base64::encode($file);
 
 
@mail=("To: $rcpt_to\n",
"Subject: LOG from my server\n",
"Mime-Version: 1.0\n",
"Content-Type: multipart/mixed; boundary=$boundary\n",
"\n",
"--$boundary\n",
"Content-Type: text/plain; charset=koi8-r\n",
"\n",
"Log on $date in attachment.\n",
"\n",
"--$boundary\n",
"Content-Type: text/plain\n",
"Content-Transfer-Encoding: base64\n",
"Content-Disposition: attachment; filename=\"file.txt\"\n",
"\n",
"$encoded",
"\n",
"--$boundary--");
 
    my  $smtp = Net::SMTP->new($smtphost);
            $smtp->hello($ehlo);
            $smtp->mail($mail_from);
            $smtp->to($rcpt_to);
            $smtp->data();
                foreach(@mail){
                    if (/^to\:/i){$_='To:'.'<' . $rcpt_to . '>' . "\n";};
                        $smtp->datasend($_);
                        };
                    $smtp->dataend();
                    $smtp->quit;
exit 0;

Всего записей: 826 | Зарегистр. 20-11-2003 | Отправлено: 10:36 06-08-2008
Serhi84

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Пробую скрипт на перле заюзать, файл аттачится, но он почему то пустой или содержит просто управляющий символ (когда меняю файлы иногда появляется первая строка). В чем может быть проблема?

Всего записей: 45 | Зарегистр. 31-01-2008 | Отправлено: 09:56 21-10-2008
ptaha



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Вот пример скрипта на перле для отправки архива файла. SMTP удаленный с авторизацией. Скрипту подсовывается обычный файл - он его оборачивает в зип и кладет аттачем Скрипт дубовый, но для примера сойдет.
 

Код:
 
#!/usr/bin/perl -w
 
use strict;
use Net::SMTP_auth;
use MIME::Entity;
use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
use IO::Scalar;
use File::Basename;
 
my($smtp_server)='mail.mydomain';
my($smtp_login)='user@mydomain';
my($smtp_pwd)='pwd';
my($smtp_auth)='CRAM-MD5';
 
my($from)='user@mydomain';
my($reaplyto)='user@mydomain';
my($to)='somehow@mydomain';
 
sub sendFile {
my $file = shift;
my $subj = shift;
my $body = shift;
 
die "No file defined!" if (! defined($file));
 
my $zipContents = '';
my $SH = IO::Scalar->new(\$zipContents);
 
my $zip = Archive::Zip->new();
# Add a file from disk
my $file_member = $zip->addFile( $file ) || die "ZIP adding file error!";
$file_member->desiredCompressionMethod( COMPRESSION_DEFLATED );
$file_member->desiredCompressionLevel( 9 );
# Save the Zip to handle
unless ( $zip->writeToFileHandle( $SH ) == AZ_OK ) {
    die "ZIP error";
}
# Save the Zip file
#unless ( $zip->writeToFileNamed('someZip.zip') == AZ_OK ) {
#    die 'ZIP archive write error';
#}
 
my($data) = MIME::Entity->build(
               Type => "multipart/mixed",
               From => $from,
               To => $to,
               Subject => $subj,
               'Reply-To' => $reaplyto,
               'Type' => "text/plain; charset=utf8",
               'Content-Transfer-Encoding' => "8bit",
               Data => $body);
$data->attach(
#              Path        => $file,
               Data        => $zipContents,
               Filename    => "$file.zip",
               Disposition => 'attachment;',
               Description => "ZIP file",
               Type        => "application/octet-stream",
               Encoding    => "base64");
 
my($smtp) = Net::SMTP_auth->new($smtp_server,
#                               Debug   => 1
                            );
$smtp->auth($smtp_auth, $smtp_login, $smtp_pwd) || die "SMTP Auth failed!";
 
$smtp->mail($from);
$smtp->to($to);
 
$smtp->data() || die "SMTP Data failed!";
$smtp->datasend($data->as_string) || die "SMTP Datasend failed!";
$smtp->dataend() || die "SNMP Dataend failed!";
 
$smtp->quit || print "SNMP quit returns error!";
return 0;
}
 
my $f = $ARGV[0];
 
die "No filename!" if (! defined $f);
my $file = fileparse($f);
 
sendFile($f,"Some attach for U $file","This message contains some archive file: $file");
 
 

Всего записей: 134 | Зарегистр. 16-01-2004 | Отправлено: 22:38 25-10-2008
vlader2004



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
> Необходимо с помощью telnet отправить письмо с прикрепленным к нему файлом (текстовый лог).
 
Скажи, что мешает отправлять текстовую информацию в теле письма? Зачем тебе MIME? Ты пытаешься действовать по логике людей, которые присылают в аттаче DOC-файл с текстом сообщения вместо самого сообщения

Всего записей: 460 | Зарегистр. 31-05-2004 | Отправлено: 00:58 26-10-2008
Drron

Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вот рабочий кусок кода
 
my($data) = MIME::Entity->build(
    From => $from,
    To => $to,
    Subject => $subj,
    Data => $body);
    $data->attach(
    Data        => $zipContents,
    Filename    => "$file.zip",
    Disposition => 'attachment;',
    Description => "ZIP file",
    Type        => "application/octet-stream",
    Encoding    => "base64");
 
 
 
 

Всего записей: 826 | Зарегистр. 20-11-2003 | Отправлено: 11:29 27-10-2008
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Операционные системы » UNIX » отправка письма через telnet


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru