免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 16599 | 回复: 13
打印 上一主题 下一主题

如何用perl发送中文HTML邮件 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-11 17:42 |只看该作者 |倒序浏览
很多同学不知如何用perl构造中文HTML邮件,或者构造的邮件不规范,被各个ESP当作垃圾邮件干掉。
仙子演示一下这个代码,帮助大家发信,也减少互联网上的不规范邮件。
  1. use MIME::Lite;
  2. use MIME::Words qw(encode_mimewords);

  3. sub send_email {

  4.     my $self = shift;
  5.     my $to_address = shift;

  6.     my $subject = encode_mimewords("这里是中文标题",'Charset','GB2312');
  7.     my $data =<<EOF;
  8. <body>
  9. <p>这里是中文HTML内容。</p>
  10. </body>
  11. EOF

  12.     my $msg = MIME::Lite->new (
  13.         From => 'you@example.com',
  14.         To => $to_address,
  15.         Subject => $subject,
  16.         Type     => 'text/html',
  17.         Data     => $data,
  18.         Encoding => 'base64',
  19.     ) or die "create container failed: $!";

  20.     $msg->attr('content-type.charset' => 'GB2312');
  21.     $msg->send('smtp','localhost',Debug=>0);
  22. }
复制代码
几个常识点:

1. 标题必须用MIME::Words编码,很多人忽略了这点。
2. MIME::Lite构造信件时,Type不要搞错。例如只是一封HTML邮件,没有附件之类,Type就是text/html。
21CN的webmail发信不管有没有附件,Type都是multipart/mixed,结果被Gmail直接扔进垃圾箱。
3. 信件要选择传输编码(Encoding),常用的是base64和quoted-printable,我推荐base64。
4. 信件body的content-type charset要设置正确,例如中文GB2312。
5. 最后一句$msg->send('smtp','localhost',Debug=>0)调用Net::SMTP发信,本机安装了MTA例如Postfix就可以。
这个发信IP最好是信誉比较好的IP,没有列入sorbs、spamcop、spamhaus等RBL列表里。
6. 发信IP最好有反向解析(PTR),否则肯定发不到AOL之类的验证反解的邮箱。
7. 那个From地址也最好真实存在,但是不要用知名网站的免费邮箱,例如From => 'abc@126.com',那么基本发不出去。
为什么?因为126.com设置了SPF,接收方MTA多半会验证这个SPF,你的IP当然不在126的SPF里,所以通不过验证。
8. $data变量包含的是信件body的HTML编码,这个body里不要有很多链接、图片之类,否则容易被Spamassassin之类的反垃圾软件干掉。
9. 最后,控制发送频率,大量的发送会引起各个反垃圾系统的警惕,并将你列入黑名单。

论坛徽章:
0
2 [报告]
发表于 2011-02-11 17:47 |只看该作者
哦 上述代码我是用在一个package里的实例方法。
如果是普通函数调用,就把my $self = shift;去掉。

论坛徽章:
0
3 [报告]
发表于 2011-02-11 18:21 |只看该作者
沙发

论坛徽章:
1
未羊
日期:2014-09-08 22:47:27
4 [报告]
发表于 2011-02-12 08:38 |只看该作者
好帖子,可以设精。

论坛徽章:
0
5 [报告]
发表于 2011-02-12 10:40 |只看该作者
呵呵 谢谢flw鼓励~~~

再补充一下:
my $msg = MIME::Lite->new (
         From => 'you@example.com',


这个From其实可以是任何地址,因为它只是出现在信头里的一个地址而已。
如果Net::SMTP没有指定sender地址(sender是真正的mail from:地址,也就是接收方MTA看到的发件人),那么MIME::Lite会使用构造器里的From地址作为sender。
如果在Net::SMTP里设置了正确的sender地址(例如你的企业域邮箱),那么From是任何字串都无所谓,甚至空也可以。

btw: 有些MTA会检查sender地址与信头地址是否一致来判断是否Junk,这无疑是愚蠢的。多数邮件转发的mail from与信头地址都不一致。

论坛徽章:
0
6 [报告]
发表于 2011-02-13 13:28 |只看该作者
谢谢仙子,这个版的两位版主,真是太好了。

论坛徽章:
0
7 [报告]
发表于 2011-02-13 21:25 |只看该作者
学习了

论坛徽章:
0
8 [报告]
发表于 2011-04-03 19:52 |只看该作者
不得不回一下,MIME-Lite 强劲的。
能想到的都有。
多谢仙子。

论坛徽章:
3
技术图书徽章
日期:2013-12-14 13:31:0615-16赛季CBA联赛之八一
日期:2016-03-10 18:23:4615-16赛季CBA联赛之青岛
日期:2016-03-19 11:36:04
9 [报告]
发表于 2011-10-14 09:17 |只看该作者
出错是什么原因?是什么东西没有设置吗?

SMTP Failed to connect to mail server: 由于连接方在一段时间后没有正确
答复或连接的主机没有反应,连接尝试失败。
at MIME_Lite.pl line 26

论坛徽章:
0
10 [报告]
发表于 2011-10-14 10:33 |只看该作者
perl 新人,看来perl 真是博大呀。啥都能做
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP