Передача результата SQL-запроса в качестве параметра для отправки электронной почты с использованием Perl - PullRequest
0 голосов
/ 03 февраля 2012

Я хочу получить адрес электронной почты из таблицы и использовать его для отправки электронной почты с использованием сценария perl.

Как использовать результат запроса по почте. Я новичок в сценариях Perl, пожалуйста, помогите.

Я обновил как предложено, но все еще есть некоторые проблемы. Пожалуйста, скажите мне, где я иду не так.

Заранее спасибо.

#!/usr/bin/perl
# $Id: outofstockmail.pl,v 1.0 2012/03/01 21:35:24 isha Exp $

require '/usr/home/fnmugly/main.cfg';

use DBI;
my $dbh = DBI->connect($CFG{'mysql_dsn'},$CFG{'mysql_user'},
                       $CFG{'mysql_password'})
    or &PrintError("Could not connect to the MySQL Database.\nFile could not be made!\n");
$dbh->{RaiseError} = 1;        # save having to check each method call

print "<H1>Hello World</H1>\n";

$sql = "Select OS.name, OS.customer_email, OS.product, OS.salesperson,  
               OS.salesperson_email
        from   products AS P
        LEFT JOIN outofstock_sku AS OS ON OS.product = P.sku
        LEFT JOIN tech4less.inventory AS I ON (I.sku = P.sku AND I.status = 'A')
        WHERE mail_sent='0'
        GROUP BY OS.product";

#$sth = $dbh->do($sql);

my $sth1 = $dbh->prepare($sql);

$sth1->execute; 

while ( my @row = $sth1->fetchrow_array ) {   

    # email
    open MAIL, "| $mail_prog -t" || die "Could not connect to sendmail.";
    print MAIL "To: $row[1]"; 
    print MAIL "From: $row[4]";
    print MAIL "Reply-To:$row[4]";
    print MAIL "CC: $row[4]";  
    print MAIL "Subject: Product requested is back in inventory\n";
    print MAIL "\n";
    print MAIL "Hi $row[0] , The product $row[2] is available in the stock.\n";
    print MAIL "\n";
    close MAIL;

    $sql = "Update outofstock_sku SET mail_sent='0' WHERE mail_sent='1'";
    $sth2 = $dbh->do($sql);
}               

$sth = $dbh->do($sql);

$dbh->disconnect();

exit;

Ответы [ 3 ]

2 голосов
/ 03 февраля 2012

В этом скрипте слишком много проблем, чтобы конкретно ответить на вопрос:

1) Использовать use strict; use warnings;.Это поможет вам быть более точным.

2) DBI->connect() принимает параметры в качестве последнего аргумента, поэтому вы можете установить RaiseError там:

my $dbh = DBI->connect($dsn, $user, $pwd, { RaiseError => 1 });

3) $dbh->do невернуть объект.Вам необходимо подготовить и выполнить:

my $sth = $dbh->prepare($sql);
$sth->execute;
while ( my @row = $sth->fetchrow_array ) {
    ...
    print MAIL "Hi $row[0]. We're happy to ... $row[1]...\n";
    ...
}

4) Для отправки почты используйте модуль, например Email :: Sender :: Simple .

0 голосов
/ 07 февраля 2012
#!/usr/bin/perl 
require '/main.cfg';

# use DBI interface for MySQL
            use DBI;

            # connect to MySQL

            $dbh = DBI->connect($CFG{'mysql_dsn'},$CFG{'mysql_user'},$CFG{'mysql_password'}) or
                    &PrintError("Could not connect to the MySQL Database.\nFile could not be made!\n");
            $dbh->{RaiseError} = 1;        # save having to check each method call

            $mailprog = $CFG{'mail_prog'};

            $sql = "Select OS.name,OS.customer_email,OS.product,OS.salesperson_email from products AS P LEFT JOIN outofstock_sku AS OS ON OS.product = P.sku LEFT JOIN inventory AS I ON (I.sku = P.sku AND I.status = 'A') WHERE mail_sent='0' GROUP BY OS.product";

            $sth = $dbh->prepare($sql);

            $sth->execute();
                while($ref = $sth->fetchrow_hashref()) 
                        {

                            open MAIL, "| $mailprog -f sssss\@gmail.com -t" || die "Could not connect to sendmail.";
                            print "Content-Type: text/html\n\n";
                            print MAIL "To: $ref->{'customer_email'}\n";
                            print MAIL "From: \"\" <wwwwwwwwww\n>";
                            #   print MAIL "From: \"\" <$ref->{'salesperson_email'}\n>";
                            print MAIL "Reply-To: ";
                            #   print MAIL "CC: $ref->{'salesperson_email'}\n";
                            print MAIL "Subject:#$ref->{'product'}\n";
                            print MAIL "Hi $ref->{'name'},\nThe product $ref->{'product'} is available in the stock.\n";
                            close MAIL;

                                                        }


            $sth->finish();

            # Close MySQL connection
            $dbh->disconnect();
            exit;
0 голосов
/ 03 февраля 2012

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

Вы на самом деле не говорите, что ваш вопрос. Просто сказать, что у кода есть «некоторые проблемы», на самом деле не поможет нам помочь вам.

Некоторые предложения ...

  1. Используйте strict и warnings

  2. Передача RaiseError в качестве аргумента для вызова connect

  3. Распечатайте содержимое @row, чтобы вы могли быть уверены, что SQL правильный

  4. Используйте Email :: Simple , чтобы создать свою электронную почту, и Email :: Sender , чтобы отправить ее

  5. (Гораздо менее важно) Рассмотрите возможность использования DBIx :: Class для связи с базой данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...