分享
 
 
 

php通过smtp发送邮件

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

<?php

/***************************************

** Filename.......: class.smtp.inc

** Project........: SMTP Class

** Version........: 1.00b

** Last Modified..: 30 September 2001

***************************************/

define('SMTP_STATUS_NOT_CONNECTED', 1, TRUE);

define('SMTP_STATUS_CONNECTED', 2, TRUE);

class smtp{

var $connection;

var $recipients;

var $headers;

var $timeout;

var $errors;

var $status;

var $body;

var $from;

var $host;

var $port;

var $helo;

var $auth;

var $user;

var $pass;

/***************************************

** Constructor function. Arguments:

** $params - An assoc array of parameters:

**

** host - The hostname of the smtp server Default: localhost

** port - The port the smtp server runs on Default: 25

** helo - What to send as the HELO command Default: localhost

** (typically the hostname of the

** machine this script runs on)

** auth - Whether to use basic authentication Default: FALSE

** user - Username for authentication Default: <blank>

** pass - Password for authentication Default: <blank>

** timeout - The timeout in seconds for the call Default: 5

** to fsockopen()

***************************************/

function smtp($params = array()){

if(!defined('CRLF'))

define('CRLF', "\r\n", TRUE);

$this->timeout = 5;

$this->status = SMTP_STATUS_NOT_CONNECTED;

$this->host = 'localhost';

$this->port = 25;

$this->helo = 'localhost';

$this->auth = FALSE;

$this->user = '';

$this->pass = '';

$this->errors = array();

foreach($params as $key => $value){

$this->$key = $value;

}

}

/***************************************

** Connect function. This will, when called

** statically, create a new smtp object,

** call the connect function (ie this function)

** and return it. When not called statically,

** it will connect to the server and send

** the HELO command.

***************************************/

function connect($params = array()){

if(!isset($this->status)){

$obj = new smtp($params);

if($obj->connect()){

$obj->status = SMTP_STATUS_CONNECTED;

}

return $obj;

}else{

$this->connection = fsockopen($this->host, $this->port, $errno, $errstr, $this->timeout);

socket_set_timeout($this->connection, 0, 250000);

$greeting = $this->get_data();

if(is_resource($this->connection)){

return $this->auth ? $this->ehlo() : $this->helo();

}else{

$this->errors[] = 'Failed to connect to server: '.$errstr;

return FALSE;

}

}

}

/***************************************

** Function which handles sending the mail.

** Arguments:

** $params - Optional assoc array of parameters.

** Can contain:

** recipients - Indexed array of recipients

** from - The from address. (used in MAIL FROM:),

** this will be the return path

** headers - Indexed array of headers, one header per array entry

** body - The body of the email

** It can also contain any of the parameters from the connect()

** function

***************************************/

function send($params = array()){

foreach($params as $key => $value){

$this->set($key, $value);

}

if($this->is_connected()){

// Do we auth or not? Note the distinction between the auth variable and auth() function

if($this->auth){

if(!$this->auth())

return FALSE;

}

$this->mail($this->from);

if(is_array($this->recipients))

foreach($this->recipients as $value)

$this->rcpt($value);

else

$this->rcpt($this->recipients);

if(!$this->data())

return FALSE;

// Transparency

$headers = str_replace(CRLF.'.', CRLF.'..', trim(implode(CRLF, $this->headers)));

$body = str_replace(CRLF.'.', CRLF.'..', $this->body);

$body = $body[0] == '.' ? '.'.$body : $body;

$this->send_data($headers);

$this->send_data('');

$this->send_data($body);

$this->send_data('.');

return (substr(trim($this->get_data()), 0, 3) === '250');

}else{

$this->errors[] = 'Not connected!';

return FALSE;

}

}

/***************************************

** Function to implement HELO cmd

***************************************/

function helo(){

if(is_resource($this->connection)

AND $this->send_data('HELO '.$this->helo)

AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){

return TRUE;

}else{

$this->errors[] = 'HELO command failed, output: ' . trim(substr(trim($error),3));

return FALSE;

}

}

/***************************************

** Function to implement EHLO cmd

***************************************/

function ehlo(){

if(is_resource($this->connection)

AND $this->send_data('EHLO '.$this->helo)

AND substr(trim($error = $this->get_data()), 0, 3) === '250' ){

return TRUE;

}else{

$this->errors[] = 'EHLO command failed, output: ' . trim(substr(trim($error),3));

return FALSE;

}

}

/***************************************

** Function to implement AUTH cmd

***************************************/

function auth(){

if(is_resource($this->connection)

AND $this->send_data('AUTH LOGIN')

AND substr(trim($error = $this->get_data()), 0, 3) === '334'

AND $this->send_data(base64_encode($this->user)) // Send username

AND substr(trim($error = $this->get_data()),0,3) === '334'

AND $this->send_data(base64_encode($this->pass)) // Send password

AND substr(trim($error = $this->get_data()),0,3) === '235' ){

return TRUE;

}else{

$this->errors[] = 'AUTH command failed: ' . trim(substr(trim($error),3));

return FALSE;

}

}

/***************************************

** Function that handles the MAIL FROM: cmd

***************************************/

function mail($from){

if($this->is_connected()

AND $this->send_data('MAIL FROM:<'.$from.'>')

AND substr(trim($this->get_data()), 0, 2) === '250' ){

return TRUE;

}else

return FALSE;

}

/***************************************

** Function that handles the RCPT TO: cmd

***************************************/

function rcpt($to){

if($this->is_connected()

AND $this->send_data('RCPT TO:<'.$to.'>')

AND substr(trim($error = $this->get_data()), 0, 2) === '25' ){

return TRUE;

}else{

$this->errors[] = trim(substr(trim($error), 3));

return FALSE;

}

}

/***************************************

** Function that sends the DATA cmd

***************************************/

function data(){

if($this->is_connected()

AND $this->send_data('DATA')

AND substr(trim($error = $this->get_data()), 0, 3) === '354' ){

return TRUE;

}else{

$this->errors[] = trim(substr(trim($error), 3));

return FALSE;

}

}

/***************************************

** Function to determine if this object

** is connected to the server or not.

***************************************/

function is_connected(){

return (is_resource($this->connection) AND ($this->status === SMTP_STATUS_CONNECTED));

}

/***************************************

** Function to send a bit of data

***************************************/

function send_data($data){

if(is_resource($this->connection)){

return fwrite($this->connection, $data.CRLF, strlen($data)+2);

}else

return FALSE;

}

/***************************************

** Function to get data.

***************************************/

function &get_data(){

$return = '';

$line = '';

if(is_resource($this->connection)){

while(strpos($return, CRLF) === FALSE OR substr($line,3,1) !== ' '){

$line = fgets($this->connection, 512);

$return .= $line;

}

return $return;

}else

return FALSE;

}

/***************************************

** Sets a variable

***************************************/

function set($var, $value){

$this->$var = $value;

return TRUE;

}

} // End of class

?>

<?php

/***************************************

** Filename.......: test.php

** Project........: SMTP Class

** Last Modified..: 30 September 2001

***************************************/

/***************************************

** Include the class. The header() makes

** the output look lovely.

***************************************/

include('class.smtp.inc');

header('Content-Type: text/plain');

/***************************************

** Setup some parameters which will be

** passed to the smtp::connect() call.

***************************************/

$params['host'] = 'smtp.sohu.com'; // The smtp server host/ip

$params['port'] = 25; // The smtp server port

$params['helo'] = exec('hostname'); // What to use when sending the helo command. Typically, your domain/hostname

$params['auth'] = TRUE; // Whether to use basic authentication or not

$params['user'] = 'phw82'; // Username for authentication

$params['pass'] = 'xxxxxxx'; // Password for authentication

/***************************************

** These parameters get passed to the

** smtp->send() call.

***************************************/

$send_params['recipients'] = array('phw82@sohu.com'); // The recipients (can be multiple)

$send_params['headers'] = array(

'From: "潘"<'"phw82@sohu.com>', // Headers

'To: phw82@sohu.com',

'Subject: Test email'

);

$send_params['from'] = 'phw82@sohu.com'; // This is used as in the MAIL FROM: cmd

// It should end up as the Return-Path: header

$send_params['body'] = '.Test email.'; // The body of the email

/***************************************

** The code that creates the object and

** sends the email.

***************************************/

?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<HTML>

<HEAD>

<TITLE> New Document </TITLE>

<META NAME="Generator" CONTENT="EditPlus">

<META NAME="Author" CONTENT="">

<META NAME="Keywords" CONTENT="">

<META NAME="Description" CONTENT="">

</HEAD>

<BODY>

<?

if(is_object($smtp = smtp::connect($params)) AND $smtp->send($send_params)){

echo 'Email sent successfully!'."\r\n\r\n";

// Any recipients that failed (relaying denied for example) will be logged in the errors variable.

print_r($smtp->errors);

}else{

echo 'Error sending mail'."\r\n\r\n";

// The reason for failure should be in the errors variable

print_r($smtp->errors);

}

?>

</BODY>

</HTML>

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有