首页 > 解决方案 > 使用 Perl 发送带有进度条的邮件

问题描述

我的发送邮件脚本有问题。大多数问题都与进度条有关。我希望当我单击提交时进度条开始移动并在发送完成后结束。

好吧,我尝试过类似的例子CGI::ProgressBar但我不能让它工作。

#!/usr/bin/perl -w

use CGI::Carp qw(fatalsToBrowser warningsToBrowser);
use CGI;
use MIME::Lite;
use CGI::ProgressBar qw/:standard/;

$| = 1; # Do not buffer output

my $CGI = CGI->new();

my $from_email = $CGI->param("from_email");
my $from_name = $CGI->param("from_name");
my $subject = $CGI->param("subject");
my $receipts = $CGI->param("receipts");
my $message  = $CGI->param("message");

# Newline format. send message to each email listed
my $output = join "\n", split " ", $receipts;  

if ($from_email, $from_name, $subject, $receipts, $message) {
my $msg = MIME::Lite->new(
        # From Name: John Deo And Sent From Email: johndeo@mail.com
        From     => "$from_name <$from_email>",
        To       => $output,
        Subject  => $subject,
        Data     => $message

);
# Support HTML Message
$msg->attr("content-type" => "text/html");  
$msg->send;

if ($msg) {   # if mail starts sending
print progress_bar( -from=>1, -to=>100 );
for (1..100){
        print update_progress_bar;
        # Print ProgressBar
        $progressbar_html = qq{<div class="box">
    <div id="progressbar">
        <div></div>
    </div>
    <div class="text">Sending... 1%</div>
</div>
};
        sleep 1;

}
print $response = "Message Sent Successfully";
exit;
}

if(!$msg) {
print $response = "Message Failed To Send";
}
}

print "Content-type: text/html\n\n";
print <<START_HTML;

<!DOCTYPE html>
<html>
<head>
<title>Simple Mailer</title>
<style type="text/css">
.box {
    border-radius: 10px;
    padding: 25px;
    background-color: rgba(51, 51, 51, 0.96);
    text-align: center;
}
#progressbar {
    border: 3px solid #fff;
    border-radius: 20px;
    padding: 2px;
}
#progressbar > div {
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    background-color: #fff;
    width: 1%;
    height: 18px;
    border: 1px solid rgba(0, 0, 0, 0);
    border-radius: 20px;
}
.text {
    color: #fff;
    margin-top: 15px;
    font-size: 21px;
    font-weight: bold;
}
</style>
</head>

<body>
<form method="post">
<label>From Email
<input type="text" name="from_email" />
<br />
<br />
From Name
<input type="text" name="from_name" />
</label>
<p>
  <label>Subject
  <input type="text" name="subject" />
  </label>
</p>
<p>
  <label>Receipts
  <textarea name="receipts"></textarea>
  </label>
</p>
<p>
  <label>message
  <textarea name="message"></textarea>
  </label>
</p>
<p>
  <label>Send
  <input type="submit" value="Submit" />
  </label>
</p>
</form>
<p>&nbsp;</p>

$progressbar_html
<p>$response</p>
</body>
</html>

START_HTML

标签: cssperl

解决方案


首先,我不建议使用看起来像是在八年前被遗弃的模块。

其次,我真的不确定你认为这将如何运作。在伪代码中,您的程序如下所示:

  • 设置 CGI 对象
  • 提取邮件参数
  • 创建邮件
  • 发邮件
  • 显示一个每秒更新一百秒的进度条

主要问题是,上面写着的那一行$msg->send是邮件的发送地点。一旦执行了该行,邮件就消失了。在您显示的进度完成后,创建和更新进度条是没有意义的。

你需要做更多这样的事情:

  • 设置 CGI 对象
  • 提取邮件参数
  • 创建邮件
  • 设置和显示进度条
  • 发送邮件(包括定期回调更新进度条)

当然,棘手的是最后一部分。我已经好几年没看过 MIME::Lite 了(这些天它基本上已经被弃用了)但是浏览了文档,我看不出有任何方法可以从邮件发送代码中进行异步回调。

一种方法是为收件人列表中的每个人创建一封电子邮件。这样,您可以一次发送一个,并在发送每个后更新进度条。但这并不是向多人发送电子邮件的特别有效的方式。


推荐阅读