首页 > 解决方案 > Email::Sender 如何在 Perl 中附加文件?

问题描述

系统:Ubuntu 18.04 LTS 上的 Perl 5.26.1。在名为 util2.pl 的文件中有一个用于发送电子邮件的子例程。该子例程称为 mailadming() 并具有一堆参数,例如 SMTP 服务器信息、往返地址等。 util2.pl 被require放入主程序中。

我在各种网站和 Google 上搜索了大约 2 个小时,并阅读了有关 Email::Sender 的手册,但在使用 Email::Sender 时我似乎找不到如何附加文件。我正在升级一台机器,并且正在使用 Mail::Sender,但 Mail::Sender 对于 Email::Sender 已弃用,并且 Email::Sender 上的文档很少。

我在 Email::Sender docs 中根本找不到有关文件附件的任何信息。

由于 Mail::Sender 不再更新,继续使用它是个坏主意。我们在 Perl 上投入了大量资金,所以目前我们无法更改工具。

  1. 谁能帮帮我?
  2. 我应该为 Perl 使用另一个电子邮件模块吗?Email::Sender 似乎是最经常和最近更新的。

编辑:这是我到目前为止的代码:

my $email = Email::Stuffer->new(
        text_body=>$body,
        subject=>$subjparam,
        from=>$from, # or use ->from($email1, $email2...)
        transport=>Email::Sender::Transport::SMTP->new({
            host => $smtpserver,
            port => $smtpport,
            username => $smtpuser,
            password => $smtppw,
            }),
        );

我现在得到的错误是: Can't use string ("text_body") as a HASH ref while "strict refs" in use at /usr/local/share/perl/5.26.1/Email/Stuffer.pm line 224.

我不能只创建电子邮件并一次性发送,我必须创建电子邮件,寻找其他选项添加到它(如抄送地址以及是否需要附加文件)等等。我得到的代码来自 Perl Maven 只是不起作用。

标签: perlemailemail-attachments

解决方案


该过程有两个组件,构建电子邮件和发送电子邮件。Email::Sender 只处理后者,它展示了如何使用 Email::Simple 来构造简单的电子邮件。要构建更高级的电子邮件,例如带有附件的电子邮件,您需要更强大的Email::MIME,并且有一个 Email::MIME 和 Email::Sender 的包装器,称为Email::Stuffer,它提供了用于附加文件的简单 API。

use strict;
use warnings;
use Email::Stuffer;
my $mail = Email::Stuffer->to($to)->from($from)->subject($subj)->text_body($text);

$mail->attach_file('/path/to/file.txt'); # guesses MIME type
# or if you have the file data in memory
$mail->attach($contents, name => 'foo.dat', filename => 'foo.dat',
           content_type => 'application/octet-stream');

# to change the transport
$mail->transport('SMTP', host => ...);
$mail->transport(Email::Sender::Transport::SMTP->new(...));

$mail->send_or_die;

推荐阅读