我是在Perl中使用模块的新手。我现在正在爆炸,我想知道这里有什么问题:
#!/usr/bin/perl
use strict;
use Mail::Mailer;
my $from_adress = "email\@xxxxx.com";
my $to_adress = "email\@hxxxx.com";
my $subject = "There goes bananas\n";
my $body = "Here is the bananas";
my $server = "smtp.gmail.com";
my $mailer = Mail::Mailer->new("smtp", Server => $server);
$mailer->open({
From => $from_adress,
To => $to_adress,
Subject => $subject,
});
print $mailer $body;
$mailer->close();
open(F, '>>', $Mail::Mailer::testfile::config{outfile});
print F @_;
print @_;
close (F);
很抱歉发布整个脚本,但我不确定它出错的地方。我从@_变量中得不到任何打印件。我很乐意接受有关如何改进在Perl中使用模块以及如何在其中获得更好的建议。 提前谢谢。
答案 0 :(得分:1)
在您的代码中使用strict
做得好。如需额外赠送金额,也可以添加use warnings
行。
我看不出你使用模块的方式有任何明显的问题。你觉得有什么不对吗?电子邮件没有发送?
如果您没有收到该电子邮件,那么我建议您的第一步应该是遵循文档中的示例并将close
行更改为:
$mailer->close
or die "couldn't send whole message: $!\n";
我想知道问题(如果有的话)是你使用谷歌的SMTP服务器,而你没有权限这样做。也许您需要先进行身份验证。
关于您的代码的其他几点。
不需要使用双引号字符串初始化所有设置变量。如果切换到单引号字符串,则不再需要转义数据中的@
。您需要使用双引号将换行符放在$subject
中,但我已将其删除,因为电子邮件主题行很少包含换行符。
my $from_adress = 'email@xxxxx.com';
my $to_adress = 'email@hxxxx.com';
my $subject = 'There goes bananas';
my $body = 'Here is the bananas';
my $server = 'smtp.gmail.com';
您的代码的最后四行在很多方面令人困惑。我不确定你想要在那里实现什么。我会指出两件事。首先,我们现在通常使用词法文件句柄。如果您从使用裸字文件句柄的来源学习,那么我会稍微担心它的年龄。因此文件开头行应如下所示:
# $f is, of course, a terrible name for a variable
open(my $f, '>>', $Mail::Mailer::testfile::config{outfile});
然后打印@_
的值。在Perl中,@_
包含子例程的参数。并且此代码不在子例程中,因此@_
将为空。所以我并不感到惊讶,你没有得到任何输出。
最后,我要指出,当我使用Email :: *命名空间中的工具时,我发现我喜欢在Perl中使用电子邮件。特别是,我使用Email::Sender发送电子邮件。
更新:好的,我已经仔细查看了Mail::Mailer文档,我想我明白你在最后四行中要做的是什么。我想你正在尝试将邮件消息数据写入文件。是吗?
如果是,那么你就误解了文档。这样做的方法是将您传递的类型更改为new()
。它必须是testfile
而不是smtp
。所以改变
my $mailer = Mail::Mailer->new("smtp", Server => $server);
到
my $mailer = Mail::Mailer->new("testfile",);
这会将邮件写入名为mailer.testfile
的文件中,并且不会发送任何邮件。