Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Обойти ограничение на рассылку писем, ограничение: не более 100 писем в час 
:(
    Опции темы
dmipro
Дата 4.2.2011, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



Здравствуйте, 

у меня вырисовалась такая проблема. 

Я отправляю скриптом почту по мылам добровольных подписчиков сайта взятым из базы данных. Подписчиков уже около 400. Заблаговременно спрашивал у хостера, есть ли ограничения на отправку писем и, то ли они неправильно сказали, то ли я не понял, но когда пришло время сделать рассылку мне контрольного письма (приходящего последним) не пришло  smile Заподозрив неладное, еще раз спрашиваю у хостера и они отвечают:

"На тарифе "Сто Один" существует ограничение на отправку писем (100 писем в
час). Для того, чтобы избежать ограничения, можете использовать скрипт с
поддержкой smtp-авторизации."


Ну и кто они после этого?  smile 


Ладно, вот и хочу спросить, поскольку я не очень большой специалист, мне нужна помощь в коде SMTP-авторизации. Я отправляю письма сендмелом, и мне на форуме уже помогали справиться с кодировкой, еще раз огромное спасибо за это. 

Искал в нете и мне попадались только на php платные скрипты, я в пхп ваще как свинья в апельсинах. 

Вот мой код, помогите, пожалуйста, кто знает, с  SMTP-авторизацией, чтобы скрипт обошел ограничение в 100 писем и отправил письма всем подписавшимся на сайте, база постоянно пополняется новыми подписчиками:

в цикле,
$e_mai содержит очередное мыло из базы,
$mainbody - текст письма


Код

#письмо   
$to = $e_mai;
$from = '[email protected]';
$subject = 'Новости компании';

$message = MakeMessage($to, $from, $subject, $mainbody);

open (MAIL, "|/usr/sbin/sendmail -t -i") or die "Невозможно открыть sendmail: $!\n";

print MAIL $message;
close (MAIL) or warn "Sendmail не был нормально закрыт";

sub MakeMessage
{
    my ($to, $from, $subject, $mainbody) = @_;
my $message = <<"__EOM__";
From: $from
To: $to
Subject: $subject
Content-Type: text/plain; charset=windows-1251
$mainbody

__EOM__

    return $message;
}





Спасибо, еще раз.

PM MAIL   Вверх
ming
Дата 5.2.2011, 20:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: нет
Всего: 3



PM MAIL ICQ Jabber   Вверх
dmipro
Дата 7.2.2011, 13:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



спасибо, но там все в общем случае описано, мне бы готовый простой действующий пример с пояснениями.




PM MAIL   Вверх
shamber
Дата 7.2.2011, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



dmiproА так?
PM MAIL Jabber   Вверх
dmipro
Дата 7.2.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



Спасибо за ссылку. так умею.  smile 

Только нет результата. В гугле, перед тем как писать сюда на форум, нашел пример:

use Net::SMTP;
    $smtp = Net::SMTP->new('mail.hoster.ru'); # smtp сервер моего хоста, там где сайт
    $smtp->mail('[email protected]'); # тут писал мыло, от лица которого слалась почта
    $smtp->to('[email protected]'); # тут свое мыло, куда должна прийти почта
    $smtp->data();
    $smtp->datasend("To: [email protected]"); # тут опять свое мыло, не понимаю зачем 2 раза
    $smtp->datasend("n"); # типо тело письма
    $smtp->datasend("Hello ADMIN!!!!!! smilen"); # типо тело письма
    $smtp->dataend(); # типо тело письма
    $smtp->quit;

И вот что получилось:

1. Во-первых не работает, т.е. почту не получил.
2. Где тут и как указать правильно кодировку Win-1251?
3. Где и как указать тему сообщения. 
3. Читал, но не уверен что понял правильно, если слать с использованием SMTP, то первое неправильное имя адреса все остановит? Т.е. программа прекратит работу? Как тогда обработать неверный адрес, чтобы почта продолжала отправляться.

Поэтому прошу помощи.

PM MAIL   Вверх
ming
Дата 7.2.2011, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: нет
Всего: 3



Цитата

Во-первых не работает, т.е. почту не получил.

Net::SMTP->new(....);
добавьте туда (в new) Debug => 1, и смотрите в чём ошибка, что отвечает сервер.


А кодировка письма и тема указываются при помощи заголовков Content-Type и Subject соответственно.
например, 
Код

...
$smtp->datasend("To: [email protected]");
$smtp->datasend("Content-Type: text/plain; charset=UTF-8\n");  # MIME и кодировка
$smtp->datasend("Subject: Это не спам, а реальная возможность заработать! Прочтите!\n"); 
$smtp->datasend("\n");  # !!! обязательно нужно разделять заголовки и тело пустой строкой
# а дальше уже пошло тело письма
$smtp->datasend("Пожалуйста не удаляйте это письмо, а внимательно прочтите\n");  
...
$smtp->dataend();

Напоминаю, что тело письма идёт после списка заголовков, и должно быть отделено от них как минимум одной строкой "\n".

Это сообщение отредактировал(а) ming - 7.2.2011, 18:01
PM MAIL ICQ Jabber   Вверх
dmipro
Дата 7.2.2011, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



что-то не получается. Debug ничего не показал, скрипт отработал, но почта не пришла. Смотрел и в Спаме и т.п. Вот такой скрипт сейчас у меня:

Код

use Net::SMTP;
$smtp = Net::SMTP->new('mail.hoster.ru',
                           Debug   => 1,
                          );

    $smtp->mail('[email protected]'); # тут писал мыло, от лица которого слалась почта
    $smtp->to('[email protected]');
    $smtp->data();
    $smtp->datasend("To: [email protected]"); # тут опять свое мыло, не понимаю зачем 2 раза
    $smtp->datasend("Content-Type: text/plain; charset=windows-1251\n");  # MIME и кодировка
    $smtp->datasend("Subject: Новости компании test message\n"); 
    $smtp->datasend("\n");  
    $smtp->datasend("Тестовое письмо. Test Message\n");  
    $smtp->dataend();
    $smtp->quit;




Может у хостера модуль этот отключен? чегоб он тогда меня отправлял на SMTP... Может smtp сервер не такой, но я так указываю в бате при настройке ящика: mail.hoster.ru. 

Я уже подумываю модернизировать мой первый скрипт и указать слать почту порциями, по n штук через m минут....



PM MAIL   Вверх
ming
Дата 7.2.2011, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 97
Регистрация: 30.1.2009
Где: Новосибирск

Репутация: нет
Всего: 3



да, кстати, я не вижу в вашем коде этапа авторизации на smtp-сервере.

что-то вроде:
Код

$smtp->auth( 'sender_email', 'sender_password' );

PM MAIL ICQ Jabber   Вверх
dmipro
Дата 8.2.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



Лед тронулся. Письмо отправилось. ОГРОМНОЕ СПАСИБО ming. Появились дополнительные вопросы.

1. Письмо попало в папку Спам, я посылал на свой ящик на gmail, и письмо пришло помеченное "Неизвестный отправитель". Может поэтому и в спам попало. Соответственно вопрос, какой директивой указывать обратный адрес?

2. Что будет, если какой-то адрес неправильный в списке рассылки, отправка не прекратиться? Я сейчас попробую отправить один несуществующий адрес и следом существующий, отпишу что получилось.

3. Почему хостер говорит что почта отправляемая через smtp-авторизацию не имеет ограничений на количество писем, а сендмейло - имеет? простите, прошу ликбез (на пальцах объяснить). Я просто хочу быть уверенным, что моя рассылка отработает и все 400 писем, которые сейчас в базе будут отправлены, а если среди них есть проблемные адреса, чтобы они не остановили рассылку, а пришло бы сообщение о проблеме. Может ли это сообщение прийти ко мне на ящик от лица которого я шлю почту скриптом (см. пункт 1)? 

В общем много вопросов, прошу за это прощение.

Вот код, который сейчас.
Код

$smtp = Net::SMTP->new('mail.hoster.ru',
                           Debug   => 1,
                          );
    $smtp->auth('мой_ящик_у_хостера@mail.com', 'пароль_ящика');
    $smtp->mail('мой_ящик_у_хостера@mail.com'); # тут писал мыло, от лица которого слалась почта
    $smtp->to('[email protected]');
    $smtp->data();
    $smtp->datasend("To: [email protected]"); # тут опять свое мыло, не понимаю зачем 2 раза
    $smtp->datasend("Content-Type: text/plain; charset=windows-1251\n");  # MIME и кодировка
    $smtp->datasend("Subject: Новости компании test message\n"); 
    $smtp->datasend("\n");  
    $smtp->datasend("Тестовое письмо. Test Message\n");  
    $smtp->dataend();
    $smtp->quit;



.......

Отправил 2 письма в цикле, одно с несуществующим адресом и одно с правильным. Вначале неправильное письмо. То что произошло, меня радует, не дошедшее письмо вернулось мне в ящик, от лица которого я слал почту в скрипте, а второе письмо успешно дошло до назначения. 

Осталось только ответить на вопросы 1 (где указать обратный адрес, чтобы у получателя он отобразился) и вопрос отправки всех 400 писем без ограничений за 1 раз. Надо будет попробовать, тогда буду знать. 



Это сообщение отредактировал(а) dmipro - 8.2.2011, 18:07
PM MAIL   Вверх
dmipro
Дата 9.2.2011, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



подскажите, какая директива отвечает за обратный адрес, пожалуйста.
PM MAIL   Вверх
shamber
Дата 10.2.2011, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



Письмо у вас в спам попадает, по другой причине. Я проверил ваш скрипт на своей gmail почте, все нормально доходит.

Это сообщение отредактировал(а) shamber - 10.2.2011, 12:39
PM MAIL Jabber   Вверх
shamber
Дата 10.2.2011, 12:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1422
Регистрация: 5.9.2006
Где: Россия

Репутация: нет
Всего: 18



dmipro
посмотрите пример SMTP сессии, поймете зачем адрес два раза указываете
Код

250 BBN-UNIX.ARPA
MAIL FROM: [email protected]
250 OK
RCPT TO: [email protected]
250 OK
DATA
354 Start mail input; end with <CRLF>.<CRLF>
To: [email protected]
From: [email protected]
Subject: Test

Hi!
This is a test message.


Это сообщение отредактировал(а) shamber - 10.2.2011, 12:43
PM MAIL Jabber   Вверх
dmipro
Дата 19.2.2011, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



Все понятно, shamber, большое спасибо за пояснения!, но мне на джимейл приходит письмо помеченное как "Неизвестный отправитель" там где должно быть указан адрес отправителя. Почему?

Не могли бы Вы выложить полностью законченный свой код примера, который у вас получился правильно с джимейлом, там где есть обратный адрес при получении письма. Или это только с моего хостинга не показывается обратный адрес?


PM MAIL   Вверх
vivu
Дата 19.2.2011, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 42
Регистрация: 3.11.2009

Репутация: нет
Всего: нет



Код

#!/usr/bin/perl

use strict;
use Net::SMTP::TLS;

my $mailer = Net::SMTP::TLS->new(
  'smtp.gmail.com',
  Port=>587,
  User => 'имя_ящика@gmail.com',    # почтовый аккаунт, через который будет идти почта
  Password => 'пароль_от_ящика',    # пароль от аккаунта
  Debug => 1,
);

$mailer->mail('имя_ящика@gmail.com');
$mailer->to('адрес_получателя');

$mailer->data();
$mailer->datasend('From: имя_ящика@gmail.com\n');
$mailer->datasend('To: адрес_получателя\n');
$mailer->datasend('Subject: test\n');
$mailer->datasend('\n');
$mailer->datasend('A simple test! num 2\n');
$mailer->dataend;

$mailer->quit;


Тоже решил поделится своим рабочим кодом.
PM MAIL   Вверх
dmipro
Дата 19.2.2011, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 29
Регистрация: 5.1.2011

Репутация: нет
Всего: нет



Прикольно. поскольку у моего хостера модуль TLS не установлен, доработал свой пример, код vivu помог с обратным адресом. Вот мой рабочий код:
Код

#!/usr/bin/perl -w
use Net::SMTP;
$smtp = Net::SMTP->new('mail.hoster.ru',
                           Debug   => 1,
                          );
    $smtp->auth('от_кого@мыло','пароль');
    $smtp->mail('от_кого@мыло'); # тут писал мыло, от лица которого слалась почта
    $smtp->to('кому@мыло');
    $smtp->data();
    $smtp->datasend("From: от_кого\@мыло\n");
    $smtp->datasend("To: кому\@мыло\n"); # тут опять свое мыло
    $smtp->datasend("Content-Type: text/plain; charset=windows-1251\n");  # MIME и кодировка
    $smtp->datasend("Subject: Новости компании test message\n"); 
    $smtp->datasend("\n");  
    $smtp->datasend("Тестовое письмо. Test Message\n");  
    $smtp->dataend();
    $smtp->quit;



Но проблема спама осталась. Письмо залетело в ящик спама на ждимейл, хотя уже с обратным адресом. Я задал для этого отправителя что это "НЕ СПАМ" на джимейле и теперь почта от скрипта попадает во Входящие. Фигово, т.к. я пользуюсь the bat и ящик спама на джимейле он никак не видит.

Послал почту на несколько ящиков хостера, везде дошло, и на ящик одного моего домена, туда не дошло, надо зайти в спам этого ящика, посмотреть..

Кто может знает как решить проблему со спамом. Предполагаю, что решение возможно... smile 

------------------------------------------------------------------------------------------------------------

Задал вопрос хостеру, почему попадают письма в спам и вот их ответ:

Здравствуйте.
Нет, способа обхода спам-фильтра Gmail не существует.

> Неужели нет директивы в Net::SMTP или еще как-то, чтобы указать в
> письме, что это надежный хостинг отправляет почту?
>
> Возможно ли как-то прописаться в белом листе джимейла и других
> почтовых служб?

К сожалению, такой директивы не существует и не может существовать, поскольку
все спамеры бы ею пользовались. Сомнительно также, что бы компания Google стала
раскрывать детали, по которым она помечает письма как спам. Как минимум мне
такие подробности неизвестны.

> Спасибо.
> А почему сендмелом не попадает?
> А почему с почтового клиента не попадает?

На данные вопросы смогут ответить только специалисты Google.




Это сообщение отредактировал(а) dmipro - 20.2.2011, 09:02
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.1845 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.