@@ -1,5 +1,33 @@
Revision history for Email-Sender
+1.300011 2014-03-02 18:16:12-05:00 America/New_York
+ - run the sendmail program with -i by default (thanks, William Blunn)
+ - do not die when a race causes mkpath(Maildir/new) to fail because the
+ directory already exists
+
+1.300010 2014-01-11 14:15:13-05:00 America/New_York
+ - the SMTP transport now has a "debug" option
+
+1.300009 2013-09-01 12:03:06 America/New_York
+ see also 1.300008!
+
+ switch to automatic determination of prereqs to improve accuracy
+
+1.300008 2013-09-01 09:39:13 America/New_York
+ [THIS MIGHT BREAK YOUR CODE]
+ at long last, Sendmail and Maildir transports replaces CRLF with CR
+ before piping
+
+ [BUG FIXES]
+ fixes a bug where recipients beginning with a - would not work with
+ the Sendmail transport [rt.perl.org #66246]
+
+ require Email-Abstract 3.006, to get Email-Simple 1.998, to get
+ Email::Simple->new(\$str), resolving [rt.perl.org #85926]
+
+1.300007 2013-03-19 14:58:27 America/New_York
+ when sending over SMTP, send DATA in hunks of 1 mebibyte or smaller
+
1.300006 2013-03-17 17:23:21 America/New_York
re-fix the problem with attribute accessors and role methods
clashing, previously fixed in 0.102360
@@ -1,4 +1,4 @@
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -12,7 +12,7 @@ b) the "Artistic License"
--- The GNU General Public License, Version 1, February 1989 ---
-This software is Copyright (c) 2013 by Ricardo Signes.
+This software is Copyright (c) 2014 by Ricardo Signes.
This is free software, licensed under:
@@ -22,7 +22,7 @@ This is free software, licensed under:
Version 1, February 1989
Copyright (C) 1989 Free Software Foundation, Inc.
- 51 Franklin St, Suite 500, Boston, MA 02110-1335 USA
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -272,7 +272,7 @@ That's all there is to it!
--- The Artistic License 1.0 ---
-This software is Copyright (c) 2013 by Ricardo Signes.
+This software is Copyright (c) 2014 by Ricardo Signes.
This is free software, licensed under:
@@ -1,3 +1,4 @@
+# This file was automatically generated by Dist::Zilla::Plugin::Manifest v5.014.
Changes
LICENSE
MANIFEST
@@ -31,7 +32,6 @@ lib/Email/Sender/Transport/Test.pm
lib/Email/Sender/Transport/Wrapper.pm
lib/Email/Sender/Util.pm
misc/smtp.t
-t/00-compile.t
t/00-load.t
t/000-report-versions-tiny.t
t/devnull.t
@@ -4,7 +4,7 @@
"Ricardo Signes <rjbs@cpan.org>"
],
"dynamic_config" : 0,
- "generated_by" : "Dist::Zilla version 4.300030, CPAN::Meta::Converter version 2.120921",
+ "generated_by" : "Dist::Zilla version 5.014, CPAN::Meta::Converter version 2.133380",
"license" : [
"perl_5"
],
@@ -21,179 +21,217 @@
},
"develop" : {
"requires" : {
- "Sub::Override" : "0",
"Test::Pod" : "1.41",
"version" : "0.9901"
}
},
"runtime" : {
"requires" : {
- "Capture::Tiny" : "0.08",
"Carp" : "0",
- "Cwd" : "0",
- "Email::Abstract" : "3",
+ "Email::Abstract" : "3.006",
"Email::Address" : "0",
"Email::Simple" : "1.998",
"Fcntl" : "0",
"File::Basename" : "0",
- "File::Find" : "0",
- "File::Path" : "0",
+ "File::Path" : "2.06",
"File::Spec" : "0",
- "File::Temp" : "0",
- "FindBin" : "0",
+ "IO::File" : "0",
+ "IO::Handle" : "0",
"List::MoreUtils" : "0",
"Module::Runtime" : "0",
"Moo" : "1.000008",
"Moo::Role" : "0",
"MooX::Types::MooseLike" : "0.15",
+ "MooX::Types::MooseLike::Base" : "0",
"Net::SMTP" : "0",
"Scalar::Util" : "0",
"Sub::Exporter" : "0",
+ "Sub::Exporter::Util" : "0",
"Sys::Hostname" : "0",
"Throwable::Error" : "0.200003",
- "Try::Tiny" : "0"
+ "Try::Tiny" : "0",
+ "strict" : "0",
+ "warnings" : "0"
}
},
"test" : {
"requires" : {
- "Test::More" : "0.96"
+ "Capture::Tiny" : "0.08",
+ "Cwd" : "0",
+ "Exporter" : "0",
+ "File::Temp" : "0",
+ "Test::More" : "0.96",
+ "lib" : "0"
}
}
},
"release_status" : "stable",
"resources" : {
- "homepage" : "https://github.com/rjbs/email-sender",
+ "bugtracker" : {
+ "web" : "https://github.com/rjbs/Email-Sender/issues"
+ },
+ "homepage" : "https://github.com/rjbs/Email-Sender",
"repository" : {
"type" : "git",
- "url" : "https://github.com/rjbs/email-sender.git",
- "web" : "https://github.com/rjbs/email-sender"
+ "url" : "https://github.com/rjbs/Email-Sender.git",
+ "web" : "https://github.com/rjbs/Email-Sender"
}
},
- "version" : "1.300006",
+ "version" : "1.300011",
"x_Dist_Zilla" : {
"perl" : {
- "version" : "5.017009"
+ "version" : "5.019009"
},
"plugins" : [
{
"class" : "Dist::Zilla::Plugin::Git::GatherDir",
- "name" : "@Filter/Git::GatherDir",
- "version" : "2.009"
+ "name" : "@RJBS/Git::GatherDir",
+ "version" : "2.020"
},
{
"class" : "Dist::Zilla::Plugin::CheckPrereqsIndexed",
- "name" : "@Filter/CheckPrereqsIndexed",
- "version" : "0.008"
+ "name" : "@RJBS/CheckPrereqsIndexed",
+ "version" : "0.010"
},
{
"class" : "Dist::Zilla::Plugin::CheckExtraTests",
- "name" : "@Filter/CheckExtraTests",
- "version" : "0.011"
+ "name" : "@RJBS/CheckExtraTests",
+ "version" : "0.018"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::PromptIfStale",
+ "config" : {
+ "Dist::Zilla::Plugin::PromptIfStale" : {
+ "check_all_plugins" : 0,
+ "check_all_prereqs" : 0,
+ "modules" : [
+ "Dist::Zilla::PluginBundle::RJBS"
+ ],
+ "phase" : "build",
+ "skip" : []
+ }
+ },
+ "name" : "@RJBS/RJBS-Outdated",
+ "version" : "0.020"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::PromptIfStale",
+ "config" : {
+ "Dist::Zilla::Plugin::PromptIfStale" : {
+ "check_all_plugins" : "1",
+ "check_all_prereqs" : 0,
+ "modules" : [],
+ "phase" : "release",
+ "skip" : []
+ }
+ },
+ "name" : "@RJBS/CPAN-Outdated",
+ "version" : "0.020"
},
{
"class" : "Dist::Zilla::Plugin::PruneCruft",
- "name" : "@Filter/@Filter/PruneCruft",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/PruneCruft",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::ManifestSkip",
- "name" : "@Filter/@Filter/ManifestSkip",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/ManifestSkip",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::MetaYAML",
- "name" : "@Filter/@Filter/MetaYAML",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/MetaYAML",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::License",
- "name" : "@Filter/@Filter/License",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/License",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::Readme",
- "name" : "@Filter/@Filter/Readme",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/Readme",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::ExecDir",
- "name" : "@Filter/@Filter/ExecDir",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/ExecDir",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::ShareDir",
- "name" : "@Filter/@Filter/ShareDir",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/ShareDir",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::MakeMaker",
- "name" : "@Filter/@Filter/MakeMaker",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/MakeMaker",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::Manifest",
- "name" : "@Filter/@Filter/Manifest",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/Manifest",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::TestRelease",
- "name" : "@Filter/@Filter/TestRelease",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/TestRelease",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::ConfirmRelease",
- "name" : "@Filter/@Filter/ConfirmRelease",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/ConfirmRelease",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::UploadToCPAN",
- "name" : "@Filter/@Filter/UploadToCPAN",
- "version" : "4.300030"
+ "name" : "@RJBS/@Filter/UploadToCPAN",
+ "version" : "5.014"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::AutoPrereqs",
+ "name" : "@RJBS/AutoPrereqs",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::Git::NextVersion",
- "name" : "@Filter/Git::NextVersion",
- "version" : "2.009"
+ "name" : "@RJBS/Git::NextVersion",
+ "version" : "2.020"
},
{
"class" : "Dist::Zilla::Plugin::PkgVersion",
- "name" : "@Filter/PkgVersion",
- "version" : "4.300030"
+ "name" : "@RJBS/PkgVersion",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::MetaConfig",
- "name" : "@Filter/MetaConfig",
- "version" : "4.300030"
+ "name" : "@RJBS/MetaConfig",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::MetaJSON",
- "name" : "@Filter/MetaJSON",
- "version" : "4.300030"
+ "name" : "@RJBS/MetaJSON",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::NextRelease",
- "name" : "@Filter/NextRelease",
- "version" : "4.300030"
+ "name" : "@RJBS/NextRelease",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::Test::ChangesHasContent",
- "name" : "@Filter/Test::ChangesHasContent",
+ "name" : "@RJBS/Test::ChangesHasContent",
"version" : "0.006"
},
{
"class" : "Dist::Zilla::Plugin::PodSyntaxTests",
- "name" : "@Filter/PodSyntaxTests",
- "version" : "4.300030"
- },
- {
- "class" : "Dist::Zilla::Plugin::Test::Compile",
- "name" : "@Filter/Test::Compile",
- "version" : "2.001"
+ "name" : "@RJBS/PodSyntaxTests",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::ReportVersions::Tiny",
- "name" : "@Filter/ReportVersions::Tiny",
- "version" : "1.08"
+ "name" : "@RJBS/ReportVersions::Tiny",
+ "version" : "1.10"
},
{
"class" : "Dist::Zilla::Plugin::Prereqs",
@@ -203,38 +241,141 @@
"type" : "requires"
}
},
- "name" : "@Filter/TestMoreWithSubtests",
- "version" : "4.300030"
+ "name" : "@RJBS/TestMoreWithSubtests",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::PodWeaver",
- "name" : "@Filter/PodWeaver",
- "version" : "3.101641"
+ "config" : {
+ "Dist::Zilla::Plugin::PodWeaver" : {
+ "config_plugins" : [
+ "@RJBS"
+ ],
+ "finder" : [
+ ":InstallModules",
+ ":ExecFiles"
+ ],
+ "plugins" : [
+ {
+ "class" : "Pod::Weaver::Plugin::EnsurePod5",
+ "name" : "@CorePrep/EnsurePod5",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Plugin::H1Nester",
+ "name" : "@CorePrep/H1Nester",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Plugin::SingleEncoding",
+ "name" : "@RJBS/SingleEncoding",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Name",
+ "name" : "@RJBS/Name",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Version",
+ "name" : "@RJBS/Version",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Region",
+ "name" : "@RJBS/Prelude",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Generic",
+ "name" : "@RJBS/Synopsis",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Generic",
+ "name" : "@RJBS/Description",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Generic",
+ "name" : "@RJBS/Overview",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Generic",
+ "name" : "@RJBS/Stability",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Collect",
+ "name" : "Attributes",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Collect",
+ "name" : "Methods",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Collect",
+ "name" : "Functions",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Leftovers",
+ "name" : "@RJBS/Leftovers",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Region",
+ "name" : "@RJBS/postlude",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Authors",
+ "name" : "@RJBS/Authors",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Section::Legal",
+ "name" : "@RJBS/Legal",
+ "version" : "4.006"
+ },
+ {
+ "class" : "Pod::Weaver::Plugin::Transformer",
+ "name" : "@RJBS/List",
+ "version" : "4.006"
+ }
+ ]
+ }
+ },
+ "name" : "@RJBS/PodWeaver",
+ "version" : "4.005"
},
{
"class" : "Dist::Zilla::Plugin::GithubMeta",
- "name" : "@Filter/GithubMeta",
- "version" : "0.28"
+ "name" : "@RJBS/GithubMeta",
+ "version" : "0.42"
},
{
"class" : "Dist::Zilla::Plugin::Git::Check",
- "name" : "@Filter/@Git/Check",
- "version" : "2.009"
+ "name" : "@RJBS/@Git/Check",
+ "version" : "2.020"
},
{
"class" : "Dist::Zilla::Plugin::Git::Commit",
- "name" : "@Filter/@Git/Commit",
- "version" : "2.009"
+ "name" : "@RJBS/@Git/Commit",
+ "version" : "2.020"
},
{
"class" : "Dist::Zilla::Plugin::Git::Tag",
- "name" : "@Filter/@Git/Tag",
- "version" : "2.009"
+ "name" : "@RJBS/@Git/Tag",
+ "version" : "2.020"
},
{
"class" : "Dist::Zilla::Plugin::Git::Push",
- "name" : "@Filter/@Git/Push",
- "version" : "2.009"
+ "name" : "@RJBS/@Git/Push",
+ "version" : "2.020"
},
{
"class" : "Dist::Zilla::Plugin::Prereqs",
@@ -245,7 +386,7 @@
}
},
"name" : "Prereqs",
- "version" : "4.300030"
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::Prereqs",
@@ -256,37 +397,62 @@
}
},
"name" : "DevelopRequires",
- "version" : "4.300030"
+ "version" : "5.014"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::RemovePrereqs",
+ "config" : {
+ "Dist::Zilla::Plugin::RemovePrereqs" : {
+ "modules_to_remove" : [
+ "JSON",
+ "Test::MockObject",
+ "Net::SMTP::SSL",
+ "Sub::Override"
+ ]
+ }
+ },
+ "name" : "RemovePrereqs",
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":InstallModules",
- "version" : "4.300030"
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":IncModules",
- "version" : "4.300030"
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":TestFiles",
- "version" : "4.300030"
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":ExecFiles",
- "version" : "4.300030"
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":ShareFiles",
- "version" : "4.300030"
+ "version" : "5.014"
},
{
"class" : "Dist::Zilla::Plugin::FinderCode",
"name" : ":MainModule",
- "version" : "4.300030"
+ "version" : "5.014"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":AllFiles",
+ "version" : "5.014"
+ },
+ {
+ "class" : "Dist::Zilla::Plugin::FinderCode",
+ "name" : ":NoFiles",
+ "version" : "5.014"
}
],
"zilla" : {
@@ -294,7 +460,7 @@
"config" : {
"is_trial" : "0"
},
- "version" : "4.300030"
+ "version" : "5.014"
}
}
}
@@ -3,177 +3,287 @@ abstract: 'a library for sending email'
author:
- 'Ricardo Signes <rjbs@cpan.org>'
build_requires:
- Test::More: 0.96
+ Capture::Tiny: '0.08'
+ Cwd: '0'
+ Exporter: '0'
+ File::Temp: '0'
+ Test::More: '0.96'
+ lib: '0'
configure_requires:
- ExtUtils::MakeMaker: 6.30
+ ExtUtils::MakeMaker: '6.30'
dynamic_config: 0
-generated_by: 'Dist::Zilla version 4.300030, CPAN::Meta::Converter version 2.120921'
+generated_by: 'Dist::Zilla version 5.014, CPAN::Meta::Converter version 2.133380'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
- version: 1.4
+ version: '1.4'
name: Email-Sender
requires:
- Capture::Tiny: 0.08
- Carp: 0
- Cwd: 0
- Email::Abstract: 3
- Email::Address: 0
- Email::Simple: 1.998
- Fcntl: 0
- File::Basename: 0
- File::Find: 0
- File::Path: 0
- File::Spec: 0
- File::Temp: 0
- FindBin: 0
- List::MoreUtils: 0
- Module::Runtime: 0
- Moo: 1.000008
- Moo::Role: 0
- MooX::Types::MooseLike: 0.15
- Net::SMTP: 0
- Scalar::Util: 0
- Sub::Exporter: 0
- Sys::Hostname: 0
- Throwable::Error: 0.200003
- Try::Tiny: 0
+ Carp: '0'
+ Email::Abstract: '3.006'
+ Email::Address: '0'
+ Email::Simple: '1.998'
+ Fcntl: '0'
+ File::Basename: '0'
+ File::Path: '2.06'
+ File::Spec: '0'
+ IO::File: '0'
+ IO::Handle: '0'
+ List::MoreUtils: '0'
+ Module::Runtime: '0'
+ Moo: '1.000008'
+ Moo::Role: '0'
+ MooX::Types::MooseLike: '0.15'
+ MooX::Types::MooseLike::Base: '0'
+ Net::SMTP: '0'
+ Scalar::Util: '0'
+ Sub::Exporter: '0'
+ Sub::Exporter::Util: '0'
+ Sys::Hostname: '0'
+ Throwable::Error: '0.200003'
+ Try::Tiny: '0'
+ strict: '0'
+ warnings: '0'
resources:
- homepage: https://github.com/rjbs/email-sender
- repository: https://github.com/rjbs/email-sender.git
-version: 1.300006
+ bugtracker: https://github.com/rjbs/Email-Sender/issues
+ homepage: https://github.com/rjbs/Email-Sender
+ repository: https://github.com/rjbs/Email-Sender.git
+version: '1.300011'
x_Dist_Zilla:
perl:
- version: 5.017009
+ version: '5.019009'
plugins:
-
class: Dist::Zilla::Plugin::Git::GatherDir
- name: '@Filter/Git::GatherDir'
- version: 2.009
+ name: '@RJBS/Git::GatherDir'
+ version: '2.020'
-
class: Dist::Zilla::Plugin::CheckPrereqsIndexed
- name: '@Filter/CheckPrereqsIndexed'
- version: 0.008
+ name: '@RJBS/CheckPrereqsIndexed'
+ version: '0.010'
-
class: Dist::Zilla::Plugin::CheckExtraTests
- name: '@Filter/CheckExtraTests'
- version: 0.011
+ name: '@RJBS/CheckExtraTests'
+ version: '0.018'
+ -
+ class: Dist::Zilla::Plugin::PromptIfStale
+ config:
+ Dist::Zilla::Plugin::PromptIfStale:
+ check_all_plugins: 0
+ check_all_prereqs: 0
+ modules:
+ - Dist::Zilla::PluginBundle::RJBS
+ phase: build
+ skip: []
+ name: '@RJBS/RJBS-Outdated'
+ version: '0.020'
+ -
+ class: Dist::Zilla::Plugin::PromptIfStale
+ config:
+ Dist::Zilla::Plugin::PromptIfStale:
+ check_all_plugins: '1'
+ check_all_prereqs: 0
+ modules: []
+ phase: release
+ skip: []
+ name: '@RJBS/CPAN-Outdated'
+ version: '0.020'
-
class: Dist::Zilla::Plugin::PruneCruft
- name: '@Filter/@Filter/PruneCruft'
- version: 4.300030
+ name: '@RJBS/@Filter/PruneCruft'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::ManifestSkip
- name: '@Filter/@Filter/ManifestSkip'
- version: 4.300030
+ name: '@RJBS/@Filter/ManifestSkip'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::MetaYAML
- name: '@Filter/@Filter/MetaYAML'
- version: 4.300030
+ name: '@RJBS/@Filter/MetaYAML'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::License
- name: '@Filter/@Filter/License'
- version: 4.300030
+ name: '@RJBS/@Filter/License'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::Readme
- name: '@Filter/@Filter/Readme'
- version: 4.300030
+ name: '@RJBS/@Filter/Readme'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::ExecDir
- name: '@Filter/@Filter/ExecDir'
- version: 4.300030
+ name: '@RJBS/@Filter/ExecDir'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::ShareDir
- name: '@Filter/@Filter/ShareDir'
- version: 4.300030
+ name: '@RJBS/@Filter/ShareDir'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::MakeMaker
- name: '@Filter/@Filter/MakeMaker'
- version: 4.300030
+ name: '@RJBS/@Filter/MakeMaker'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::Manifest
- name: '@Filter/@Filter/Manifest'
- version: 4.300030
+ name: '@RJBS/@Filter/Manifest'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::TestRelease
- name: '@Filter/@Filter/TestRelease'
- version: 4.300030
+ name: '@RJBS/@Filter/TestRelease'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::ConfirmRelease
- name: '@Filter/@Filter/ConfirmRelease'
- version: 4.300030
+ name: '@RJBS/@Filter/ConfirmRelease'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::UploadToCPAN
- name: '@Filter/@Filter/UploadToCPAN'
- version: 4.300030
+ name: '@RJBS/@Filter/UploadToCPAN'
+ version: '5.014'
+ -
+ class: Dist::Zilla::Plugin::AutoPrereqs
+ name: '@RJBS/AutoPrereqs'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::Git::NextVersion
- name: '@Filter/Git::NextVersion'
- version: 2.009
+ name: '@RJBS/Git::NextVersion'
+ version: '2.020'
-
class: Dist::Zilla::Plugin::PkgVersion
- name: '@Filter/PkgVersion'
- version: 4.300030
+ name: '@RJBS/PkgVersion'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::MetaConfig
- name: '@Filter/MetaConfig'
- version: 4.300030
+ name: '@RJBS/MetaConfig'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::MetaJSON
- name: '@Filter/MetaJSON'
- version: 4.300030
+ name: '@RJBS/MetaJSON'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::NextRelease
- name: '@Filter/NextRelease'
- version: 4.300030
+ name: '@RJBS/NextRelease'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::Test::ChangesHasContent
- name: '@Filter/Test::ChangesHasContent'
- version: 0.006
+ name: '@RJBS/Test::ChangesHasContent'
+ version: '0.006'
-
class: Dist::Zilla::Plugin::PodSyntaxTests
- name: '@Filter/PodSyntaxTests'
- version: 4.300030
- -
- class: Dist::Zilla::Plugin::Test::Compile
- name: '@Filter/Test::Compile'
- version: 2.001
+ name: '@RJBS/PodSyntaxTests'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::ReportVersions::Tiny
- name: '@Filter/ReportVersions::Tiny'
- version: 1.08
+ name: '@RJBS/ReportVersions::Tiny'
+ version: '1.10'
-
class: Dist::Zilla::Plugin::Prereqs
config:
Dist::Zilla::Plugin::Prereqs:
phase: test
type: requires
- name: '@Filter/TestMoreWithSubtests'
- version: 4.300030
+ name: '@RJBS/TestMoreWithSubtests'
+ version: '5.014'
-
class: Dist::Zilla::Plugin::PodWeaver
- name: '@Filter/PodWeaver'
- version: 3.101641
+ config:
+ Dist::Zilla::Plugin::PodWeaver:
+ config_plugins:
+ - '@RJBS'
+ finder:
+ - ':InstallModules'
+ - ':ExecFiles'
+ plugins:
+ -
+ class: Pod::Weaver::Plugin::EnsurePod5
+ name: '@CorePrep/EnsurePod5'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Plugin::H1Nester
+ name: '@CorePrep/H1Nester'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Plugin::SingleEncoding
+ name: '@RJBS/SingleEncoding'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Name
+ name: '@RJBS/Name'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Version
+ name: '@RJBS/Version'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Region
+ name: '@RJBS/Prelude'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Generic
+ name: '@RJBS/Synopsis'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Generic
+ name: '@RJBS/Description'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Generic
+ name: '@RJBS/Overview'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Generic
+ name: '@RJBS/Stability'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Collect
+ name: Attributes
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Collect
+ name: Methods
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Collect
+ name: Functions
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Leftovers
+ name: '@RJBS/Leftovers'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Region
+ name: '@RJBS/postlude'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Authors
+ name: '@RJBS/Authors'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Section::Legal
+ name: '@RJBS/Legal'
+ version: '4.006'
+ -
+ class: Pod::Weaver::Plugin::Transformer
+ name: '@RJBS/List'
+ version: '4.006'
+ name: '@RJBS/PodWeaver'
+ version: '4.005'
-
class: Dist::Zilla::Plugin::GithubMeta
- name: '@Filter/GithubMeta'
- version: 0.28
+ name: '@RJBS/GithubMeta'
+ version: '0.42'
-
class: Dist::Zilla::Plugin::Git::Check
- name: '@Filter/@Git/Check'
- version: 2.009
+ name: '@RJBS/@Git/Check'
+ version: '2.020'
-
class: Dist::Zilla::Plugin::Git::Commit
- name: '@Filter/@Git/Commit'
- version: 2.009
+ name: '@RJBS/@Git/Commit'
+ version: '2.020'
-
class: Dist::Zilla::Plugin::Git::Tag
- name: '@Filter/@Git/Tag'
- version: 2.009
+ name: '@RJBS/@Git/Tag'
+ version: '2.020'
-
class: Dist::Zilla::Plugin::Git::Push
- name: '@Filter/@Git/Push'
- version: 2.009
+ name: '@RJBS/@Git/Push'
+ version: '2.020'
-
class: Dist::Zilla::Plugin::Prereqs
config:
@@ -181,7 +291,7 @@ x_Dist_Zilla:
phase: runtime
type: requires
name: Prereqs
- version: 4.300030
+ version: '5.014'
-
class: Dist::Zilla::Plugin::Prereqs
config:
@@ -189,33 +299,52 @@ x_Dist_Zilla:
phase: develop
type: requires
name: DevelopRequires
- version: 4.300030
+ version: '5.014'
+ -
+ class: Dist::Zilla::Plugin::RemovePrereqs
+ config:
+ Dist::Zilla::Plugin::RemovePrereqs:
+ modules_to_remove:
+ - JSON
+ - Test::MockObject
+ - Net::SMTP::SSL
+ - Sub::Override
+ name: RemovePrereqs
+ version: '5.014'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':InstallModules'
- version: 4.300030
+ version: '5.014'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':IncModules'
- version: 4.300030
+ version: '5.014'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':TestFiles'
- version: 4.300030
+ version: '5.014'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':ExecFiles'
- version: 4.300030
+ version: '5.014'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':ShareFiles'
- version: 4.300030
+ version: '5.014'
-
class: Dist::Zilla::Plugin::FinderCode
name: ':MainModule'
- version: 4.300030
+ version: '5.014'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':AllFiles'
+ version: '5.014'
+ -
+ class: Dist::Zilla::Plugin::FinderCode
+ name: ':NoFiles'
+ version: '5.014'
zilla:
class: Dist::Zilla::Dist::Builder
config:
- is_trial: 0
- version: 4.300030
+ is_trial: '0'
+ version: '5.014'
@@ -1,4 +1,5 @@
+# This file was automatically generated by Dist::Zilla::Plugin::MakeMaker v5.014.
use strict;
use warnings;
@@ -11,9 +12,7 @@ use ExtUtils::MakeMaker 6.30;
my %WriteMakefileArgs = (
"ABSTRACT" => "a library for sending email",
"AUTHOR" => "Ricardo Signes <rjbs\@cpan.org>",
- "BUILD_REQUIRES" => {
- "Test::More" => "0.96"
- },
+ "BUILD_REQUIRES" => {},
"CONFIGURE_REQUIRES" => {
"ExtUtils::MakeMaker" => "6.30"
},
@@ -22,49 +21,86 @@ my %WriteMakefileArgs = (
"LICENSE" => "perl",
"NAME" => "Email::Sender",
"PREREQ_PM" => {
- "Capture::Tiny" => "0.08",
"Carp" => 0,
- "Cwd" => 0,
- "Email::Abstract" => 3,
+ "Email::Abstract" => "3.006",
"Email::Address" => 0,
"Email::Simple" => "1.998",
"Fcntl" => 0,
"File::Basename" => 0,
- "File::Find" => 0,
- "File::Path" => 0,
+ "File::Path" => "2.06",
"File::Spec" => 0,
- "File::Temp" => 0,
- "FindBin" => 0,
+ "IO::File" => 0,
+ "IO::Handle" => 0,
"List::MoreUtils" => 0,
"Module::Runtime" => 0,
"Moo" => "1.000008",
"Moo::Role" => 0,
"MooX::Types::MooseLike" => "0.15",
+ "MooX::Types::MooseLike::Base" => 0,
"Net::SMTP" => 0,
"Scalar::Util" => 0,
"Sub::Exporter" => 0,
+ "Sub::Exporter::Util" => 0,
"Sys::Hostname" => 0,
"Throwable::Error" => "0.200003",
- "Try::Tiny" => 0
+ "Try::Tiny" => 0,
+ "strict" => 0,
+ "warnings" => 0
+ },
+ "TEST_REQUIRES" => {
+ "Capture::Tiny" => "0.08",
+ "Cwd" => 0,
+ "Exporter" => 0,
+ "File::Temp" => 0,
+ "Test::More" => "0.96",
+ "lib" => 0
},
- "VERSION" => "1.300006",
+ "VERSION" => "1.300011",
"test" => {
"TESTS" => "t/*.t"
}
);
-unless ( eval { ExtUtils::MakeMaker->VERSION(6.56) } ) {
- my $br = delete $WriteMakefileArgs{BUILD_REQUIRES};
- my $pp = $WriteMakefileArgs{PREREQ_PM};
- for my $mod ( keys %$br ) {
- if ( exists $pp->{$mod} ) {
- $pp->{$mod} = $br->{$mod} if $br->{$mod} > $pp->{$mod};
- }
- else {
- $pp->{$mod} = $br->{$mod};
- }
- }
+my %FallbackPrereqs = (
+ "Capture::Tiny" => "0.08",
+ "Carp" => 0,
+ "Cwd" => 0,
+ "Email::Abstract" => "3.006",
+ "Email::Address" => 0,
+ "Email::Simple" => "1.998",
+ "Exporter" => 0,
+ "Fcntl" => 0,
+ "File::Basename" => 0,
+ "File::Path" => "2.06",
+ "File::Spec" => 0,
+ "File::Temp" => 0,
+ "IO::File" => 0,
+ "IO::Handle" => 0,
+ "List::MoreUtils" => 0,
+ "Module::Runtime" => 0,
+ "Moo" => "1.000008",
+ "Moo::Role" => 0,
+ "MooX::Types::MooseLike" => "0.15",
+ "MooX::Types::MooseLike::Base" => 0,
+ "Net::SMTP" => 0,
+ "Scalar::Util" => 0,
+ "Sub::Exporter" => 0,
+ "Sub::Exporter::Util" => 0,
+ "Sys::Hostname" => 0,
+ "Test::More" => "0.96",
+ "Throwable::Error" => "0.200003",
+ "Try::Tiny" => 0,
+ "lib" => 0,
+ "strict" => 0,
+ "warnings" => 0
+);
+
+
+unless ( eval { ExtUtils::MakeMaker->VERSION(6.63_03) } ) {
+ delete $WriteMakefileArgs{TEST_REQUIRES};
+ delete $WriteMakefileArgs{BUILD_REQUIRES};
+ $WriteMakefileArgs{PREREQ_PM} = \%FallbackPrereqs;
}
delete $WriteMakefileArgs{CONFIGURE_REQUIRES}
@@ -1,13 +1,15 @@
This archive contains the distribution Email-Sender,
-version 1.300006:
+version 1.300011:
a library for sending email
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
+This README file was generated by Dist::Zilla::Plugin::Readme v5.014.
+
@@ -3,42 +3,19 @@ author = Ricardo Signes <rjbs@cpan.org>
license = Perl_5
copyright_holder = Ricardo Signes
-[@Filter]
-bundle = @RJBS
-remove = AutoPrereqs
+[@RJBS]
[Prereqs]
-; NON-CORE PREREQUISITES
-Capture::Tiny = 0.08 ; for testing
-Module::Runtime = 0
-Email::Abstract = 3 ; XXX: really use Abstract?; 3 = \$str
-Email::Address = 0 ; used for env-from-msg (::Simple)
-List::MoreUtils = 0 ; minimum version unknown; uniq
-Moo = 1.000008 ; bugfixes related to old Mouse installs
-Moo::Role = 0
-MooX::Types::MooseLike = 0.15 ; InstanceOf uses ->isa
-Net::SMTP = 0 ;
-Sub::Exporter = 0 ;
-Try::Tiny = 0 ; required by Moose, anyway
-Throwable::Error = 0.200003 ; with $obj->throw and ->throw($str) and Moo
-
-; SOON TO NOT BE PREREQUISIES ?
-Email::Simple = 1.998 ; needed(?) for ->header_obj
- ; only needed by Mbox; split?
-
-; CORE PREREQUISITES
-Carp = 0 ; minimum unknown
-Cwd = 0 ; minimum unknown
-Fcntl = 0 ;
-File::Basename = 0 ;
-File::Find = 0 ;
-File::Path = 0 ;
-File::Spec = 0 ;
-File::Temp = 0 ;
-FindBin = 0 ;
-Scalar::Util = 0 ;
-Sys::Hostname = 0 ;
+Moo = 1.000008 ; bugfixes related to old Mouse installs
+MooX::Types::MooseLike = 0.15 ; InstanceOf uses ->isa
+Throwable::Error = 0.200003 ; with $obj->throw and ->throw($str) and Moo
[Prereqs / DevelopRequires]
-Sub::Override = 0
+Sub::Override = 0
+Test::MockObject = 0
+[RemovePrereqs]
+remove = JSON
+remove = Test::MockObject
+remove = Net::SMTP::SSL
+remove = Sub::Override
@@ -1,12 +1,22 @@
package Email::Sender::Failure::Multi;
-{
- $Email::Sender::Failure::Multi::VERSION = '1.300006';
-}
+# ABSTRACT: an aggregate of multiple failures
+$Email::Sender::Failure::Multi::VERSION = '1.300011';
use Moo;
-use MooX::Types::MooseLike::Base qw(ArrayRef);
extends 'Email::Sender::Failure';
-# ABSTRACT: an aggregate of multiple failures
+use MooX::Types::MooseLike::Base qw(ArrayRef);
+
+# =head1 DESCRIPTION
+#
+# A multiple failure report is raised when more than one failure is encountered
+# when sending a single message, or when mixed states were encountered.
+#
+# =attr failures
+#
+# This method returns a list of other Email::Sender::Failure objects represented
+# by this multi.
+#
+# =cut
has failures => (
is => 'ro',
@@ -37,6 +47,12 @@ sub recipients {
return \@rcpts;
}
+# =method isa
+#
+# A multiple failure will report that it is a Permanent or Temporary if all of
+# its contained failures are failures of that type.
+#
+# =cut
sub isa {
my ($self, $class) = @_;
@@ -60,13 +76,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Failure::Multi - an aggregate of multiple failures
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -93,7 +111,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,8 @@
package Email::Sender::Failure::Permanent;
-{
- $Email::Sender::Failure::Permanent::VERSION = '1.300006';
-}
+# ABSTRACT: a permanent delivery failure
+$Email::Sender::Failure::Permanent::VERSION = '1.300011';
use Moo;
extends 'Email::Sender::Failure';
-# ABSTRACT: a permanent delivery failure
no Moo;
1;
@@ -13,13 +11,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Failure::Permanent - a permanent delivery failure
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 AUTHOR
@@ -27,7 +27,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,8 @@
package Email::Sender::Failure::Temporary;
-{
- $Email::Sender::Failure::Temporary::VERSION = '1.300006';
-}
+# ABSTRACT: a temporary delivery failure
+$Email::Sender::Failure::Temporary::VERSION = '1.300011';
use Moo;
extends 'Email::Sender::Failure';
-# ABSTRACT: a temporary delivery failure
no Moo;
1;
@@ -13,13 +11,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Failure::Temporary - a temporary delivery failure
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 AUTHOR
@@ -27,7 +27,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,18 +1,33 @@
package Email::Sender::Failure;
-{
- $Email::Sender::Failure::VERSION = '1.300006';
-}
+# ABSTRACT: a report of failure from an email sending transport
+$Email::Sender::Failure::VERSION = '1.300011';
use Moo;
-use MooX::Types::MooseLike::Base qw(ArrayRef);
-use Carp ();
extends 'Throwable::Error';
-# ABSTRACT: a report of failure from an email sending transport
+use Carp ();
+use MooX::Types::MooseLike::Base qw(ArrayRef);
+
+# =attr message
+#
+# This method returns the failure message, which should describe the failure.
+# Failures stringify to this message.
+#
+# =attr code
+#
+# This returns the numeric code of the failure, if any. This is mostly useful
+# for network protocol transports like SMTP. This may be undefined.
+#
+# =cut
has code => (
is => 'ro',
);
+# =attr recipients
+#
+# This returns a list of addresses to which the email could not be sent.
+#
+# =cut
has recipients => (
isa => ArrayRef,
@@ -34,6 +49,17 @@ sub recipients {
return $self->__get_recipients;
}
+# =method throw
+#
+# This method can be used to instantiate and throw an Email::Sender::Failure
+# object at once.
+#
+# Email::Sender::Failure->throw(\%arg);
+#
+# Instead of a hashref of args, you can pass a single string argument which will
+# be used as the C<message> of the new failure.
+#
+# =cut
sub BUILD {
my ($self) = @_;
@@ -41,6 +67,19 @@ sub BUILD {
unless $self->message =~ /\S/;
}
+# =head1 SEE ALSO
+#
+# =over
+#
+# =item * L<Email::Sender::Permanent>
+#
+# =item * L<Email::Sender::Temporary>
+#
+# =item * L<Email::Sender::Multi>
+#
+# =back
+#
+# =cut
no Moo;
1;
@@ -49,13 +88,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Failure - a report of failure from an email sending transport
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 ATTRIBUTES
@@ -103,7 +144,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,248 @@
use strict;
use warnings;
package Email::Sender::Manual::QuickStart;
-{
- $Email::Sender::Manual::QuickStart::VERSION = '1.300006';
-}
# ABSTRACT: how to start using Email::Sender right now
-
+$Email::Sender::Manual::QuickStart::VERSION = '1.300011';
+# =head1 QUICK START
+#
+# =head2 Let's Send Some Mail!
+#
+# No messing around, let's just send some mail.
+#
+# use strict;
+# use Email::Sender::Simple qw(sendmail);
+# use Email::Simple;
+# use Email::Simple::Creator;
+#
+# my $email = Email::Simple->create(
+# header => [
+# To => '"Xavier Q. Ample" <x.ample@example.com>',
+# From => '"Bob Fishman" <orz@example.mil>',
+# Subject => "don't forget to *enjoy the sauce*",
+# ],
+# body => "This message is short, but at least it's cheap.\n",
+# );
+#
+# sendmail($email);
+#
+# That's it. Your message goes out into the internet and tries to get delivered
+# to C<x.ample@example.com>.
+#
+# In the example above, C<$email> could be an Email::Simple object, a
+# MIME::Entity, a string containing an email message, or one of several other
+# types of input. If C<Email::Abstract> can understand a value, it can be passed
+# to Email::Sender::Simple. Email::Sender::Simple tries to make a good guess
+# about how to send the message. It will usually try to use the F<sendmail>
+# program on unix-like systems and to use SMTP on Windows. You can specify a
+# transport, if you need to, but normally that shouldn't be an issue. (See
+# L</Picking a Transport>, though, for more information.)
+#
+# Also note that we imported and used a C<sendmail> routine in the example above.
+# This is exactly the same as saying:
+#
+# Email::Sender::Simple->send($email);
+#
+# ...but it's a lot easier to type. You can use either one.
+#
+# =head3 envelope information
+#
+# We didn't have to tell Email::Sender::Simple where to send the message. If you
+# don't specify recipients, it will use all the email addresses it can find in
+# the F<To> and F<Cc> headers by default. It will use L<Email::Address> to parse
+# those fields. Similarly, if no sender is specified, it will use the first
+# address found in the F<From> header.
+#
+# In most email transmission systems, though, the headers are not by necessity
+# tied to the addresses used as the sender and recipients. For example, your
+# message header might say "From: mailing-list@example.com" while your SMTP
+# client says "MAIL FROM:E<lt>verp-1234@lists.example.comE<gt>". This is a
+# powerful feature, and is necessary for many email application. Being able to
+# set those distinctly is important, and Email::Sender::Simple lets you do this:
+#
+# sendmail($email, { to => [ $to_1, $to_2 ], from => $sender });
+#
+# =head3 in case of error
+#
+# When the message is sent successfully (at least on to its next hop),
+# C<sendmail> will return a true value -- specifically, an
+# L<Email::Sender::Success> object. This object only rarely has much use.
+# What's more useful is what happens if the message can't be sent.
+#
+# If there is an error sending the message, an exception will be thrown. It will
+# be an object belonging to the class L<Email::Sender::Failure>. This object
+# will have a C<message> attribute describing the nature of the failure. There
+# are several specialized forms of failure, like
+# L<Email::Sender::Failure::Multi>, which is thrown when more than one error is
+# encountered when trying to send. You don't need to know about these to use
+# Email::Sender::Simple, though. All you need to know is that C<sendmail>
+# returns true on success and dies on failure.
+#
+# If you'd rather not have to catch exceptions for failure to send mail, you can
+# use the C<try_to_send> method, which can be imported as C<try_to_sendmail>.
+# This method will return just false on failure to send mail.
+#
+# For example:
+#
+# Email::Sender::Simple->try_to_send($email, { ... });
+#
+# use Email::Sender::Simple qw(try_to_sendmail);
+# try_to_sendmail($email, { ... });
+#
+# Some Email::Sender transports can signal success if some, but not all,
+# recipients could be reached. Email::Sender::Simple does its best to ensure
+# that this never happens. When you are using Email::Sender::Simple, mail should
+# either be sent or not. Partial success should never occur.
+#
+# =head2 Picking a Transport
+#
+# =head3 passing in your own transport
+#
+# If Email::Sender::Simple doesn't pick the transport you want, or if you have
+# more specific needs, you can specify a transport in several ways. The simplest
+# is to build a transport object and pass it in. You can read more about
+# transports elsewhere. For now, we'll just assume that you need to send mail
+# via SMTP on an unusual port. You can send mail like this:
+#
+# my $transport = Email::Sender::Transport::SMTP->new({
+# host => 'smtp.example.com',
+# port => 2525,
+# });
+#
+# sendmail($email, { transport => $transport });
+#
+# Now, instead of guessing at what transport to use, Email::Sender::Simple will
+# use the one you provided. This transport will have to be specified for each
+# call to C<sendmail>, so you might want to look at other options, which follow.
+#
+# =head3 specifying transport in the environment
+#
+# If you have a program that makes several calls to Email::Sender::Simple, and
+# you need to run this program using a different mailserver, you can set
+# environment variables to change the default. For example:
+#
+# $ export EMAIL_SENDER_TRANSPORT=SMTP
+# $ export EMAIL_SENDER_TRANSPORT_host=smtp.example.com
+# $ export EMAIL_SENDER_TRANSPORT_port=2525
+#
+# $ perl your-program
+#
+# It is important to note that if you have set the default transport by using the
+# environment, I<< no subsequent C<transport> args to C<sendmail> will be
+# respected >>. If you set the default transport via the environment, that's it.
+# Everything will use that transport. (Also, note that while we gave the host and
+# port arguments above in lower case, the casing of arguments in the environment
+# is flattened to support systems where environment variables are of a fixed
+# case. So, C<EMAIL_SENDER_TRANSPORT_PORT> would also work.
+#
+# This is extremely valuable behavior, as it allows you to audit every message
+# that would be sent by a program by running something like this:
+#
+# $ export EMAIL_SENDER_TRANSPORT=Maildir
+# $ perl your-program
+#
+# In that example, any message sent via Email::Sender::Simple would be delivered
+# to a maildir in the current directory.
+#
+# =head3 subclassing to change the default transport
+#
+# If you want to use a library that will behave like Email::Sender::Simple but
+# with a different default transport, you can subclass Email::Sender::Simple and
+# replace the C<build_default_transport> method.
+#
+# =head2 Testing
+#
+# Email::Sender::Simple makes it very, very easy to test code that sends email.
+# The simplest way is to do something like this:
+#
+# use Test::More;
+# BEGIN { $ENV{EMAIL_SENDER_TRANSPORT} = 'Test' }
+# use YourCode;
+#
+# YourCode->run;
+#
+# my @deliveries = Email::Sender::Simple->default_transport->deliveries;
+#
+# Now you've got an array containing every delivery performed through
+# Email::Sender::Simple, in order. Because you set the transport via the
+# environment, no other code will be able to force a different transport.
+#
+# When testing code that forks, L<Email::Sender::Transport::SQLite> can be used
+# to allow every child process to deliver to a single, easy to inspect
+# destination database.
+#
+# =head2 Hey, where's my Bcc support?
+#
+# A common question is "Why doesn't Email::Sender::Simple automatically respect
+# my Bcc header?" This is often combined with, "Here is a patch to 'fix' it."
+# This is not a bug or oversight. Bcc is being ignored intentionally for now
+# because simply adding the Bcc addresses to the message recipients would not
+# produce the usually-desired behavior.
+#
+# For example, here is a set of headers:
+#
+# From: sender@example.com
+# To: to_rcpt@example.com
+# Cc: cc_rcpt@example.com
+# Bcc: the_boss@example.com
+#
+# In this case, we'd expect the message to be delivered to three people:
+# to_rcpt, cc_rcpt, and the_boss. This is why it's often suggested that the
+# Bcc header should be a source for envelope recipients. In fact, though, a
+# message with a Bcc header should probably be delivered I<only> to the Bcc
+# recipients. The "B" in Bcc means "blind." The other recipients should not
+# see who has been Bcc'd. This means you want to send I<two> messages: one to
+# to_rcpt and cc_rcpt, with no Bcc header present; and another to the_boss
+# only, with the Bcc header. B<If you just pick up Bcc addresses as
+# recipients, everyone will see who was Bcc'd.>
+#
+# Email::Sender::Simple promises to send messages atomically. That is: it
+# won't deliver to only some of the recipients, and not to others. That means
+# it can't automatically detect the Bcc header and make two deliveries. There
+# would be a possibility for the second to fail after the first succeeded,
+# which would break the promise of a pure failure or success.
+#
+# The other strategy for dealing with Bcc is to remove the Bcc header from the
+# message and then inject the message with an envelope including the Bcc
+# addresses. The envelope information will not be visible to the final
+# recipients, so this is safe. Unfortunately, this requires modifying the
+# message, and Email::Sender::Simple should not be altering the mutable email
+# object passed to it. There is no C<clone> method on Email::Abstract, so it
+# cannot just build a clone and modify that, either. When such a method
+# exists, Bcc handling may be possible.
+#
+# =head3 Example Bcc Handling
+#
+# If you want to support the Bcc header now, it is up to you to deal with how
+# you want to munge the mail and inject the (possibly) munged copies into your
+# outbound mailflow. It is not reasonable to suggest that
+# Email::Sender::Simple do this job.
+#
+# =head4 Example 1: Explicitly set the envelope recipients for Bcc recipients
+#
+# Create the email without a Bcc header, send it to the Bcc users explicitly
+# and then send it to the To/Cc users implicitly.
+#
+# my $message = create_email_mime_msg; # <- whatever you do to get the message
+#
+# $message->delete_header('bcc'); # delete the Bcc header before sending
+# sendmail($message, { to => $rcpt' }); # send to explicit Bcc address
+# sendmail($message); # and then send as normal
+#
+# =head4 Example 2: Explicitly set the envelope recipients for all recipients
+#
+# You can make a single call to C<sendmail> by pulling all the recipient
+# addresses from the headers yourself and specifying all the envelope
+# recipients once. Again, delete the Bcc header before the message is sent.
+#
+# =head1 SEE ALSO
+#
+# =head2 This is awesome! Where can I learn more?
+#
+# Have a look at L<Email::Sender::Manual>, where all the manual's documents are
+# listed. You can also look at the documentation for L<Email::Sender::Simple>
+# and the various Email::Sender::Transport classes.
+#
+# =cut
1;
@@ -13,13 +250,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Manual::QuickStart - how to start using Email::Sender right now
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 QUICK START
@@ -266,7 +505,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,14 @@
use strict;
use warnings;
package Email::Sender::Manual;
-{
- $Email::Sender::Manual::VERSION = '1.300006';
-}
# ABSTRACT: table of contents for the Email::Sender manual
-
+$Email::Sender::Manual::VERSION = '1.300011';
+# =head1 THE MANUAL
+#
+# L<Email::Sender::Manual::QuickStart> tells you just what you need to know to
+# start using Email::Sender.
+#
+# =cut
1;
@@ -13,13 +16,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Manual - table of contents for the Email::Sender manual
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 THE MANUAL
@@ -32,7 +37,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,18 +1,36 @@
package Email::Sender::Role::CommonSending;
-{
- $Email::Sender::Role::CommonSending::VERSION = '1.300006';
-}
-use Moo::Role;
# ABSTRACT: the common sending tasks most Email::Sender classes will need
+$Email::Sender::Role::CommonSending::VERSION = '1.300011';
+use Moo::Role;
use Carp ();
-use Email::Abstract;
+use Email::Abstract 3.006;
use Email::Sender::Success;
use Email::Sender::Failure::Temporary;
use Email::Sender::Failure::Permanent;
use Scalar::Util ();
use Try::Tiny;
+# =head1 DESCRIPTION
+#
+# Email::Sender::Role::CommonSending provides a number of features that should
+# ease writing new classes that perform the L<Email::Sender> role. Instead of
+# writing a C<send> method, implementors will need to write a smaller
+# C<send_email> method, which will be passed an L<Email::Abstract> object and
+# envelope containing C<from> and C<to> entries. The C<to> entry will be
+# guaranteed to be an array reference.
+#
+# A C<success> method will also be provided as a shortcut for calling:
+#
+# Email::Sender::Success->new(...);
+#
+# A few other minor details are handled by CommonSending; for more information,
+# consult the source.
+#
+# The methods documented here may be overridden to alter the behavior of the
+# CommonSending role.
+#
+# =cut
with 'Email::Sender';
@@ -39,6 +57,12 @@ sub send {
}
}
+# =method prepare_email
+#
+# This method is passed a scalar and is expected to return an Email::Abstract
+# object. You probably shouldn't override it in most cases.
+#
+# =cut
sub prepare_email {
my ($self, $msg) = @_;
@@ -54,6 +78,13 @@ sub prepare_email {
return Email::Abstract->new($msg);
}
+# =method prepare_envelope
+#
+# This method is passed a hashref and returns a new hashref that should be used
+# as the envelope passed to the C<send_email> method. This method is responsible
+# for ensuring that the F<to> entry is an array.
+#
+# =cut
sub prepare_envelope {
my ($self, $env) = @_;
@@ -65,6 +96,16 @@ sub prepare_envelope {
return \%new_env;
}
+# =method success
+#
+# ...
+# return $self->success;
+#
+# This method returns a new Email::Sender::Success object. Arguments passed to
+# this method are passed along to the Success's constructor. This is provided as
+# a convenience for returning success from subclasses' C<send_email> methods.
+#
+# =cut
sub success {
my $self = shift;
@@ -78,13 +119,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Role::CommonSending - the common sending tasks most Email::Sender classes will need
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -133,7 +176,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,13 @@
package Email::Sender::Role::HasMessage;
-{
- $Email::Sender::Role::HasMessage::VERSION = '1.300006';
-}
-use Moo::Role;
# ABSTRACT: an object that has a message
+$Email::Sender::Role::HasMessage::VERSION = '1.300011';
+use Moo::Role;
+# =attr message
+#
+# This attribute is a message associated with the object.
+#
+# =cut
has message => (
is => 'ro',
@@ -18,13 +21,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Role::HasMessage - an object that has a message
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 ATTRIBUTES
@@ -38,7 +43,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,15 @@
package Email::Sender::Simple;
-{
- $Email::Sender::Simple::VERSION = '1.300006';
-}
+# ABSTRACT: the simple interface for sending mail with Sender
+$Email::Sender::Simple::VERSION = '1.300011';
use Moo;
with 'Email::Sender::Role::CommonSending';
-# ABSTRACT: the simple interface for sending mail with Sender
+# =head1 SEE INSTEAD
+#
+# For now, the best documentation of this class is in
+# L<Email::Sender::Manual::QuickStart>.
+#
+# =cut
use Sub::Exporter::Util ();
use Sub::Exporter -setup => {
@@ -167,13 +171,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Simple - the simple interface for sending mail with Sender
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 SEE INSTEAD
@@ -186,7 +192,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,18 @@
package Email::Sender::Success::Partial;
-{
- $Email::Sender::Success::Partial::VERSION = '1.300006';
-}
+# ABSTRACT: a report of partial success when delivering
+$Email::Sender::Success::Partial::VERSION = '1.300011';
use Moo;
extends 'Email::Sender::Success';
+
use MooX::Types::MooseLike::Base qw(InstanceOf);
-# ABSTRACT: a report of partial success when delivering
+# =head1 DESCRIPTION
+#
+# These objects indicate that some deliver was accepted for some recipients and
+# not others. The success object's C<failure> attribute will return a
+# L<Email::Sender::Failure::Multi> describing which parts of the delivery failed.
+#
+# =cut
use Email::Sender::Failure::Multi;
@@ -23,13 +29,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Success::Partial - a report of partial success when delivering
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -43,7 +51,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,14 @@
package Email::Sender::Success;
-{
- $Email::Sender::Success::VERSION = '1.300006';
-}
-use Moo;
# ABSTRACT: the result of successfully sending mail
+$Email::Sender::Success::VERSION = '1.300011';
+use Moo;
+# =head1 DESCRIPTION
+#
+# An Email::Sender::Success object is just an indicator that an email message was
+# successfully sent. Unless extended, it has no properties of its own.
+#
+# =cut
no Moo;
1;
@@ -13,13 +17,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Success - the result of successfully sending mail
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -32,7 +38,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,15 @@
package Email::Sender::Transport::DevNull;
-{
- $Email::Sender::Transport::DevNull::VERSION = '1.300006';
-}
+# ABSTRACT: happily throw away your mail
+$Email::Sender::Transport::DevNull::VERSION = '1.300011';
use Moo;
with 'Email::Sender::Transport';
-# ABSTRACT: happily throw away your mail
+# =head1 DESCRIPTION
+#
+# This class implements L<Email::Sender::Transport>. Any mail sent through a
+# DevNull transport will be silently discarded.
+#
+# =cut
sub send_email { return $_[0]->success }
@@ -16,13 +20,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::DevNull - happily throw away your mail
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -35,7 +41,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,27 @@
package Email::Sender::Transport::Failable;
-{
- $Email::Sender::Transport::Failable::VERSION = '1.300006';
-}
+# ABSTRACT: a wrapper to makes things fail predictably
+$Email::Sender::Transport::Failable::VERSION = '1.300011';
use Moo;
-use MooX::Types::MooseLike::Base qw(ArrayRef);
extends 'Email::Sender::Transport::Wrapper';
-# ABSTRACT: a wrapper to makes things fail predictably
+use MooX::Types::MooseLike::Base qw(ArrayRef);
+
+# =head1 DESCRIPTION
+#
+# This transport extends L<Email::Sender::Transport::Wrapper>, meaning that it
+# must be created with a C<transport> attribute of another
+# Email::Sender::Transport. It will proxy all email sending to that transport,
+# but only after first deciding if it should fail.
+#
+# It does this by calling each coderef in its C<failure_conditions> attribute,
+# which must be an arrayref of code references. Each coderef will be called and
+# will be passed the Failable transport, the Email::Abstract object, the
+# envelope, and a reference to an array containing the rest of the arguments to
+# C<send>.
+#
+# If any coderef returns a true value, the value will be used to signal failure.
+#
+# =cut
has 'failure_conditions' => (
isa => ArrayRef,
@@ -38,13 +53,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::Failable - a wrapper to makes things fail predictably
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -67,7 +84,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,20 +1,39 @@
package Email::Sender::Transport::Maildir;
-{
- $Email::Sender::Transport::Maildir::VERSION = '1.300006';
-}
+# ABSTRACT: deliver mail to a maildir on disk
+$Email::Sender::Transport::Maildir::VERSION = '1.300011';
use Moo;
with 'Email::Sender::Transport';
-# ABSTRACT: deliver mail to a maildir on disk
use Errno ();
use Fcntl;
-use File::Path;
+use File::Path 2.06;
use File::Spec;
use Sys::Hostname;
use MooX::Types::MooseLike::Base qw(Bool);
+# =head1 DESCRIPTION
+#
+# This transport delivers into a maildir. The maildir's location may be given as
+# the F<dir> argument to the constructor, and defaults to F<Maildir> in the
+# current directory (at the time of transport initialization).
+#
+# If the directory does not exist, it will be created.
+#
+# By default, three headers will be added:
+#
+# * X-Email-Sender-From - the envelope sender
+# * X-Email-Sender-To - the envelope recipients (one header per rcpt)
+# * Lines - the number of lines in the body
+#
+# These can be controlled with the C<add_lines_header> and
+# C<add_envelope_headers> constructor arguments.
+#
+# The L<Email::Sender::Success> object returned on success has a C<filename>
+# method that returns the filename to which the message was delivered.
+#
+# =cut
{
package
@@ -80,7 +99,7 @@ sub _ensure_maildir_exists {
next if -d $subdir;
Email::Sender::Failure->throw("couldn't create $subdir: $!")
- unless File::Path::mkpath($subdir);
+ unless File::Path::make_path($subdir) || -d $subdir;
}
}
@@ -109,7 +128,9 @@ sub _deliver_email {
# if (eval { $email->can('stream_to') }) {
# eval { $mail->stream_to($fh); 1 } or return;
#} else {
- print $tmp_fh $email->as_string
+ my $string = $email->as_string;
+ $string =~ s/\x0D\x0A/\x0A/g unless $^O eq 'MSWin32';
+ print $tmp_fh $string
or Email::Sender::Failure->throw("could not write to $tmp_filename: $!");
close $tmp_fh
@@ -153,13 +174,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::Maildir - deliver mail to a maildir on disk
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -187,7 +210,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,8 @@
package Email::Sender::Transport::Mbox;
-{
- $Email::Sender::Transport::Mbox::VERSION = '1.300006';
-}
+# ABSTRACT: deliver mail to an mbox on disk
+$Email::Sender::Transport::Mbox::VERSION = '1.300011';
use Moo;
with 'Email::Sender::Transport';
-# ABSTRACT: deliver mail to an mbox on disk
use Carp;
use File::Path;
@@ -13,6 +11,15 @@ use IO::File;
use Email::Simple 1.998; # needed for ->header_obj
use Fcntl ':flock';
+# =head1 DESCRIPTION
+#
+# This transport delivers into an mbox. The mbox file may be given by the
+# F<filename> argument to the constructor, and defaults to F<mbox>.
+#
+# The transport I<currently> assumes that the mbox is in F<mboxo> format, but
+# this may change or be configurable in the future.
+#
+# =cut
has 'filename' => (is => 'ro', default => sub { 'mbox' }, required => 1);
@@ -111,13 +118,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::Mbox - deliver mail to an mbox on disk
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -133,7 +142,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,16 @@
package Email::Sender::Transport::Print;
-{
- $Email::Sender::Transport::Print::VERSION = '1.300006';
-}
+# ABSTRACT: print email to a filehandle (like stdout)
+$Email::Sender::Transport::Print::VERSION = '1.300011';
use Moo;
with 'Email::Sender::Transport';
-# ABSTRACT: print email to a filehandle (like stdout)
+# =head1 DESCRIPTION
+#
+# When this transport is handed mail, it prints it to a filehandle. By default,
+# it will print to STDOUT, but it can be given any L<IO::Handle> object to print
+# to as its C<fh> attribute.
+#
+# =cut
use IO::Handle;
use MooX::Types::MooseLike::Base qw(InstanceOf);
@@ -40,13 +45,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::Print - print email to a filehandle (like stdout)
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -60,7 +67,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,15 @@
package Email::Sender::Transport::SMTP::Persistent;
-{
- $Email::Sender::Transport::SMTP::Persistent::VERSION = '1.300006';
-}
+# ABSTRACT: an SMTP client that stays online
+$Email::Sender::Transport::SMTP::Persistent::VERSION = '1.300011';
use Moo;
extends 'Email::Sender::Transport::SMTP';
-# ABSTRACT: an SMTP client that stays online
+# =head1 DESCRIPTION
+#
+# The stock L<Email::Sender::Transport::SMTP> reconnects each time it sends a
+# message. This transport only reconnects when the existing connection fails.
+#
+# =cut
use Net::SMTP;
@@ -34,6 +38,14 @@ sub _smtp_client {
sub _message_complete { }
+# =method disconnect
+#
+# $transport->disconnect;
+#
+# This method sends an SMTP QUIT command and destroys the SMTP client, if on
+# exists and is connected.
+#
+# =cut
sub disconnect {
my ($self) = @_;
@@ -49,13 +61,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::SMTP::Persistent - an SMTP client that stays online
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -77,7 +91,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,15 +1,38 @@
package Email::Sender::Transport::SMTP;
-{
- $Email::Sender::Transport::SMTP::VERSION = '1.300006';
-}
-use Moo;
-use MooX::Types::MooseLike::Base qw(Bool Int Str);
# ABSTRACT: send email over SMTP
+$Email::Sender::Transport::SMTP::VERSION = '1.300011';
+use Moo;
use Email::Sender::Failure::Multi;
use Email::Sender::Success::Partial;
+use Email::Sender::Role::HasMessage ();
use Email::Sender::Util;
+use MooX::Types::MooseLike::Base qw(Bool Int Str);
+# =head1 DESCRIPTION
+#
+# This transport is used to send email over SMTP, either with or without secure
+# sockets (SSL). It is one of the most complex transports available, capable of
+# partial success.
+#
+# For a potentially more efficient version of this transport, see
+# L<Email::Sender::Transport::SMTP::Persistent>.
+#
+# =head1 ATTRIBUTES
+#
+# The following attributes may be passed to the constructor:
+#
+# =over 4
+#
+# =item C<host>: the name of the host to connect to; defaults to C<localhost>
+#
+# =item C<ssl>: if true, connect via SSL; defaults to false
+#
+# =item C<port>: port to connect to; defaults to 25 for non-SSL, 465 for SSL
+#
+# =item C<timeout>: maximum time in secs to wait for server; default is 120
+#
+# =cut
has host => (is => 'ro', isa => Str, default => sub { 'localhost' });
has ssl => (is => 'ro', isa => Bool, default => sub { 0 });
@@ -22,17 +45,39 @@ has port => (
has timeout => (is => 'ro', isa => Int, default => sub { 120 });
+# =item C<sasl_username>: the username to use for auth; optional
+#
+# =item C<sasl_password>: the password to use for auth; required if C<username> is provided
+#
+# =item C<allow_partial_success>: if true, will send data even if some recipients were rejected; defaults to false
+#
+# =cut
has sasl_username => (is => 'ro', isa => Str);
has sasl_password => (is => 'ro', isa => Str);
has allow_partial_success => (is => 'ro', isa => Bool, default => sub { 0 });
+# =item C<helo>: what to say when saying HELO; no default
+#
+# =item C<localaddr>: local address from which to connect
+#
+# =item C<localport>: local port from which to connect
+#
+# =cut
has helo => (is => 'ro', isa => Str);
has localaddr => (is => 'ro');
has localport => (is => 'ro', isa => Int);
+# =item C<debug>: if true, put the L<Net::SMTP> object in debug mode
+#
+# =back
+#
+# =cut
+
+has debug => (is => 'ro', isa => Bool, default => sub { 0 });
+
# I am basically -sure- that this is wrong, but sending hundreds of millions of
# messages has shown that it is right enough. I will try to make it textbook
# later. -- rjbs, 2008-12-05
@@ -85,6 +130,7 @@ sub _net_smtp_args {
$self->host,
Port => $self->port,
Timeout => $self->timeout,
+ Debug => $self->debug,
defined $self->helo ? (Hello => $self->helo) : (),
defined $self->localaddr ? (LocalAddr => $self->localaddr) : (),
defined $self->localport ? (LocalPort => $self->localport) : (),
@@ -107,7 +153,7 @@ sub send_email {
my $FAULT = sub { $self->_throw($_[0], $smtp); };
$smtp->mail(_quoteaddr($env->{from}))
- or $FAULT->("$env->{from} failed after MAIL FROM:");
+ or $FAULT->("$env->{from} failed after MAIL FROM");
my @failures;
my @ok_rcpts;
@@ -151,7 +197,15 @@ sub send_email {
# -- rjbs, 2008-12-04
$smtp->data or $FAULT->("error at DATA start");
- $smtp->datasend($email->as_string) or $FAULT->("error at during DATA");
+
+ my $msg_string = $email->as_string;
+ my $hunk_size = $self->_hunk_size;
+
+ while (length $msg_string) {
+ my $next_hunk = substr $msg_string, 0, $hunk_size, '';
+ $smtp->datasend($next_hunk) or $FAULT->("error at during DATA");
+ }
+
$smtp->dataend or $FAULT->("error at after DATA");
my $message = $smtp->message;
@@ -169,6 +223,8 @@ sub send_email {
});
}
+sub _hunk_size { 2**20 } # send messages to DATA in hunks of 1 mebibyte
+
sub success {
my $self = shift;
my $success = Moo::Role->create_class_with_roles('Email::Sender::Success', 'Email::Sender::Role::HasMessage')->new(@_);
@@ -181,6 +237,13 @@ sub partial_success {
sub _message_complete { $_[1]->quit; }
+# =head1 PARTIAL SUCCESS
+#
+# If C<allow_partial_success> was set when creating the transport, the transport
+# may return L<Email::Sender::Success::Partial> objects. Consult that module's
+# documentation.
+#
+# =cut
with 'Email::Sender::Transport';
no Moo;
@@ -190,13 +253,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::SMTP - send email over SMTP
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -233,6 +298,8 @@ The following attributes may be passed to the constructor:
=item C<localport>: local port from which to connect
+=item C<debug>: if true, put the L<Net::SMTP> object in debug mode
+
=back
=head1 PARTIAL SUCCESS
@@ -247,7 +314,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,23 @@
package Email::Sender::Transport::Sendmail;
-{
- $Email::Sender::Transport::Sendmail::VERSION = '1.300006';
-}
+# ABSTRACT: send mail via sendmail(1)
+$Email::Sender::Transport::Sendmail::VERSION = '1.300011';
use Moo;
-use MooX::Types::MooseLike::Base qw(Str);
with 'Email::Sender::Transport';
-# ABSTRACT: send mail via sendmail(1)
+use MooX::Types::MooseLike::Base qw(Str);
+
+# =head2 DESCRIPTION
+#
+# This transport sends mail by piping it to the F<sendmail> command. If the
+# location of the F<sendmail> command is not provided in the constructor (see
+# below) then the library will look for an executable file called F<sendmail> in
+# the path.
+#
+# To specify the location of sendmail:
+#
+# my $sender = Email::Sender::Transport::Sendmail->new({ sendmail => $path });
+#
+# =cut
use File::Spec ();
@@ -58,8 +69,8 @@ sub _sendmail_pipe {
my $prog = $self->sendmail;
my ($first, @args) = $^O eq 'MSWin32'
- ? qq(| "$prog" -f $envelope->{from} @{$envelope->{to}})
- : (q{|-}, $prog, '-f', $envelope->{from}, @{$envelope->{to}});
+ ? qq(| "$prog" -i -f $envelope->{from} @{$envelope->{to}})
+ : (q{|-}, $prog, '-i', '-f', $envelope->{from}, '--', @{$envelope->{to}});
no warnings 'exec'; ## no critic
my $pipe;
@@ -74,6 +85,9 @@ sub send_email {
my $pipe = $self->_sendmail_pipe($envelope);
+ my $string = $email->as_string;
+ $string =~ s/\x0D\x0A/\x0A/g unless $^O eq 'MSWin32';
+
print $pipe $email->as_string
or Email::Sender::Failure->throw("couldn't send message to sendmail: $!");
@@ -90,13 +104,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::Sendmail - send mail via sendmail(1)
=head1 VERSION
-version 1.300006
+version 1.300011
=head2 DESCRIPTION
@@ -115,7 +131,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,14 +1,60 @@
package Email::Sender::Transport::Test;
-{
- $Email::Sender::Transport::Test::VERSION = '1.300006';
-}
-use Moo;
-use MooX::Types::MooseLike::Base qw(ArrayRef Bool);
# ABSTRACT: deliver mail in memory for testing
+$Email::Sender::Transport::Test::VERSION = '1.300011';
+use Moo;
use Email::Sender::Failure::Multi;
use Email::Sender::Success::Partial;
+use MooX::Types::MooseLike::Base qw(ArrayRef Bool);
+# =head1 DESCRIPTION
+#
+# This transport is meant for testing email deliveries in memory. It will store
+# a record of any delivery made so that they can be inspected afterward.
+#
+# =for Pod::Coverage recipient_failure delivery_failure
+#
+# By default, the Test transport will not allow partial success and will always
+# succeed. It can be made to fail predictably, however, if it is extended and
+# its C<recipient_failure> or C<delivery_failure> methods are overridden. These
+# methods are called as follows:
+#
+# $self->delivery_failure($email, $envelope);
+#
+# $self->recipient_failure($to);
+#
+# If they return true, the sending will fail. If the transport was created with
+# a true C<allow_partial_success> attribute, recipient failures can cause partial
+# success to be returned.
+#
+# For more flexible failure modes, you can override more aggressively or can use
+# L<Email::Sender::Transport::Failable>.
+#
+# =attr deliveries
+#
+# =for Pod::Coverage clear_deliveries
+#
+# This attribute stores an arrayref of all the deliveries made via the transport.
+#
+# Each delivery is a hashref, in the following format:
+#
+# {
+# email => $email,
+# envelope => $envelope,
+# successes => \@ok_rcpts,
+# failures => \@failures,
+# }
+#
+# Both successful and failed deliveries are stored.
+#
+# A number of methods related to this attribute are provided:
+#
+# =for :list
+# * delivery_count
+# * clear_deliveries
+# * shift_deliveries
+#
+# =cut
has allow_partial_success => (is => 'ro', isa => Bool, default => sub { 0 });
@@ -87,13 +133,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::Test - deliver mail in memory for testing
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -161,7 +209,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,13 +1,18 @@
package Email::Sender::Transport::Wrapper;
-{
- $Email::Sender::Transport::Wrapper::VERSION = '1.300006';
-}
+# ABSTRACT: a mailer to wrap a mailer for mailing mail
+$Email::Sender::Transport::Wrapper::VERSION = '1.300011';
use Moo;
with 'Email::Sender::Transport';
-# ABSTRACT: a mailer to wrap a mailer for mailing mail
use Email::Sender::Util;
+# =head1 DESCRIPTION
+#
+# Email::Sender::Transport::Wrapper wraps a transport, provided as the
+# C<transport> argument to the constructor. It is provided as a simple way to
+# use method modifiers to create wrapping classes.
+#
+# =cut
has transport => (
is => 'ro',
@@ -55,13 +60,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport::Wrapper - a mailer to wrap a mailer for mailing mail
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -75,7 +82,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,10 +1,31 @@
package Email::Sender::Transport;
-{
- $Email::Sender::Transport::VERSION = '1.300006';
-}
-use Moo::Role;
# ABSTRACT: a role for email transports
+$Email::Sender::Transport::VERSION = '1.300011';
+use Moo::Role;
+# =head1 DESCRIPTION
+#
+# Email::Sender::Transport is a Moo role to aid in writing classes used to send
+# mail. For the most part, its behavior comes entirely from the role
+# L<Email::Sender::Role::CommonSending>, which it includes. The important
+# difference is that Transports are often intended to be used by
+# L<Email::Sender::Simple>, and they provide two methods related to that purpose.
+#
+# =for Pod::Coverage is_simple allow_partial_success
+#
+# First, they provide an C<allow_partial_success> method which returns true or
+# false to indicate whether the transport will ever signal partial success.
+#
+# Second, they provide an C<is_simple> method, which returns true if the
+# transport is suitable for use with Email::Sender::Simple. By default, this
+# method returns the inverse of C<allow_partial_success>.
+#
+# It is B<imperative> that these methods be accurate to prevent
+# Email::Sender::Simple users from sending partially successful transmissions.
+# Partial success is a complex case that almost all users will wish to avoid at
+# all times.
+#
+# =cut
with 'Email::Sender::Role::CommonSending';
@@ -23,13 +44,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Transport - a role for email transports
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 DESCRIPTION
@@ -59,7 +82,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,11 +1,8 @@
use strict;
use warnings;
package Email::Sender::Util;
-{
- $Email::Sender::Util::VERSION = '1.300006';
-}
# ABSTRACT: random stuff that makes Email::Sender go
-
+$Email::Sender::Util::VERSION = '1.300011';
use Email::Address;
use Email::Sender::Failure;
use Email::Sender::Failure::Permanent;
@@ -73,13 +70,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender::Util - random stuff that makes Email::Sender go
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 AUTHOR
@@ -87,7 +86,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,12 +1,57 @@
package Email::Sender;
-{
- $Email::Sender::VERSION = '1.300006';
-}
-use Moo::Role;
# ABSTRACT: a library for sending email
-
+$Email::Sender::VERSION = '1.300011';
+use Moo::Role;
requires 'send';
+# =head1 SYNOPSIS
+#
+# my $message = Email::MIME->create( ... );
+# # produce an Email::Abstract compatible message object,
+# # e.g. produced by Email::Simple, Email::MIME, Email::Stuff
+#
+# use Email::Sender::Simple qw(sendmail);
+# use Email::Sender::Transport::SMTP qw();
+# use Try::Tiny;
+#
+# try {
+# sendmail(
+# $message,
+# {
+# from => $SMTP_ENVELOPE_FROM_ADDRESS,
+# transport => Email::Sender::Transport::SMTP->new({
+# host => $SMTP_HOSTNAME,
+# port => $SMTP_PORT,
+# })
+# }
+# );
+# } catch {
+# warn "sending failed: $_";
+# };
+#
+# =head1 OVERVIEW
+#
+# Email::Sender replaces the old and sometimes problematic Email::Send library,
+# which did a decent job at handling very simple email sending tasks, but was not
+# suitable for serious use, for a variety of reasons.
+#
+# Most users will be able to use L<Email::Sender::Simple> to send mail. Users
+# with more specific needs should look at the available Email::Sender::Transport
+# classes.
+#
+# Documentation may be found in L<Email::Sender::Manual>, and new users should
+# start with L<Email::Sender::Manual::QuickStart>.
+#
+# =head1 IMPLEMENTING
+#
+# Email::Sender itself is a Moo role. Any class that implements Email::Sender
+# is required to provide a method called C<send>. This method should accept any
+# input that can be understood by L<Email::Abstract>, followed by a hashref
+# containing C<to> and C<from> arguments to be used as the envelope. The method
+# should return an L<Email::Sender::Success> object on success or throw an
+# L<Email::Sender::Failure> on failure.
+#
+# =cut
no Moo::Role;
1;
@@ -15,13 +60,15 @@ __END__
=pod
+=encoding UTF-8
+
=head1 NAME
Email::Sender - a library for sending email
=head1 VERSION
-version 1.300006
+version 1.300011
=head1 SYNOPSIS
@@ -63,7 +110,7 @@ start with L<Email::Sender::Manual::QuickStart>.
=head1 IMPLEMENTING
-Email::Sender itelf is a Moo role. Any class that implements Email::Sender
+Email::Sender itself is a Moo role. Any class that implements Email::Sender
is required to provide a method called C<send>. This method should accept any
input that can be understood by L<Email::Abstract>, followed by a hashref
containing C<to> and C<from> arguments to be used as the envelope. The method
@@ -76,7 +123,7 @@ Ricardo Signes <rjbs@cpan.org>
=head1 COPYRIGHT AND LICENSE
-This software is copyright (c) 2013 by Ricardo Signes.
+This software is copyright (c) 2014 by Ricardo Signes.
This is free software; you can redistribute it and/or modify it under
the same terms as the Perl 5 programming language system itself.
@@ -1,74 +0,0 @@
-#!perl
-
-use strict;
-use warnings;
-
-use Test::More;
-
-
-
-use File::Find;
-use File::Temp qw{ tempdir };
-
-my @modules;
-find(
- sub {
- return if $File::Find::name !~ /\.pm\z/;
- my $found = $File::Find::name;
- $found =~ s{^lib/}{};
- $found =~ s{[/\\]}{::}g;
- $found =~ s/\.pm$//;
- # nothing to skip
- push @modules, $found;
- },
- 'lib',
-);
-
-sub _find_scripts {
- my $dir = shift @_;
-
- my @found_scripts = ();
- find(
- sub {
- return unless -f;
- my $found = $File::Find::name;
- # nothing to skip
- open my $FH, '<', $_ or do {
- note( "Unable to open $found in ( $! ), skipping" );
- return;
- };
- my $shebang = <$FH>;
- return unless $shebang =~ /^#!.*?\bperl\b\s*$/;
- push @found_scripts, $found;
- },
- $dir,
- );
-
- return @found_scripts;
-}
-
-my @scripts;
-do { push @scripts, _find_scripts($_) if -d $_ }
- for qw{ bin script scripts };
-
-my $plan = scalar(@modules) + scalar(@scripts);
-$plan ? (plan tests => $plan) : (plan skip_all => "no tests to run");
-
-{
- # fake home for cpan-testers
- # no fake requested ## local $ENV{HOME} = tempdir( CLEANUP => 1 );
-
- like( qx{ $^X -Ilib -e "require $_; print '$_ ok'" }, qr/^\s*$_ ok/s, "$_ loaded ok" )
- for sort @modules;
-
- SKIP: {
- eval "use Test::Script 1.05; 1;";
- skip "Test::Script needed to test script compilation", scalar(@scripts) if $@;
- foreach my $file ( @scripts ) {
- my $script = $file;
- $script =~ s!.*/!!;
- script_compiles( $file, "$script script compiles" );
- }
- }
-
-}
@@ -9,7 +9,7 @@ our $success = 0;
END { $success && done_testing; }
# List our own version used to generate this
-my $v = "\nGenerated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.08\n";
+my $v = "\nGenerated by Dist::Zilla::Plugin::ReportVersions::Tiny v1.10\n";
eval { # no excuses!
# report our Perl details
@@ -51,32 +51,35 @@ sub pmver {
eval { $v .= pmver('Capture::Tiny','0.08') };
eval { $v .= pmver('Carp','any version') };
eval { $v .= pmver('Cwd','any version') };
-eval { $v .= pmver('Email::Abstract','3') };
+eval { $v .= pmver('Email::Abstract','3.006') };
eval { $v .= pmver('Email::Address','any version') };
eval { $v .= pmver('Email::Simple','1.998') };
+eval { $v .= pmver('Exporter','any version') };
eval { $v .= pmver('ExtUtils::MakeMaker','6.30') };
eval { $v .= pmver('Fcntl','any version') };
eval { $v .= pmver('File::Basename','any version') };
-eval { $v .= pmver('File::Find','any version') };
-eval { $v .= pmver('File::Path','any version') };
+eval { $v .= pmver('File::Path','2.06') };
eval { $v .= pmver('File::Spec','any version') };
eval { $v .= pmver('File::Temp','any version') };
-eval { $v .= pmver('FindBin','any version') };
+eval { $v .= pmver('IO::File','any version') };
+eval { $v .= pmver('IO::Handle','any version') };
eval { $v .= pmver('List::MoreUtils','any version') };
eval { $v .= pmver('Module::Runtime','any version') };
eval { $v .= pmver('Moo','1.000008') };
eval { $v .= pmver('Moo::Role','any version') };
eval { $v .= pmver('MooX::Types::MooseLike','0.15') };
+eval { $v .= pmver('MooX::Types::MooseLike::Base','any version') };
eval { $v .= pmver('Net::SMTP','any version') };
eval { $v .= pmver('Scalar::Util','any version') };
eval { $v .= pmver('Sub::Exporter','any version') };
-eval { $v .= pmver('Sub::Override','any version') };
+eval { $v .= pmver('Sub::Exporter::Util','any version') };
eval { $v .= pmver('Sys::Hostname','any version') };
eval { $v .= pmver('Test::More','0.96') };
-eval { $v .= pmver('Test::Pod','1.41') };
eval { $v .= pmver('Throwable::Error','0.200003') };
eval { $v .= pmver('Try::Tiny','any version') };
-eval { $v .= pmver('version','0.9901') };
+eval { $v .= pmver('lib','any version') };
+eval { $v .= pmver('strict','any version') };
+eval { $v .= pmver('warnings','any version') };
# All done.
@@ -64,6 +64,7 @@ sub perform_stock_mockery {
$mock_smtp->{datafail} = '';
for my $part (qw(data datasend dataend)) {
$mock_smtp->mock($part => sub {
+ # main::diag(">> $_[1] <<") if $part eq 'datasend';
return $_[0]->fail(300 => 'NFI') if $_[0]->{datafail} eq $part;
return $_[0]->succ;
});
@@ -46,7 +46,5 @@ my $result = $xport->send(
},
);
-use Data::Dumper;
-
isa_ok($result, 'Email::Sender::Success');
is($xport->fh->{str}, $want, 'what we expected got printed');
@@ -4,7 +4,7 @@ use Test::More tests => 2;
note 'Checking Changes';
my $changes_file = 'Changes';
-my $newver = '1.300006';
+my $newver = '1.300011';
my $trial_token = '-TRIAL';
SKIP: {
@@ -1,7 +1,6 @@
#!perl
+# This file was automatically generated by Dist::Zilla::Plugin::PodSyntaxTests.
use Test::More;
-
-eval "use Test::Pod 1.41";
-plan skip_all => "Test::Pod 1.41 required for testing POD" if $@;
+use Test::Pod 1.41;
all_pod_files_ok();