关于IMAP邮件的函数的使用???急救急救

roland001981 2004-08-09 02:46:21
问题主要是这样,现在想发邮件到某个信箱!服务器不支持mail函数,但是支持imap函数,请问怎样实现,最好有例子!!
...全文
140 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
feixuehenshui 2004-08-24
http://www.pcimg.com/code/php/article/email/
这个连接全是发邮件的
找你需要的吧
回复
feixuehenshui 2004-08-24
转帖一篇CU里夜猫的文章
使用php通过smtp发送邮件新手指南
http://www.chinaunix.net 作者:夜猫子 发表于:2004-07-02 01:50:55

由于php没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。本文的目的在于为新手指明方向,并没有涉及那些高级的内容,一来本身水平有限,二来也担心不能准确的讲述相关的概念,进而对各位造成误导,还请自行深入学习。本文撰写日期是2004年7月2日,阅读时请注意时效性。

“使用php发送mail”最近已经成为继“register_globals”以后本版第二个新手陷阱,今天特地写这篇文章为新手解惑,希望可以为迷茫的人指明方向。
让我们先从以下这个例子开始说起:
引用
[root@server~/]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 server.domain.com.br ESMTP Postfix (2.1.0)
MAIL FROM: teste@dominio.com.br
250 Ok
RCPT TO: teste@dominio.com.br
250 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
teste
.
250 Ok: queued as 7B41F4665A
QUIT
221 Bye
Connection closed by foreign host.
注:以上来自netkiller的postfix文档,偷懒,直接用现成的。

首先是使用telnet来连接本地的25端口,稍微熟悉点网络的人都知道smtp协议使用25端口,这也就是说,现在在连接本地的smtp服务器。
引用
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 server.domain.com.br ESMTP Postfix (2.1.0)

这些东西是系统输出信息,说明已经连接上了,而且这个smtp服务器是postfix做的。

“MAIL FROM: teste@dominio.com.br”这个命令指明了发件地址是teste@dominio.com.br,“250 Ok”说明这条命令被服务器接受并正确执行,这类似http协议的200、404、500等状态代码。接下来的“RCPT TO: teste@dominio.com.br”指明了收件地址是teste@dominio.com.br。
引用
DATA
354 End data with <CR><LF>.<CR><LF>
teste
.

这一段是输入邮件正文,输入“DATA”以后系统提示使用“<回车>.<回车>”来结束输入,正文内容是“teste”。
最后使用“QUIT”退出。

以上就是最简单的一次发送mail的过程,从这个例子我们可以看出,发送mail其实是很简单的事情,实质上也就是建立一个对smtp服务器的连接,然后发送一些简单的命令给它,一封内容简单的邮件就发送出去了,至于更加复杂内容的邮件或者操作,其实也就是在此基础上稍加扩展而已。

把这个过程用php来实现,其实就是利用php的Socket functions、Network Functions等等操作socket的函数来和smtp服务器建立一个连接,然后发送文本的命令给服务器,如果你亲自去看看那些写好的利用smtp协议发送邮件的类或者函数,相信可以印证我的说法。

由于已经存在很多现成的封装得很好的类或者函数替我们完成底层的socket级操作,我们只需要直接拿来用就好,而我也不会费时费神的在本文里去讨论底层的代码,有精神去研究的话,自己找代码来研究吧。现在继续跟我走,我们来点实际的代码来说明如何使用php发送邮件,采用的类是PEAR::Mail。
<?php 
require_once 'Mail.php';

$conf['mail'] = array(
'host' => 'xx.xx.xx.xx', //smtp服务器地址,可以用ip地址或者域名
'auth' => true, //true表示smtp服务器需要验证,false代码不需要
'username' => 'tester', //用户名
'password' => 'retset' //密码
);

/***
* 使用$headers数组,可以定义邮件头的内容,比如使用$headers['Reply-To']可以定义回复地址
* 通过这种方式,可以很方便的定制待发送邮件的邮件头
***/
$headers['From'] = 'tester@domain.com'; //发信地址
$headers['To'] = 'tester@domain.com'; //收信地址
$headers['Subject'] = 'test mail send by php'; //邮件标题
$mail_object = &Mail::factory('smtp', $conf['mail']);

$body = <<< MSG //邮件正文
hello world!!!
MSG;

$mail_res = $mail_object->send($headers['To'], $headers, $body); //发送

if( Mail::isError($mail_res) ){ //检测错误
die($mail_res->getMessage());
}
?>

以上的代码非常的简单,配合注释应该不难看懂,关于PEAR和PEAR::Mail的更多信息,可以自己去翻阅PEAR Manual得到进一步的信息。

现在你依葫芦画瓢已经可以开始工作了,不过如果你还想做得更好、做得更多的话,我在这里提供一些更多的指南。

1、SMTP协议
熟悉并了解SMTP协议的内容,这样你可以进行更多的高级操作,甚至自己写一个满足自己特别需求的发邮件程序。以上的代码虽然简单,但是肯定还是有很多人不了解注释里提到的邮件头是什么东西,它到底对发出的邮件有什么样的影响。
比如“发送html邮件为什么对方看到的是乱码”等等问题都可能和邮件头相关,如果对smtp协议比较了解的话,可以很快的知道问题所在。
2、MIME规范
如果想要发送html邮件甚至多媒体邮件,一定是需要对MIME有一定了解的,有了这方面的知识你就可以发送内容更加精彩的邮件。
3、PEAR
PEAR并非唯一的发送邮件的工具,但是PEAR包含了Mail、Mail_Mime等等已经封装好了的类,可以让我们的开发事半功倍,并且除了Mail方面的东西以外,它还提供了很多其他方面的现成的工具,非常值得花时间学一学。

由于php没有提供现成的smtp函数,却提供了一个功能不甚灵活的mail()函数,这个函数需要服务器配置上的支持,并且不支持smtp验证,在很多场合无法正常的工作,因此不建议使用。本文的目的在于为新手指明方向,并没有涉及那些高级的内容,一来本身水平有限,二来也担心不能准确的讲述相关的概念,进而对各位造成误导,还请自行深入学习。本文撰写日期是2004年7月2日,阅读时请注意时效性。

回复
roland001981 2004-08-23
都不行啊!用IMAP发邮件的程序,要能够发送的,请问一下有没有啊!!!!!谢谢各位!
回复
pwtitle 2004-08-11
使用imap_mail发送邮件,同mail函数一样,都需要服务器提供mailserver的配置。
比如:
$is_send = imap_mail("pwdo@163.com","Only a test!",$string);
if($is_send) echo "发送成功!";

运行后的结果是
Warning: imap_mail(): Failed to connect to mailserver at "localhost" port 25, verify your "SMTP" and "smtp_port" setting in php.ini or use ini_set() in D:\httpd\HTDOCS\imap.php on line 2

所以你要确信服务器上说不上配置了mailserver,如果没有的话,你只能使用比如phpMailer等发信的类,其实是socket调用,不过功能是比较强大的,而且很好用。可以指定自己的mailserver
phpmailer可以到这里下载
http://phpmailer.sourceforge.net/
回复
unixdotnet 2004-08-11
socket方式

<?php
function sendmail( $host, $user, $passwd, $from_address, $auth, $to, $subject, $message, $df_from, $mail_flag = 0 )
{
$smtp = $host;
$check = $auth;
$head = '';
$username = $user;
$password = $passwd;
$s_from = $from_address;
$fp = fsockopen( $smtp, 25, $errno, $errstr, 60 );
if ( !$fp ) return false;
stream_set_blocking( $fp, true );
$lastmessage = fgets( $fp,512 );
if ( substr( $lastmessage, 0, 3 ) != 220 ) return false;
$yourname = $username;
$lastact = $check == 1 ? "EHLO " . $yourname . "\r\n" : "HELO " . $yourname . "\r\n";
fputs( $fp, $lastact );
$lastmessage == fgets( $fp, 512 );
if ( substr( $lastmessage, 0, 3 ) != 220 ) return false;

while( true ) {
$lastmessage = fgets( $fp, 512 );
if ( (substr( $lastmessage, 3, 1 ) != "-") or ( empty( $lastmessage ) ) )
break;
}

if ( $check == 1 ) {
$lastact = "AUTH LOGIN" . "\r\n";
fputs( $fp, $lastact );
$lastmessage = fgets( $fp, 512 );
if ( substr( $lastmessage, 0, 3 ) != 334 ) return false;
$lastact = base64_encode( $username ) . "\r\n";
fputs( $fp, $lastact );
$lastmessage = fgets( $fp, 512 );
if ( substr( $lastmessage, 0, 3 ) != 334 ) return false;
$lastact = base64_encode( $password ) . "\r\n";
fputs( $fp, $lastact );
$lastmessage = fgets( $fp, 512 );
if (substr( $lastmessage, 0, 3 ) != "235" ) return false;
}

$lastact = "MAIL FROM: $s_from" . "\r\n";
fputs( $fp, $lastact );
$lastmessage = fgets( $fp, 512 );
if ( substr( $lastmessage, 0, 3 ) != 250 ) return false;
$lastact = "RCPT TO: $to" . "\r\n";
fputs( $fp, $lastact );
$lastmessage = fgets( $fp, 512 );
if ( substr( $lastmessage, 0, 3 ) != 250 ) return false;
$lastact = "DATA\r\n";
fputs( $fp, $lastact );
$lastmessage = fgets( $fp, 512 );
if ( substr( $lastmessage, 0, 3 ) != 354 ) return false;

if ( $mail_flag == 1 )
{
$head = "MIME-Version: 1.0\r\n";
$head .= "Content-type: text/html; charset=GB2312\r\n";
}

$head = "Subject: $subject\r\n" . $head;
$message = $head . "\r\n" . $message;
$head = "From: $df_from\r\n";
$message = $head . $message;
$head = "To: $to\r\n";
$message = $head . $message;
$message .= "\r\n.\r\n";
fputs( $fp, $message );
$lastact = "QUIT\r\n";
fputs( $fp, '');
fclose( $fp );
return true;
}

sendmail( $host, $user, $passwd, $from_address, $auth, $to, $subject, $message, $df_from, $mail_flag );
?>
回复
pswdf 2004-08-10
使用socket发信吧。
回复
roland001981 2004-08-10
pwtitle(doodoo)
能不能举个例子
回复
roland001981 2004-08-10
没有用过SOCKET啊,有没有例子?
回复
pwtitle 2004-08-09
imap很好用啊。php手册不是有例子吗?你先要确信服务器是不是有mailserver,否则你只能使用远程mailserver,(可能会有发信认证)。
回复
julychina 2004-08-09
没用过,帮顶。
回复
相关推荐
发帖
基础编程
创建于2007-09-28

2.1w+

社区成员

从PHP安装配置,PHP入门,PHP基础到PHP应用
申请成为版主
帖子事件
创建了帖子
2004-08-09 02:46
社区公告
暂无公告