PHP的一个完整SMTP类(解决当mail()遇上邮件服务器需要验证时的问题) [转]

双11财务报表怎么做?不用Excel,10分钟学会动态可视化报表 双11昨天过去了,不知道各位剁手剁的怎么样?反正淘宝的销售额又上了一个台阶,快递小哥哥们辛苦了。 同样辛苦的还有我们的财务同学(手动滑稽),你的Excel已经在等着你了,准备好加班加点做财务报表吧。不过话说回来,这么大的数据量,你真的不怕Excel卡死吗? 再换句话说,你最后拿出下面冷冰冰的销售表格给老板,就算是销售额5个亿,老板也高兴不起来,做的什么玩意? 但是大家不用担心,商业... 阅读详情

class.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;

}

}

}

?>

 

 

 

 

 

test.php

<?php

/*

这是一个测试程序!!!

请按照说明设置好以下的参数,以下是以tom.com的用户为例设置好的.

*/

require("class,smtp.php");

$smtpserver = "smtp.tom.com";//SMTP服务器

$smtpserverport =25;//SMTP服务器端口

$smtpusermail = "someone@tom.com";//SMTP服务器的用户邮箱

$smtpemailto = "someone@hotmail.com";//发送给谁

$smtpuser = "someone";//SMTP服务器的用户帐号

$smtppass = "someonepass";//SMTP服务器的用户密码

$mailsubject = "Test Subject";//邮件主题

$mailbody = "<h1>This is a test mail</h1>";//邮件内容

$mailtype = "HTML";//邮件格式(HTML/TXT),TXT为文本邮件

$smtp = new smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.

$smtp->debug = TRUE;//是否显示发送的调试信息

$smtp->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);

?>

【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python package 如何安装请详见上文 【PyBind11+anaconda+opencv+windows11+cmake+wsl+vscode】从入门到跑通。构建基于opencv c++的python接口_子韵如初的博客-CSDN博客w不需要安装啥x11 、 xming直接mobxterm可以搞定点击右上角的X server打开可视化服务器然后 apt install x11-apps -yxclock 搞定从mobxterm可以看到display的端口X11显示可视化的原理是就是通过X协议,似于http对linux于w 阅读详情

相关推荐

LPDDR6 Efficiency Mode 技术探讨

LPDDR6 Efficiency Mode 技术探讨

zilan23的博客 1099

Cannot connenct to relay host smtp.163.com (php邮件发送失败)

这两天整理一个邮件发送,在本地发送成功,放到阿里云服务器上就是失败,找了很多资料,没有找到问题,废话不多说了,解决方案如下: 1. 检查自己的服务器的环境配置是否开通fsockopen; a.找到php.ini,查看两个地方,一个是allow_url_fopen,这个地方要设置成on;另一个地方是查disable_functions,如果后面出现了fsock,fsockopen,...

kuseguowang的博客 1890

计算机组成原理实验二 运算器实验 报告 参考

实验所用的实验环境是多思计组原理虚拟实验室,报告中的电路图放到我的主页的另外一个资源里。计算机组成原理实验二 运算器实验 报告 参考

php使用smtp发送邮件

【代码】php使用smtp发送邮件。

yyfhyf的博客 1018

邮件设置 ssl://smtp.exmail.qq.com:465 can not connect to the SMTP server

ssl://smtp.exmail.qq.com:465 can not connect to the SMTP server 检查服务器端口已经开启,服务器防火墙是关闭的,检查OpenSSL是否开 原文地址 :http://blog.csdn.net/tangdc88/article/details/46336871 windows下开启方法: 1: 首先检查p...

7069

php linux mail smtp,linux空间使用smtp无法发送邮件解决方法

偶然发现我网站后台自动发送邮件功能不能用了,报这个错误:Trying to smtp.126.com:25 Error: Cannot connenct to relay host smtp.126.com Error: () Error: Cannot send email to web@daixiaorui.com state大概意思是:无法connenct中继主机smtp.126.com 错...

weixin_30695909的博客 878

刷新报表_工作汇报中,别人那些高大上的动态报表都是怎么做出来的?

在汇报工作的候,老板为什么都爱看动态报表?因为动态报表能更直观的展现出数据变化结果,为决策带来更准确的支持。报表动态可视化是指能够进行交互,不需要固定格式,可以根据业务的需求变化而变化的报表,同报表数据也能够随着条件不同而随调用,不需要重新多余的报表设计。报表动态可视化在我们日常的分析工作中越来越重要。比如,在销售数据分析中,运营实监控大屏可以很方便的实监测用户及订单数量。在物流监控分析...

weixin_33179060的博客 139

jsp点击文字改变颜色_报表工具中动态文字水印怎么做

水印是把一些标识信息嵌入到信息载体中,在不影响原载体内容使用的同,为原作者提供识别的手段,进而防止被再次篡改,是一种保护信息安全和知识版权的有效方法。说到水印,常见到纸的文件,一般常用 Word 或 pdf 编辑后打印所得,并且 offie 或 pdf 软件也有直接增加水印的功能。像 Word 中增加水印很简单:菜单栏“设计”-“水印”(选择“自定义水印”),可以设置图片或文字水印。但同一个 ...

weixin_39603778的博客 183

birt 报表加入图片_BIRT 异构跨库的动态关联查询怎么做

BIRT自带的Data Sources Join以及用ETL化为同库等方案都难以解决问题。具体可以通过如下示例讨论:交易明细数据(trade表)存储于生产系统的数据库DB2中,另外一部分业务数据(network表、account表)存储于业务系统的Mysql中,它们其中的关联关系如下图所示: 所谓“动态关联”,是指用户在前台界面输入参数,报表通过参数来决定trade和哪张表做关联,并在报表中...

weixin_36204407的博客 142

2026数据动态脱敏-BI报表数据脱敏怎么做?

BI 报表平台是企业数据使用最频繁的入口之一,也是敏感数据暴露的高发区。它的脱敏难题有三个层面:第一,BI 平台自身能力不足。多数 BI 产品内置的脱敏功能弱,策略配置复杂,且基于 BI 报表或数据集配置脱敏策略,数量巨大、变更频繁,难以管理和维护。报表数量动辄成百上千,逐张报表配置策略,工作量不可持续。第二,数据安全与数据分析业务紧耦合。数据分析师既要用数据,又要管安全,权责不清;要么为了效率放开权限,要么为了安全限制数据,两头为难。

visechen的博客 330

动态交叉表头报表的制作

在数据信息系统中,常常会看到这样一报表需求,它们的样式为交叉报表的变形(既纵向分组扩展又横向分组扩展,在交叉区域对统计项进行汇总),同在纵向分组,要求每个组跟随一个与分组相对应的横向表头。对比效果如下图所示:从上图可看到,报表纵向按照年进行分组扩展,同每年又能生成一个横向分组表头,该表头按照地区横向扩展,并且根据年份的不同而不同。如上图所示:2014年有6个地区,而2015年由于数据不同只...

Raqsoft 2532

动态文字水印怎么做

水印是把一些标识信息嵌入到信息载体中,在不影响原载体内容使用的同,为原作者提供识别的手段,进而防止被再次篡改,是一种保护信息安全和知识版权的有效方法。 说到水印,常见到纸的文件,一般常用 Word 或 pdf 编辑后打印所得,并且 offie 或 pdf 软件也有直接增加水印的功能。 像 Word 中增加水印很简单:菜单栏“设计”-“水印”(选择“自定义水印”),可以设置图片或文字水印。 ...

xiaohuihui_1992的博客 1117

如何动态的给报表添加目录

需求描述: 在做一些似 word 报告格式报表,为了有更好的阅读效果,经常需要在首页增加一个目录导航页,这样就能够快速的知道关心的数据在第几页,但是报表不同于 word 文档,word 文档中格式都是固定的,所以能够方便快速的生成目录页,在报表中数据都是动态变化的,并且通常会涉及到动态扩展,这样很难固定目录项,并且由于数据动态扩展,对应的页码也很难精确获得,下面通过一个实例看下,如果在报表中...

FM78_CSDN的博客 294

java 动态统计报表_对勾选数据动态统计

在实际应用中,有这样一种型的统计报表,通过对页面上数据的勾选,来动态的进行统计值的运算,如累加,平均等.那么这需求在报表中如何来实现呢?下面通过一个小例子来简单介绍以下.首先,准备一个统计报表:数据结构: 数据: 然后,我们复杂报表设计" target="_blank" class="quieeLink1">设计以下展现模版: 然后,我们把A1单元格的数据型改成HTML,写入:把A2单...

weixin_33846982的博客 789

动态列 模板_动态列报表的制作

【摘要】销售人员 A:我要求可以随查看客户表的部分信息,便于掌握客户最新动态行政人员 B:我要求可以随查看雇员表的部分信息,便于掌握每位员工的情况负责前端的你:???两个表实现的话,工作量就多了,一个表怎么实现动态需求呢?呐 ~ 救星来了!一个报表真的可以搞定多个需求:动态列报表的制作随查看关心数据在数据信息系统中,常常会看到这样一报表需求,它们往往格式简单,一般为列表式明细报表,但是要显...

weixin_28718345的博客 191

怎样实现动态列报表,也就是列数不固定的报表?

一般有两种实现方式: 1. 通过报表工具来做如下图这样的,浏览候选择不同的指标,就可以展现不同的列 具体做法参考 动态列报表的制作 2 通过 BI 来做,如下图这样,拖拽需要的列到展示区,需要什么拖拽什么就可以,也是动态的 具体资料可以参 把 Excel 透视表搬到 WEB 上 ...

cainiao_M的博客 325

数据分析-------动态报表制作

哈喽~~大家好,我是小白##,今天给大家分享的是动态报表制作。

qq_54730312的博客 647

金蝶K3直接SQL报表实现动态行列报表

我们知道,在BOS开发中,想实现动态行列报表,可以使用交叉分析表来实现,但交叉分析表不太灵活,比如当动态列中有需要复杂的逻辑运算来实现就无能为力了,下面介绍使用直接SQL报表来实现,也许能给你一点启发。 以如下表数据为例,来说明如何实现: 要求实现这样的报表样式: 具体实现步骤如下: 1、使用以下存储过程随便建一个直接SQL报表「测试行列换报表」。 CREATE Procedure sp_Rpt_Test AS SET NOCOUNT ON SELECT FUs...

Eypsn的专栏 1860

如何制作动态层分组报表

润乾报表提供了单元格同值合并的功能,可以实现动态层次的分组报表。这里通过一个例子来说明使用过程。 目标报表: 需要根据参数动态传递分组字段,按不同维度汇总订单运货费。如参数输入“货主地区, 货主城市”,显示的报表效果如下: 当参数输入“货主地区, 运货商, 货主城市”,报表显示如下: 以下为具体实现步骤: 1、连接数据源 连接润乾报表设计器自带 DEMO 数据源: 2、...

rqgxy的博客 179
上一篇: 选择最合适的模板--比较PHPLIB Template和FastTemplate
下一篇: 阳朔之旅
nihilism
博客等级 码龄24年 2粉丝 16原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值