2009年02月19日

最新版はgithubにありますのでそちらをどうぞ。(モジュール名かわってますが。。。)

を見ながらEmail::Send::Gmailを使ってGmailからメール送信しようとしてみたけど、なんかようわからなかった。

  • CCが送れない
  • Bccが送れない
  • 添付ファイルがめんどくさい
  • 添付ファイル送れたと思ったら壊れてた

下記みたいなコードを書いてみたけどCC入れると「Error sending email: Email::Send::Gmail: no valid recipients」とか。

CC入れなかったり、添付ファイル送らなかった場合はちゃんといける。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Encode;
use Email::Send;
use Email::Send::Gmail;
use Email::MIME;
use Email::MIME::Creator;
use File::Slurp qw/slurp/;

my $jis = find_encoding 'ISO-2022-JP';

my $from = 'from@gmail.com';
my $to   = 'to@example.com',
my $cc   = 'cc@example.com';

my $email = Email::MIME->create(
    header => [
        From    => $from,
        To      => $to,
        CC      => $cc, # これ入れるとエラー
        Subject => encode('MIME-Header-ISO_2022_JP', 'PerlからGmailでメール送信'),
    ],
    
    parts => [
        $jis->encode('元気でやってるかー?'),
        # 悲しいことにちゃんと送れない添付ファイル
        Email::MIME->create(
            attributes => {
                filename     => '../temp.jpg',
                content_type => 'application/octet-stream',
                encoding     => 'Base64',
                name         => $jis->encode('ちょっとえろい.jpg'),
            },
            body => slurp('../temp.jpg'),
        ),
    ],
);

my $sender = Email::Send->new({
    mailer      => 'Gmail',
    mailer_args => [
        username => $from,
        password => 'password',
    ],
});

eval { $sender->send($email) };
die "Error sending email: $@" if $@;
          ____
        /      \
       /  ─    ─\
     /    ⌒  ⌒  \     ハハッ 使い方わからん
     |       ,ノ(、_, )ヽ    |
      \      トェェェイ   /   
       /   _ ヽニソ,  く 

バカだから簡単に使えそうなモジュール書く

Net::SMTP::SSLとMIME::Entityでしこしこ書いた結果、なんかできた。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Encode;
use Email::Gmail::Send;

my $jis = find_encoding 'ISO-2022-JP';

my $username = 'from@gmail.com';

my $gmail = Email::Gmail::Send->new(
    username => $username,
    password => 'XXXXXX',
#    Debug    => 1,
);

$gmail->send(
    From     => $username,
    TO       => 'to@example.com',
    CC       => ['cc@example.com', 'cc2@example.com'],
    BCC      => ['bcc@example.com', 'bcc2@example.com'],
    Subject  => encode('MIME-Header-ISO_2022_JP', 'Gmailで添付ファイル送信テスト'),
    Body     => $jis->encode('ちゃんと添付ファイルが送れるかな・・・?' ),
    Parts    => [
        { Path => '../temp.csv', Name => $jis->encode('しょぼい.csv') },
        { Path => '../temp.jpg' },
    ],
) or die $gmail->errstr;

とりあえずガシガシ羅列していく感じ。

  • モジュール名がひどい
  • TO、CC、BCCに複数のアドレス指定できる
  • Partsのところに添付ファイルを書く
  • ファイル名を省略したら中でbasenameするだけ
  • つまり日本語扱うなら明示的にencodeして指定
  • モジュール名がひどい

一つ注意点があって、Net::SMTPの中でAuthen::SASLをevalして呼んでて、なんか読み込めなくてもエラー吐かずに死にます。
Authen::SASLがインストールされてれば平気。

続きにModule置いときます。(ていうの早く辞めたいのでCodeReposかGitHubしる)

Email::Gmail::Send

たぶんもっといいモジュールいっぱいある

package Email::Gmail::Send;
 
use strict;
use warnings;
use utf8;
use Carp qw/croak/;
use Net::SMTP::SSL;
use MIME::Entity;
use Email::Date::Format;
use File::Basename qw/basename/;
 
our $VERSION = '0.01';
 
sub new {
    my $class = shift;
    my $die_msg = "Usage: $class->new(username => \$username, password => \$password)";
    my %args = @_;
    
    croak $die_msg unless $args{username};
    croak $die_msg unless $args{password};
    
    bless {%args}, $class;
}
 
sub send {
    my $self = shift;
    my $die_msg = "Usage: $self->send(From => \$from, TO => \$to, Subject => \$subject, Body => \$body)";
    my %args = @_;
    
    croak $die_msg unless $args{From};
    croak $die_msg unless $args{TO};
    croak $die_msg unless $args{Subject};
    croak $die_msg unless $args{Body};
    
    $args{Data} = $args{Body};
    delete $args{Body};
    
    my $mime = MIME::Entity->build(
        Date     => Email::Date::Format::email_date,
        Type     => 'text/plain; charset="ISO-2022-JP"',
        Encoding => '7bit',
        %args,
    );
    
    if ($args{Parts}) {
        for my $hash (@{$args{Parts}}) {
            croak "Usage: $self->send(Parts => [ {Path => \$file_path, Name => \$file_name}, { ... } ])" unless $hash->{Path};
            $mime->attach(
                Path     => $hash->{Path},
                Filename => $hash->{Name} || basename($hash->{Path}),
                Type     => 'application/octet-stream',
                Encoding => 'Base64',
            )
        }
    }
    
    my $smtp = Net::SMTP::SSL->new(
        'smtp.gmail.com',
        Port    => 465,
        Debug   => $self->{Debug}   || 0,
        Timeout => $self->{Timeout} || 15,
    ) or die "Net::SMTP::SSL->new failed!!";
    
    if ($smtp->auth($self->{username}, $self->{password})) {
        $smtp->mail($args{FROM});
        $smtp->to(&_deref($args{TO}));
        $smtp->cc(&_deref($args{CC})) if $args{CC};
        $smtp->bcc(&_deref($args{BCC})) if $args{BCC};
        $smtp->data();
        
        $smtp->datasend($mime->stringify);
        $smtp->dataend;
        $smtp->quit;
    }
    
    else {
        $self->{error} = "send e-mail failure ($args{TO})";
        return 0;
    }
    
    return 1;
}
 
sub errstr {
    return shift->{error};
}
 
sub _deref {
    my $arg = shift;
    return ref $arg eq 'ARRAY' ? @{$arg} : $arg;
}
 
1;
__END__

=head1 NAME

Email::Gmail::Send - Very simple Gmail sending interface.

=head1 SYNOPSIS

  use Email::Gmail::Send;
  
  my $gmail = Email::Gmail::Send->new(
      username => 'username',
      password => 'password',
  );
  
  $gmail->send(
      From     => $from,
      TO       => $to,
      CC       => [$cc, $cc2],
      BCC      => [$bcc, $bcc2],
      Subject  => 'hello gmail',
      Body     => 'agyagyagyagya',
      Parts    => [
          { Path => '/home/hoge/erogazo/HENTAI.jpg', Name => 'Abnormal.jpg'  },
          { Path => '/home/fuga/HENTAI.jpg' },
      ],
  ) or die $gmail->errstr;
  

=head1 DESCRIPTION

Email::Gmail::Send is Very simple Gmail sending interface.

You can also send attachments in multipart.
Of course, TO CC and BCC can also specify more than one.

=head2 Methods

=over

=item new

Constructor

=item send

send

=item errstr

return error message

=back

=head1 AUTHOR

Yuji Shimada E<lt>xaicron {at} gmail.comE<gt>

=head1 SEE ALSO

L<MIME::Entity>
L<Net::SMTP::SSL>
L<Authen::SASL>

=head1 LICENSE

This library is free software; you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut

PODの書き方よくわからず

トラックバックURL

コメント一覧

1. Posted by kata cinta   2013年12月21日 03:26

この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう!
2. Posted by oke seo   2014年02月22日 04:07
これは良いニュースですが、私は読んでいる
3. Posted by diakui   2014年02月26日 08:04
このウェブサイトの私の忠実な読者と再び会うおはようございます!
4. Posted by kata kata cinta   2014年03月07日 19:56
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです。
5. Posted by kata kata bijak   2014年03月07日 19:57
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです。
6. Posted by cara menghilangkan jerawat   2014年03月09日 22:23
本当に良い品は、私がこのブログであることが幸せです。
7. Posted by kata kata galau   2014年03月25日 18:17
このブログに興味深い記事が、私はこのブログであることがとてもうれしいです。
8. Posted by dp bbm bergerak   2014年03月25日 18:18
私はこのブログの記事を読みましたし、私の知識は非常に有用であり、私はこのブログが大好きです。
9. Posted by kata kata romantis   2014年04月02日 05:44
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
10. Posted by kata kata cinta   2014年04月21日 22:05
本当に良い品は、私がこのブログであることが幸せです。
11. Posted by Cerita Lucu   2014年04月24日 15:14
このウェブサイトの私の忠実な読者と再び会うおはようございます!
12. Posted by tempat wisata di bandung   2014年05月08日 02:13
これは実際に読むことは非常に興味深い記事です!
更新された場合に、より良く、より面白いかもしれ
13. Posted by kata kata motivasi   2014年05月09日 22:24
この記事は非常に良いですが、それでは書き続けるし、うまくいけば、このブログが成功になりましょう
14. Posted by kata kata galau   2014年05月09日 22:25
これは良いニュースですが、私は読んでいる
15. Posted by status fb   2014年05月09日 22:28
私はかなり理解していないが、このブログは非常にシンプルで興味深い情報ですが。ありがとう
16. Posted by blog remaja indonesia   2014年05月11日 04:41
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
17. Posted by operatorku   2014年05月12日 19:01
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです
18. Posted by kata kata indah   2014年05月31日 16:56
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです。
19. Posted by cara menghilangkan jerawat   2014年06月03日 07:52
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
20. Posted by kata kata lucu   2014年06月03日 07:55
これは良いニュースですが、私は読んでいる
21. Posted by dunia remaja   2014年06月04日 08:53
非常に記事ここに有用な情報をたくさん見つける幸いです
22. Posted by kata kata cinta   2014年06月04日 20:13
これは良いニュースですが、私は読んでいる
23. Posted by pembaca   2014年06月10日 19:26
私はこのブログの記事を読みましたし、私の知識は非常に有用であり、私はこのブログが大好きです。
24. Posted by kata kata cinta romantis   2014年06月11日 02:19
非常に素晴らしいのニュース、インドネシアの国民の成功を読み、挨拶、私たちへの書き込みをありがとうございました
25. Posted by kata kata mutiara   2014年06月16日 05:27
ありがとうございます、あなたの文章が読み、非常に良いと面白いです
26. Posted by kata kata bijak   2014年06月16日 10:22
このブログに興味深い記事が、私はこのブログであることがとてもうれしいです。
27. Posted by saatnya   2014年06月17日 10:53
観察する良いニュースと面白い!
28. Posted by kata kata cinta   2014年06月19日 07:50
非常に興味深い記事、私はこの記事を投稿してくれてありがとう、私は最新の記事を待っています、それを読むことは非常に満足しています。
29. Posted by kata kata galau   2014年06月26日 16:19
私はあなたが提示情報を愛するの上、上記の情報を共有していただきありがとうございます
30. Posted by dunia remaja   2014年07月08日 20:38
本当に良い品は、私がこのブログであることが幸せです。
31. Posted by resep kue   2014年07月14日 02:46
素晴らしい記事、ありがとうございました
32. Posted by kumpulan kata kata cinta romantis buat pacar   2014年07月19日 16:06
このブログは非常に興味深いですが、私はこのブログを訪問するのは非常に満足しています
33. Posted by jasa fotocopy murah   2014年09月05日 15:25
読み素敵で面白いの書き込み、ありがとうございました
34. Posted by hadirkanlah   2014年09月14日 23:08
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです。
35. Posted by kata kata galau   2014年09月20日 13:50
これは良いニュースですが、私は読んでいる
36. Posted by kata kata gombal   2014年09月24日 09:27
読み素敵で面白いの書き込み、ありがとうございました
37. Posted by jasa fotocopy murah   2014年09月25日 18:55
書き込みは、注意することは興味深い
38. Posted by tempat fotocopy dan percetakan murah di jakarta   2014年09月26日 22:09
注意することは興味深く、良いニュースは、ありがとう
39. Posted by kata kata galau   2014年10月03日 17:05
このブログに興味深い記事が、私はこのブログであることがとてもうれしいです。
40. Posted by uda rino   2014年10月24日 03:08
ジャカルタの安いコピーや印刷の専門家
41. Posted by kata kata galau   2014年10月25日 02:40
本当に良い品は、私がこのブログであることが幸せです。
42. Posted by kata kata bijak   2014年10月30日 21:15
賢明に言葉は美しい言葉です
43. Posted by kata kata galau sedih   2014年11月01日 03:53
観察する良いニュースと面白い!
44. Posted by kata kata cinta   2014年11月12日 02:03
I’ve visited many blogs,forums, but this time:How your fantastic forum is . It makes me surprise….
45. Posted by dp bbm lucu   2014年11月27日 01:10
うとしてみたけど、なんかようわからなかった。
46. Posted by kata kata galau   2014年12月08日 05:05
素晴らしい記事、ありがとうございました
47. Posted by fotocopy murah jakarta   2014年12月09日 20:24
良いコンテンツに従うことは非常に簡単。私たちは、このポストを手に取る読んで概説ポイントを実装する必要があります。
48. Posted by hadirkanlah   2014年12月12日 22:24
このブログに興味深い記事が、私はこのブログ
49. Posted by kata kata galau   2014年12月13日 08:27
読み素敵で面白いの書き込み、ありがとうございまし
50. Posted by 修学旅行水着   2015年01月12日 00:31
10616h、2Cで書か書今) 栗h、2Cで書か書
51. Posted by batu akik   2015年01月31日 15:37
私は本当にあなたのよく書かれた記事を読んで楽しんだ。あなたのブログに努力と多くの時間を過ごすように見えます。
52. Posted by KATA KATA TERLENGKAP   2015年03月31日 23:26
このブログに興味深い記事が、私はこのブログであることがとてもうれしいです。
53. Posted by Kata Kata Cinta   2015年04月28日 12:51
私たちは、このポストを得るために取る読んで概説ポイントを実装する必要があります。
54. Posted by プール 水着   2015年05月27日 15:03
で分オゥ全仏オ
55. Posted by Cetak kartu ucapan murah   2015年06月05日 02:46
このブログに興味深い記事が、私はこのブログであることがとてもうれしいです。
56. Posted by Jasa Cetak Stempel Warna (Mark Stamp) Murah di Rawamangun Jakarta   2015年06月05日 02:47
私は本当にあなたのよく書かれた記事を読んで楽しんだ。あなたのブログに努力と多くの時間を過ごすように見えます。
それでは書き続けるし、うまくいけば、このブログが成功になりましょう...
58. Posted by kata kata sakit hati   2015年08月06日 21:44
これは、シャープでクリアな非常インフォマティクス、です。私は読者が最大の情報を得ることができるようにすべてが体系的に説明してきたと思います。
59. Posted by Percetakan Online   2015年11月12日 01:42
それでは書き続けるし、うまくいけば、このブログが成功になりましょう...
60. Posted by cetak yasin online   2015年12月29日 16:49
これは、シャープでクリアな非常インフォマティクス、です。私は読者が最大の情報を得ることができるようにすべてが体系的に説明してきたと思います。
61. Posted by Style Masa Kini   2016年01月23日 22:16
このウェブサイトの私の忠実な読者と再び会うおはようございます!
62. Posted by Kata kata mutiara cinta   2016年01月26日 06:15
これは実際に読むことは非常に興味深い記事です!
更新された場合に、より良く、より面白いかもしれ
63. Posted by Kata Kata Remaja   2016年03月06日 23:25
私はあなたのブログ、非常に良い記事と非常に便利であることがとてもうれしいです
64. Posted by Jasa Percetakan dan Jasa Fotocopy Murah 24 Jam Rawamangun Jakarta   2016年03月31日 01:09
これは、シャープでクリアな非常インフォマティクス、です。私は読者が最大の情報を得ることができるようにすべてが体系的に説明してきたと思います。
65. Posted by Kata Kata Remaja   2016年04月11日 00:24
私はかなり理解していないが、このブログは非常にシンプルで興味深い情報ですが。ありがとう
66. Posted by Kata Kata Remaja   2016年05月10日 01:34
これは、シャープでクリアな非常インフォマティクス、です。私は読者が最大の情報を得ることができるようにすべてが体系的に説明してきたと思います
67. Posted by Kata Kata Remaja   2016年06月08日 06:32
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!
68. Posted by Jasa Percetakan dan Jasa Fotocopy Murah 24 Jam Rawamangun Jakarta   2016年06月21日 06:10
これは、シャープでクリアな非常インフォマティクス、です。私は読者が最大の情報を得ることができるようにすべてが体系的に説明してきたと思います
69. Posted by Kata Kata Remaja   2016年07月29日 13:56
私はかなり理解していないが、このブログは非常にシンプルで興味深い情報ですが。ありがとう
70. Posted by Kata Kata Mutiara   2016年08月03日 02:44
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!
71. Posted by Kata Kata Cinta   2016年08月13日 19:36
私は本当にあなたのよく書かれた記事を読んで楽しんだ。あなたのブログに努力と多くの時間を過ごすように見えます。
72. Posted by Kata Kata Galau   2016年10月01日 19:39
これは、シャープでクリアな非常インフォマティクス、です。私は読者が最大の情報を得ることができるようにすべてが体系的に説明してきたと思います。
73. Posted by Percetakan dan Fotocopy Murah Di Rawamangun   2016年10月11日 02:21
これは、シャープでクリアな非常インフォマティクス、です。私は読者が最大の情報を得ることができるようにすべてが体系的に説明してきたと思います
74. Posted by Kata Kata Bijak   2016年10月12日 18:46
共有のおかげで、この素晴らしい記事、うまくいけば、この口コミは役に立ちました、私たちのすべてのために有用であり得ます!!!!
75. Posted by Blog Remaja Indonesia   2016年10月20日 01:01
私は本当にあなたのよく書かれた記事を読んで楽しんだ。あなたのブログに努力と多くの時間を過ごすように見えます。
76. Posted by Materi Pelajaran   2017年02月10日 17:17
私はそれを知っています。 あなたがそれらの貴重な情報を共有していないなら、私はそれを知らないでしょう。 皆ありがとう。 より多くの情報を共有する。 そのような良い仕事!
77. Posted by Flora Fauna   2017年02月23日 14:22
私はこのウェブサイトを探検しています。 そして、私はあなたがそのような驚くべき作品をその中にどのように置いているのか驚いた 共有し続ける。 共有は思いやりがあるので。
78. Posted by Mata Pelajaran   2017年03月14日 15:09

共有していただきありがとうございます。 もっと共有する。 共有は思いやりです。
79. Posted by Tebak Tebakan Lucu   2017年04月20日 10:44
このウェブサイトでいくつかの記事を読んだ後。 私はこのウェブサイトを信頼性の高い参考文献の1つにしたいと考えています。 あなたはこのウェブサイトで素晴らしい仕事をしました。

コメントする

名前:
URL:
  情報を記憶: 評価:  顔   星
  絵文字
 
 
プロフィール

Perlが少しだけ出来る気になってます。
JavaScriptはよくわかりません。
Rubyもちんぷんかんぷんです。
Pythonは難しいです。
ActionScript勘弁してください。
Javaあばばばばば。
低級言語できません。

github
記事検索
  • ライブドアブログ