sendmail使用:在Perl中使用SendMail发送邮件




  搞web开发同志可能碰到过需要在页面里嵌入发送邮件功能如果是普通纯文本邮件还好没问题用asp有好多组件用cgi也有好工具比如perl在perl中使用unix平台下sendmail可以实现这个目Perl中发送纯文本邮件典型例子如下:
  
  #!/usr/lib/perl
  use strict;
  
  my($r_mail) = '[email protected]';
  my($s_mail) = '[email protected]';
  my($subject) = 'subject';
  
  open(MAIL,'|/usr/lib/sendmail -t');
  select(MAIL);
  
  pr<<"END_TAG";
  To: $r_mail
  From: $s_mail
  Subject: $subject
  
  邮件内容
  
  END_TAG
  
  有几点要注意在发送邮件里To, From和接受者邮件地址变量$r_mail以及发送者邮件$s_mail的间要留个空格避免不必要报错问题(我遇到过不知道你有没有碰到)还有那个结束标记END_TAG如果是文件最后最好在后面加两个空行我曾经碰到没后面空行perl找不到END_TAG情况还有不要忘了subject的后那个空行是必须它分开了邮件头和邮件内容
  
  好进入正题如果我们需要发送html格式邮件呢?如果写成这样
  
  #!/usr/lib/perl
  use strict;
  
  my($r_mail) = '[email protected]';
  my($s_mail) = '[email protected]';
  my($subject) = 'subject';
  
  open(MAIL,'|/usr/lib/sendmail -t');
  select(MAIL);
  
  pr<<"END_TAG";
  To: $r_mail
  From: $s_mail
  Subject: $subject
  
  <html><body><a href=#>邮件内容</a></body></html>
  
  END_TAG
  
  试试看在263里源代码全显示出来了在hotmail中好点如果邮件是个完整html邮件基本上能够完整呈现html页面其实这里头有个MIME类型问题详细MIME资料大家自己上网找吧否则扯得太远我这点水不够倒如果这个html邮件没有连接任何图片以及此类外部内容那好办在邮件头部分加句Content-type:text/html就可以了如果使用了中文需要指定下代码页直接在后面在添上char="gb2312",中间用分号格开完整代码如下:
  
  #!/usr/lib/perl
  use strict;
  
  my($r_mail) = '[email protected]';
  my($s_mail) = '[email protected]';
  my($subject) = 'subject';
  
  open(MAIL,'|/usr/lib/sendmail -t');
  select(MAIL);
  
  pr<<"END_TAG";
  To: $r_mail
  From: $s_mail
  Subject: $subject
  Content-type:text/html;char="gb2312"
  
  <html><body><a href=#>邮件内容</a></body></html>
  
  END_TAG
  
  这样般使用接收邮件工具都能看到html格式邮件了如果问题再复杂这个html页面里有图还有flash那如何办?会有办法:把这些图片放在网上页面图片都写全路径链接这样就根本不需要在邮件里真带上这些累赘了并且还减小了邮件大小举两得!我严重赞同但是总有碰到不能这样干时候所以继续html页面对这些图链接并不能够让用户收到邮件里有这些图和flash文件看到html页面是开了天窗页面看看MIME类型有个multipart/mixed类型能够完成我们最终目让用户收到邮件是图文并举完整页面首先需要按编码思路方法对图片或者flash等文件编码电子邮件中最常用是base64编码还有quoted-prable编码找个工具把图片等需要链入hmtl邮件文件使用base64编码对html邮件则使用quoted-prable编码然后在邮件头写Content-Type: multipart/mixed;boundary="----=_NextPart_000_0008_01C2BCB0.9CF9AE70" name="thanks.g"这里multipart/mixed表示本邮件是混合类型邮件接下来boundary是指定分隔邮件内容里各区别各部分标记是什么这里就是----=_NextPart_000_0008_01C2BCB0.9CF9AE70了这个值必须要怎样我不是很清楚理解是在本邮件中能够不和任何编码后某段内容相同就可以了后面那个name可以不要说起来比较罗索还是先看代码吧
  
  下面就是个完整发送hmtl邮件例子
  
  #!/usr/lib/perl
  use strict;
  
  my($r_mail) = '[email protected]';
  my($s_mail) = '[email protected]';
  my($subject) = 'subject';
  
  open(MAIL,'|/usr/lib/sendmail -t');
  select(MAIL);
  
  pr<<"END_TAG";
  To: $r_mail
  From: $s_mail
  Subject: $subject
  Content-Type: multipart/mixed;boundary="----=_NextPart_000_0008_01C2BCB0.9CF9AE70"
  
  This is a multi-part message in MIME format.
  
  ------=_NextPart_000_0008_01C2BCB0.9CF9AE70
  Content-Type: text/html;char="gb2312"
  Content-Transfer-Encoding: quoted-prable
  
  <HTML><HEAD><TITLE>=D0=BB=D0=BB=C4=FA=B5=C4=B2=CE=D3=EB=A3=A1</TITLE>
  <META http-equiv=3DContent-Type content=3D"text/html; char=3Dgb2312">
  <META content=3D"MSHTML 6.00.2800.1126" name=3DGENERATOR></HEAD>
  <BODY text=3D#000000 bgColor=3D#ffffff leftMargin=3D0 topMargin=3D0><IMG =
  height=3D400=20
  src=3D"file:///C:/DEV/perl/images/popup_thanks.g" =
  width=3D400=20
  border=3D0></BODY></HTML>
  
  ------=_NextPart_000_0008_01C2BCB0.9CF9AE70
  Content-Type: image/g
  Content-Transfer-Encoding: base64
  Content-Disposition: attachment;filename="thanks.g"
  Content-Location: file:///C:/DEV/perl/images/popup_thanks.g
  
  R0lGODlhkAGQAfcAAPCyTdvr0cvbCJ8tTt3nAEeRGarPkRSmULrVqrRtLtbeB7CRNdTZ0LGtNaXJ
  EaLR7ejz23e1GFir2NNMayaR0VWaLfjMRtnINsfWuYi6aGWsNevKN5PHdLZKMyZLC6smNs3nu8mI
  NWetGBIqCOqXNdutkWyRRzZvEqvIK9fJSZGMNrSxSlalGO/36rS5revt6MySScswSperNZWtT9C3
  
  ------=_NextPart_000_0008_01C2BCB0.9CF9AE70--
  
  END_TAG
  
  有点长了慢慢解释吧这封要发送hmtl邮件里只有张图片popup_thanks.g. 里面有句话"This is a multi-part message in MIME format.", 放在第个boundary出现的前这是个描述信息不用管它然后就是第个boundary:------=_NextPart_000_0008_01C2BCB0.9CF9AE70,它告诉用户邮件这里有部份内容注意这里是--boundary,就是说在boundary前面加了两个-,大家还请注意看最后个boundary,它前后都加了两个-表示整个邮件结束
  
  Content-type:text/html;char="gb2312" 介绍说明本部分内容文档类型是html格式Content-Transfer-Encoding: quoted-prable 介绍说明本部分内容使用 quoted-prable 思路方法编码当然下面内容要确实是 quoted-prable 编码否则用户就看不到正确内容了
  
  邮件内容没什么好说然后是下个 boundary这里东西就是我们要那个popup_thanks.g
  
  看MIME类型是:Content-Type: image/g 图片般就用base64编码所以这里是Content-Transfer-Encoding: base64 再看下面是行Content-Disposition: attachment;filename="thanks.g" 这里attahment表示此图片作为附件它还可以是inline那样话这个图片就会直接在收件人邮件邮件显示区域里显示了filename指定了在附件区域显示什么样文件名这里就把popup_thanks.g改成了thanks.g.下面还有句Content-Location: file:///C:/DEV/perl/images/popup_thanks.g指定文件原始路径好像没用啊?其实很重要注意html文件里连接这个图片标签里src是如何样写?这两个的间要是对不上那末邮件显示时候附件里有图但邮件还是开了天窗了好了基本就是这样还有个问题时候怎样才能得到需要编码后文件啊?perl里如何样做我不知道CPAN里也许有这样package吧那位对编码熟悉也可以自己写不过我做得时候取巧了
  
  大家用过IE5另存为.mht文件吗?对了就是它!把需要发送html邮件用IE5在本地打开再另存为mht文件所有编码都得到了而且图片链接关系也都是现成其他按需要调整下,帖到你里就万事大吉更进如果需要做到像263那样从页面上接收包括正文接受者以及各种可能附件等信息再发送呢?
Tags:  sendmail配置 sendmail sendmail邮件群发 sendmail使用

延伸阅读

最新评论

发表评论