zoukankan
html css js c++ java
网页上发送mail(PHP)
SMTP.PHP
<?
php
class
smtp
{
/*
Public Variables
*/
var
$smtp_port
;
var
$time_out
;
var
$host_name
;
var
$log_file
;
var
$relay_host
;
var
$debug
;
var
$auth
;
var
$user
;
var
$pass
;
/*
Private Variables
*/
var
$sock
;
/*
Constractor
*/
function
smtp(
$relay_host
=
""
,
$smtp_port
=
25
,
$auth
=
false
,
$user
,
$pass
)
{
$this
->
debug
=
FALSE
;
$this
->
smtp_port
=
$smtp_port
;
$this
->
relay_host
=
$relay_host
;
$this
->
time_out
=
30
;
//
is used in fsockopen()
#
$this
->
auth
=
$auth
;
//
auth
$this
->
user
=
$user
;
$this
->
pass
=
$pass
;
#
$this
->
host_name
=
"
localhost
"
;
//
is used in HELO command
$this
->
log_file
=
""
;
$this
->
sock
=
FALSE
;
}
/*
Main Function
*/
function
sendmail(
$to
,
$from
,
$subject
=
""
,
$body
=
""
,
$mailtype
,
$cc
=
""
,
$bcc
=
""
,
$additional_headers
=
""
)
{
$mail_from
=
$this
->
get_address(
$this
->
strip_comment(
$from
));
$body
=
ereg_replace
(
"
(^|(\r\n))(\.)
"
,
"
\1.\3
"
,
$body
);
$header
=
"
MIME-Version:1.0\r\n
"
;
if
(
$mailtype
==
"
HTML
"
)
{
$header
.=
"
Content-Type:text/html\r\n
"
;
}
$header
.=
"
To:
"
.
$to
.
"
\r\n
"
;
if
(
$cc
!=
""
)
{
$header
.=
"
Cc:
"
.
$cc
.
"
\r\n
"
;
}
$header
.=
"
From: $from<
"
.
$from
.
"
>\r\n
"
;
$header
.=
"
Subject:
"
.
$subject
.
"
\r\n
"
;
$header
.=
$additional_headers
;
$header
.=
"
Date:
"
.
date
(
"
r
"
)
.
"
\r\n
"
;
$header
.=
"
X-Mailer:By Redhat (PHP/
"
.
phpversion
()
.
"
)\r\n
"
;
list
(
$msec
,
$sec
)
=
explode
(
"
"
,
microtime
());
$header
.=
"
Message-ID: <
"
.
date
(
"
YmdHis
"
,
$sec
)
.
"
.
"
.
(
$msec
*
1000000
)
.
"
.
"
.
$mail_from
.
"
>\r\n
"
;
$TO
=
explode
(
"
,
"
,
$this
->
strip_comment(
$to
));
if
(
$cc
!=
""
)
{
$TO
=
array_merge
(
$TO
,
explode
(
"
,
"
,
$this
->
strip_comment(
$cc
)));
}
if
(
$bcc
!=
""
)
{
$TO
=
array_merge
(
$TO
,
explode
(
"
,
"
,
$this
->
strip_comment(
$bcc
)));
}
$sent
=
TRUE
;
foreach
(
$TO
as
$rcpt_to
)
{
$rcpt_to
=
$this
->
get_address(
$rcpt_to
);
if
(
!
$this
->
smtp_sockopen(
$rcpt_to
))
{
$this
->
log_write(
"
Error: Cannot send email to
"
.
$rcpt_to
.
"
\n
"
);
$sent
=
FALSE
;
continue
;
}
if
(
$this
->
smtp_send(
$this
->
host_name
,
$mail_from
,
$rcpt_to
,
$header
,
$body
))
{
$this
->
log_write(
"
E-mail has been sent to <
"
.
$rcpt_to
.
"
>\n
"
);
}
else
{
$this
->
log_write(
"
Error: Cannot send email to <
"
.
$rcpt_to
.
"
>\n
"
);
$sent
=
FALSE
;
}
fclose
(
$this
->
sock);
$this
->
log_write(
"
Disconnected from remote host\n
"
);
}
return
$sent
;
}
/*
Private Functions
*/
function
smtp_send(
$helo
,
$from
,
$to
,
$header
,
$body
=
""
)
{
if
(
!
$this
->
smtp_putcmd(
"
HELO
"
,
$helo
))
{
return
$this
->
smtp_error(
"
sending HELO command
"
);
}
#
auth
if
(
$this
->
auth)
{
if
(
!
$this
->
smtp_putcmd(
"
AUTH LOGIN
"
,
base64_encode
(
$this
->
user)))
{
return
$this
->
smtp_error(
"
sending HELO command
"
);
}
if
(
!
$this
->
smtp_putcmd(
""
,
base64_encode
(
$this
->
pass)))
{
return
$this
->
smtp_error(
"
sending HELO command
"
);
}
}
#
if
(
!
$this
->
smtp_putcmd(
"
MAIL
"
,
"
FROM:<
"
.
$from
.
"
>
"
))
{
return
$this
->
smtp_error(
"
sending MAIL FROM command
"
);
}
if
(
!
$this
->
smtp_putcmd(
"
RCPT
"
,
"
TO:<
"
.
$to
.
"
>
"
))
{
return
$this
->
smtp_error(
"
sending RCPT TO command
"
);
}
if
(
!
$this
->
smtp_putcmd(
"
DATA
"
))
{
return
$this
->
smtp_error(
"
sending DATA command
"
);
}
if
(
!
$this
->
smtp_message(
$header
,
$body
))
{
return
$this
->
smtp_error(
"
sending message
"
);
}
if
(
!
$this
->
smtp_eom())
{
return
$this
->
smtp_error(
"
sending <CR><LF>.<CR><LF> [EOM]
"
);
}
if
(
!
$this
->
smtp_putcmd(
"
QUIT
"
))
{
return
$this
->
smtp_error(
"
sending QUIT command
"
);
}
return
TRUE
;
}
function
smtp_sockopen(
$address
)
{
if
(
$this
->
relay_host
==
""
)
{
return
$this
->
smtp_sockopen_mx(
$address
);
}
else
{
return
$this
->
smtp_sockopen_relay();
}
}
function
smtp_sockopen_relay()
{
$this
->
log_write(
"
Trying to
"
.
$this
->
relay_host
.
"
:
"
.
$this
->
smtp_port
.
"
\n
"
);
$this
->
sock
=
@
fsockopen
(
$this
->
relay_host
,
$this
->
smtp_port
,
$errno
,
$errstr
,
$this
->
time_out);
if
(
!
(
$this
->
sock
&&
$this
->
smtp_ok()))
{
$this
->
log_write(
"
Error: Cannot connenct to relay host
"
.
$this
->
relay_host
.
"
\n
"
);
$this
->
log_write(
"
Error:
"
.
$errstr
.
"
(
"
.
$errno
.
"
)\n
"
);
return
FALSE
;
}
$this
->
log_write(
"
Connected to relay host
"
.
$this
->
relay_host
.
"
\n
"
);
return
TRUE
;
}
function
smtp_sockopen_mx(
$address
)
{
$domain
=
ereg_replace
(
"
^.+@([^@]+)$
"
,
"
\1
"
,
$address
);
if
(
!
@getmxrr(
$domain
,
$MXHOSTS
))
{
$this
->
log_write(
"
Error: Cannot resolve MX \
""
.$domain.
"
\
"
\n
"
);
return
FALSE
;
}
foreach
(
$MXHOSTS
as
$host
)
{
$this
->
log_write(
"
Trying to
"
.
$host
.
"
:
"
.
$this
->
smtp_port
.
"
\n
"
);
$this
->
sock
=
@
fsockopen
(
$host
,
$this
->
smtp_port
,
$errno
,
$errstr
,
$this
->
time_out);
if
(
!
(
$this
->
sock
&&
$this
->
smtp_ok()))
{
$this
->
log_write(
"
Warning: Cannot connect to mx host
"
.
$host
.
"
\n
"
);
$this
->
log_write(
"
Error:
"
.
$errstr
.
"
(
"
.
$errno
.
"
)\n
"
);
continue
;
}
$this
->
log_write(
"
Connected to mx host
"
.
$host
.
"
\n
"
);
return
TRUE
;
}
$this
->
log_write(
"
Error: Cannot connect to any mx hosts (
"
.
implode
(
"
,
"
,
$MXHOSTS
)
.
"
)\n
"
);
return
FALSE
;
}
function
smtp_message(
$header
,
$body
)
{
fputs
(
$this
->
sock
,
$header
.
"
\r\n
"
.
$body
);
$this
->
smtp_debug(
"
>
"
.
str_replace
(
"
\r\n
"
,
"
\n
"
.
"
>
"
,
$header
.
"
\n>
"
.
$body
.
"
\n>
"
));
return
TRUE
;
}
function
smtp_eom()
{
fputs
(
$this
->
sock
,
"
\r\n.\r\n
"
);
$this
->
smtp_debug(
"
. [EOM]\n
"
);
return
$this
->
smtp_ok();
}
function
smtp_ok()
{
$response
=
str_replace
(
"
\r\n
"
,
""
,
fgets
(
$this
->
sock
,
512
));
$this
->
smtp_debug(
$response
.
"
\n
"
);
if
(
!
ereg
(
"
^[23]
"
,
$response
))
{
fputs
(
$this
->
sock
,
"
QUIT\r\n
"
);
fgets
(
$this
->
sock
,
512
);
$this
->
log_write(
"
Error: Remote host returned \
""
.$response.
"
\
"
\n
"
);
return
FALSE
;
}
return
TRUE
;
}
function
smtp_putcmd(
$cmd
,
$arg
=
""
)
{
if
(
$arg
!=
""
)
{
if
(
$cmd
==
""
)
$cmd
=
$arg
;
else
$cmd
=
$cmd
.
"
"
.
$arg
;
}
fputs
(
$this
->
sock
,
$cmd
.
"
\r\n
"
);
$this
->
smtp_debug(
"
>
"
.
$cmd
.
"
\n
"
);
return
$this
->
smtp_ok();
}
function
smtp_error(
$string
)
{
$this
->
log_write(
"
Error: Error occurred while
"
.
$string
.
"
.\n
"
);
return
FALSE
;
}
function
log_write(
$message
)
{
$this
->
smtp_debug(
$message
);
if
(
$this
->
log_file
==
""
)
{
return
TRUE
;
}
$message
=
date
(
"
M d H:i:s
"
)
.
get_current_user
()
.
"
[
"
.
getmypid
()
.
"
]:
"
.
$message
;
if
(
!
@
file_exists
(
$this
->
log_file)
||
!
(
$fp
=
@
fopen
(
$this
->
log_file
,
"
a
"
)))
{
$this
->
smtp_debug(
"
Warning: Cannot open log file \
""
.$this->log_file.
"
\
"
\n
"
);
return
FALSE
;
}
flock
(
$fp
,
LOCK_EX);
fputs
(
$fp
,
$message
);
fclose
(
$fp
);
return
TRUE
;
}
function
strip_comment(
$address
)
{
$comment
=
"
\([^()]*\)
"
;
while
(
ereg
(
$comment
,
$address
))
{
$address
=
ereg_replace
(
$comment
,
""
,
$address
);
}
return
$address
;
}
function
get_address(
$address
)
{
$address
=
ereg_replace
(
"
([ \t\r\n])+
"
,
""
,
$address
);
$address
=
ereg_replace
(
"
^.*<(.+)>.*$
"
,
"
\1
"
,
$address
);
return
$address
;
}
function
smtp_debug(
$message
)
{
if
(
$this
->
debug)
{
echo
$message
;
}
}
}
?>
DEMO:TEST.PHP
<?
php
require
"
smtp.php
"
;
$smtpserver
=
"
smtp.xxx.com
"
;
//
SMTP服务器
$smtpserverport
=
25
;
//
SMTP服务器端口
$smtpusermail
=
"
xxxx@xxx.com
"
;
//
SMTP服务器的用户邮箱
$smtpemailto
=
"
xxxx@xxx.com
"
;
//
发送给谁
$smtpuser
=
"
xxxx
"
;
//
SMTP服务器的用户帐号
$smtppass
=
"
xxxx
"
;
//
SMTP服务器的用户密码
$mailsubject
=
"
客户反馈意见!
"
;
//
邮件主题
$mailbody
=
"
<h1>这是我的一个测试~~~</h1>
"
;
//
邮件内容
$mailtype
=
"
HTML
"
;
//
邮件格式(HTML/TXT),TXT为文本邮件
$smtp
=
new
smtp(
$smtpserver
,
$smtpserverport
,
true
,
$smtpuser
,
$smtppass
);
//
这里面的一个true是表示使用身份验证,否则不使用身份验证.
$smtp
->
debug
=
false
;
//
是否显示发送的调试信息
$return
=
(
$smtp
->
sendmail(
$smtpemailto
,
$smtpusermail
,
$mailsubject
,
$mailbody
,
$mailtype
));
echo
$return
;
?>
查看全文
相关阅读:
微信小程序创建第一个项目
微信小程序工具下载与安装
Windows下删除顽固文件夹
微信小程序账号注册
C++第四十九篇 -- 将一个项目Copy到另一台电脑
C++第四十八篇 -- 字符串分离方法
C++第四十七篇 -- VS2017带参数启动调试程序
MarkDown插入图片
Http升级到Https (本地测试,无须域名和认证)
语音识别(ASR) 阿里云
原文地址:https://www.cnblogs.com/answer/p/636219.html
最新文章
【C++】enum
Singleton单例模式
C++标准库中sstream和strstream的区别
【C++多线程】std::timed_mutex带超时的互斥量
【C++多线程】嵌套锁/递归锁std::recursive_mutex和Windows临界区
【C++多线程】std::atomic<T>
【C++多线程】std::future、std::async、std::promise、std::packaged_task、std::shared_future
【C++多线程】条件变量condition_variable
std::move和std::forward
github使用学习
热门文章
叫我小墨迹吧
typecho 博客
25周 偷懒 看域名
maven 添加本地包
springboot 后端初试
java 计算器
java Swing 简单计算器实现
javafx
添加底部导航栏tabbar
认识微信小程序开发页面
Copyright © 2011-2022 走看看