免费注册 查看新帖 |

Chinaunix

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

请教高手 关于使用 Socket 发信. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-09-05 00:33 |只看该作者 |倒序浏览
使用 雷傲论坛.的ESMTP发信功能,一直没有成功过.  想请教一下高手们? 错在什么地方?

是使用 Socket

论坛程序中有关发信的SUB






  1. sub smtpmail
  2. {
  3.         eval("use Socket;");
  4.         my ($address, $from, $replyaddr, $subject, $body, $extra) = @_;

  5.         my ($a, $i, $name, $aliases, $proto, $type, $len, $thataddr);
  6.         my @to = split(/, /, $address);
  7.         foreach $i (@to)
  8.         {
  9.                 #对地址进行解码
  10.                 my $AF_INET = 2;
  11.                 my $SOCK_STREAM = 1;
  12.                 my $SOCKADDR = 'S n a4 x8';

  13.                 ($name, $aliases, $proto) = getprotobyname('tcp');
  14.                 ($name, $aliases, $SMTP_PORT) = getservbyname($SMTP_PORT, 'tcp') unless ($SMTP_PORT =~ /^\d+$/);
  15.                 ($name, $aliases, $type, $len, $thataddr) = gethostbyname($SMTP_SERVER);
  16.                 my $this = pack($SOCKADDR, $AF_INET, 0, $thisaddr);
  17.                 my $that = pack($SOCKADDR, $AF_INET, $SMTP_PORT, $thataddr);

  18.                 #打开SMTP的socket端口
  19.                 socket(S, $AF_INET, $SOCK_STREAM, $proto);
  20.                 bind(S, $this);
  21.                 connect(S, $that);

  22.                 select(S);
  23.                 $| = 1;
  24.                 select(STDOUT);
  25.                 $a = "";
  26.                 $a = <S>;;
  27.                 if ($a !~ /^2/)
  28.                 {
  29.                         close(S);
  30.                         undef $|;
  31.                         return 0;
  32.                 }

  33.                 if ($extra eq "no")
  34.                 {#与普通SMTP服务器握手连接
  35.                         print S "HELO localhost\n";
  36.                         $a = <S>;;
  37.                 }
  38.                 else
  39.                 {#进行ESMTP身份验证
  40.                         print S "EHLO localhost\n";
  41.                         $a = <S>;;
  42.                         print S "AUTH LOGIN\n";
  43.                         $a = <S>;;
  44.                         my $encode_smtpuser = &Base64encode($SMTPUSER);    #用来验证的用户名必须经过Base64编码后发往服务器
  45.                         print S "$encode_smtpuser\n";
  46.                         $a = <S>;;
  47.                         my $encode_smtppass = &Base64encode($SMTPPASS);    #用来验证的密码必须经过Base64编码后发往服务器
  48.                         print S "$encode_smtppass\n";
  49.                         $a = <S>;;
  50.                         return 0 if ($a =~ /fail/i);
  51.                 }

  52.                 #发送邮件头部信息
  53.                 print S "MAIL FROM: <$from>;\n";
  54.                 $a = <S>;;
  55.                 print S "RCPT TO: <$i>;\n";
  56.                 $a = <S>;;

  57.                 #发送邮件正文
  58.                 print S "DATA\n";
  59.                 print S "From: $from\n";
  60.                 print S "To: $i\n";
  61.                 print S "Subject: $subject\n";
  62.                 print S "Reply-To: $replyaddr\n" if ($replyaddr);
  63.                 print S "X-Mailer: LeoBoard eSmtp Mail Sender\n";
  64.                 print S "Content-Type: text/html; charset=gb2312\n\n";
  65.                 print S $body;
  66.                 print S "\n";
  67.                 print S "\n\n";
  68.                 print S ".\n";
  69.                 $a = <S>;;

  70.                 print S "QUIT\n";
  71.                 $a = <S>;;
  72.                 close(S);
  73.                 undef $|;
  74.         }
  75.         return 1;
  76. }

  77. sub Base64encode
  78. #Base64编码函数
  79. {
  80.     my $res = pack("u", $_[0]);
  81.     $res =~ s/^.//mg;
  82.     $res =~ s/\n//g;
  83.     $res =~ tr|` -_|AA-Za-z0-9+/|;
  84.     my $padding = (3 - length($_[0]) % 3) % 3;
  85.     $res =~ s/.{$padding}$/'=' x $padding/e if $padding;
  86.     return $res;
  87. }
  88. 1;



复制代码




注: 空间不支持Sendmail 发信.[code][/code]

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
2 [报告]
发表于 2003-09-05 08:19 |只看该作者

请教高手 关于使用 Socket 发信.

You can use the modules that provided on CPAN...
like Mail::Sender, Mail::Sendmail,.....

论坛徽章:
0
3 [报告]
发表于 2003-09-05 09:54 |只看该作者

请教高手 关于使用 Socket 发信.

我再来补充 :)
还有Mail::Mailer, Net::SMTP,
还有以Email打头的一系列模块,比如Email::Simple。。。。。。

论坛徽章:
0
4 [报告]
发表于 2003-09-05 19:05 |只看该作者

请教高手 关于使用 Socket 发信.

是否支持认证??

那位大哥使用过? 好用吗? 如果有应用代码就太好了

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2003-09-05 19:12 |只看该作者

请教高手 关于使用 Socket 发信.

http://www.chinaunix.net/forum/viewtopic.php?t=142253&start=0
這是我寫的..但是不經過Authorization的程式碼..
其實他是支援authorization的...
請自己研究
http://search.cpan.org/author/JENDA/Mail-Sender-0.8.08/Sender.pm
這個URL
或看一下最上面module使用說明...

论坛徽章:
0
6 [报告]
发表于 2003-09-05 19:19 |只看该作者

请教高手 关于使用 Socket 发信.

感谢这里的热朋友.这个论坛太...............巴适了. 安逸

论坛徽章:
0
7 [报告]
发表于 2003-09-05 20:48 |只看该作者

请教高手 关于使用 Socket 发信.











  1. 再次请教.
  2. 按你们说的使用NET::SMTP 已成功了.



  3. 我对照了一个已前失败的记录,和现在成功的记录.发现已前的因为主要是在下面代码中:

  4. Net::SMTP=GLOB(0x1842f44)<<< 334 VXNlcm5hbWU6
  5. Net::SMTP=GLOB(0x1842f44)>;>;>; YmVsbEB6d2JzLm5ldA==

  6. Net::SMTP=GLOB(0x1842f44)<<< 334 UGFzc3dvcmQ6
  7. Net::SMTP=GLOB(0x1842f44)>;>;>; YmVsbDExMzMyMjg4OA==

  8. Net::SMTP=GLOB(0x1842f44)<<< 235 2.0.0 OK Authenticated



  9. 在提交用户名和密码后 SMTP服务器返回  334 VXNlcm5hbWU6 , 已前失败是因为没有再处理这个东东.

  10. 请问 上面记录向服务器发送的代码  YmVsbEB6d2JzLm5ldA==  是怎么得到的??


复制代码

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2003-09-05 22:01 |只看该作者

请教高手 关于使用 Socket 发信.

密碼crypt. 後得到的string... 跟/etc/shadow裡面看到的類似..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP