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

php通过socket编程,以SMTP将邮件发送到指定的QQ邮箱里面。 阅读详情


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("sm.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);

?>


SMTP邮件发送问题和解决方案(使用PHP) 使用PHPMailer库可以简化SMTP邮件发送的过程,并提供了一些有用的功能和解决方案。在配置SMTP服务器信息后,您可以使用PHPMailer的API设置邮件内容并发送电子邮件。接下来,我们设置发件人和收件人的电子邮件地址和名称,设置邮件主题和正文内容。在发送SMTP邮件之前,首先需要配置SMTP服务器的相关信息,包括主机名、端口号、用户名和密码等。在使用SMTP发送邮件时,可能会遇到一些常见的问题。以上是一些常见的问题和解决方案,希望能帮助您顺利发送SMTP邮件。问题1:邮件发送失败,没有错误消息。 阅读详情

相关推荐

Qt实战:用QTreeView+QStandardItemModel实现多级多列文件浏览器(附完整代码)

本文深入探讨了使用Qt的QTreeView与QStandardItemModel构建多级多列文件浏览器的完整实践。通过分析模型/视图框架的优势,详细演示了从基础框架搭建、模拟数据填充,到对接真实文件系统实现懒加载的全过程。文章还涵盖了自定义委托、多列排序、右键菜单等高级定制技巧,并提供了性能优化建议和完整的代码示例,帮助开发者打造功能强大且高效的工业级文件管理界面。

weixin_29021291的博客 424

php smtp 抄送,PHP-SMTP发送邮件

/***邮件发送类*/classMail{//SMTP服务器名称private$SmtpHost;/*SMTP服务端口+标准服务端口,默认为25*/private$SmtpPort=25;//SMTP用户名private$SmtpUser='';//SMTP用户密码private$SmtpPassword='';/*超时时间+用于fsockopen()函数,超...

weixin_42498163的博客 906

Cadence SKILL 语言实战指南:从函数列表到高效自动化脚本

本文是Cadence SKILL语言实战指南,旨在帮助芯片设计工程师从掌握核心函数列表出发,高效构建自动化脚本。文章详细解析了数据处理、数据库访问、流程控制及错误处理四类关键函数,并通过版图层批量修改与参数化单元生成两大实战场景,演示如何将函数组合成解决实际问题的自动化方案,从而显著提升Virtuoso环境下的工作效率。

beta5的博客 705

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 Variabl

liumengcheng的专栏 785

tuts4you-lena151-Crackme-tutorial06

一、前言      本次研究的是lena151-Crackme-tutorial06,也是一个应用程序,但因为平台迭代的关系,程序不能正常运行,只能完成部分破解。 (一)·本次我们要破解的目标是个应用程序,如下图 (二)、使用工具:x32dbg 二、过程 这个程序的破解的方法很多,首先最简单的一种不外乎就是搜索字符串,我就按照这个思路来完成。 (一)查找字符串&lt;Unregis...

h123120的专栏 518

告别倍福开发板:手把手教你用SSC工具为STM32生成EtherCAT从站代码

本文详细介绍了如何使用SSC工具为STM32生成EtherCAT从站代码,帮助开发者在不依赖倍福开发板的情况下实现高效的工业以太网通信。通过SSC工具的配置、XML文件设计、代码移植与硬件适配等步骤,开发者可以轻松构建自定义的EtherCAT通信系统,提升工业自动化项目的灵活性和效率。

weixin_33925615的博客 410

php smtp 发送邮件

smtp 发送邮件 PHP发送邮件

靳某某 1156

单细胞测序中pseudo bulk差异分析的实战指南与审稿人应对策略

本文提供了单细胞测序中pseudo bulk差异分析的完整实战指南,旨在应对审稿人对样本量统计效力的质疑。文章详细解析了从数据聚合、使用DESeq2进行差异分析,到与单细胞水平结果进行交叉验证的全流程,并给出了应对常见问题与撰写回复的策略,帮助研究者提升结论的稳健性与说服力。

weixin_29214199的博客 820

php 怎么安装邮件服务器,烂泥:Postfix邮件服务器搭建之软件安装与配置

本文由ilanniweb提供友情赞助,首发于烂泥行天下想要获得更多的文章,可以关注我的微信ilanniwebPostfix邮件服务器的搭建需要使用到几个软件,分别是cyrus-sasl、postfix、dovecot、postfixadmin、roundcubemail,只有这几个软件相互配合才能搭建一套完整的邮件服务器。PS:本次实验在centos6.5 64bit上进行。一、软件功能介绍cyr...

weixin_30015371的博客 745

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现(完结,附带项目源码)

【制作100个unity游戏之30】使用unity实现一款2d俯视角RPG战斗游戏,主要使用InputSystem+有限状态机+A*寻路实现

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4653

Python爬虫实战:利用Playwright与反反爬技术抓取Crunchbase企业数据

在当今数据驱动的商业环境中,获取准确的企业信息对于市场分析、竞争情报和投资决策至关重要。Crunchbase作为全球领先的企业信息平台,包含了数百万家公司、投资者和关键人员的详细数据。本文将深入探讨如何使用Python最新爬虫技术Playwright,结合多种反反爬策略,高效抓取Crunchbase企业数据。我们将从爬虫基础概念讲起,逐步深入到高级技巧,并提供完整的代码实现,帮助读者掌握现代网络数据采集的核心技术。网络爬虫技术自互联网诞生以来经历了显著演变。

2201_76125261的博客 1833

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

class.smtp.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; /* P

海上生明月 1438

【基于CKF的IMM】CV和CT两个模型下的IMM,二维,滤波使用CKF(容积卡尔曼滤波),附完整的matlab代码

该文章摘要: 本文提出了一种基于交互多模型(IMM)和容积卡尔曼滤波(CKF)的融合定位算法,用于解决目标在直线运动和转弯机动之间的模型切换问题。通过MATLAB仿真实现了IMM-CKF算法,并与单一的CV-CKF(匀速模型)和CT-CKF(匀角速转弯模型)方法进行对比。实验结果表明,在包含直线段和转弯段的复合轨迹跟踪中,IMM-CKF方法能够自适应调整模型权重,显著提高了定位精度。轨迹跟踪图、位置/速度误差对比图以及模型概率曲线直观展示了IMM算法的优势。文章提供了完整的MATLAB实现代码,可用于目标跟

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 615

php发送邮件二种方法 php使用smtp发送邮件

原文:http://www.jbxue.com/php/25502.html 本文介绍了php发送邮件的两种方法,分别是使用PHP内置的mail()函数发送邮件,使用封装SMTP协议的邮件类发送邮件,推荐使用smtp协议封装的邮件类实现邮件发送。 php如何发送邮件呢?方法有很多,但用的最多的还是使用smtp协议来发送邮件,一起来学习下吧。 专题推荐:php发邮件代码大全 一、

lorielei的博客 3606

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

php mail方法_php邮件发送的两种方式

这篇文章研究的主要内容就是使用PHP来发送电子邮件,总结为以下两种方法:一、使用PHP内置的mail()函数$to = "test@163.com"; //收件人$subject = "Test"; //主题$message = "This is a test mail!"; //正文mail($to,$subject,$message);结果就直接报错,如下:Warning: mail() [f...

weixin_30863333的博客 1484

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

XAMPP 下配置SMTP mail服务,使PHP的mail() 函数可以发送邮件

为什么80%的码农都做不了架构师?>>> ...

weixin_34199335的博客 569

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

php email,两种PHP邮件发送的方式

有不少程序员在用PHP发送邮件的时候会遇到几个问题,那么遇到问题就要有解决问题的思路,本文就是根据php实现邮件发送的思路,整理下来的一篇文章,在遇到不同问题时给出的不同解决方法,感兴趣的小伙伴们可以参考一下。一、使用PHP内置的mail()函数...

weixin_33435461的博客 1219

XAMPP下配置SMTP mail服务,使PHP…

PHP的mail() 邮件函数很简单,但也导致了不能使用目前流行的 带验证功能的 SMTP 服务器(gmail, 163, 126等) 现在通过配置 XAMPP 提供的 sendmail 来使得 PHP 的 mail() 函数可以正常发送邮件,下面以:smtp.126.com 为例: 1. 找到 xampp/php/php.ini 文件,找到 [mail function] 语句块,修改如下: 1

Anders的技术成长专栏 3028

PHP发送邮件的两种方法分别是使用mail()函数和使用mailer类

PHP 函数通常通过本地邮件服务器发送,通常在 Linux、BSD 和 macOS 平台上以二进制文件开头,但是,Windows 通常不包括本地邮件服务器;有无数重叠(和冲突)的标准,需要严格遵守极其复杂的格式和编码规则——你在网上找到的绝大多数直接使用该功能的代码都是完全错误的,如果不是不安全的!纯文本邮件不支持HTML标记、样式、图片、附件或其他可视化元素,而仅仅是一段纯文本的消息。唯一直接支持此功能的 PHP 函数是。2.mailer类发送HTML格式的邮件、附件、内嵌图片等丰富内容的电子邮件。

zx990912的博客 931

php语言smtp类,自己写的一个php发送邮件的类(smtp协议)

class Smtp{private $Smtp = 'smtp.qq.com'; //邮件服务器private $PORS = 25; //邮件服务器端口private $LoginMail = ''; //邮件登陆用户账户private $LoginPass = ''; //邮件登陆用户密码private $...

weixin_28844359的博客 497

WordPress邮件发送优化:用SMTP替代PHP mail()函数

SMTP协议是电子邮件传输的核心标准,通过身份验证和加密机制确保邮件可靠投递。相比PHP原生mail()函数直接调用服务器sendmail服务的方式,SMTP协议支持SPF、DKIM等认证体系,能有效避免邮件被标记为垃圾邮件。在WordPress开发中,使用WP Mail SMTP等插件重构邮件发送流程,可显著提升送达率至98%以上。该方案特别适合需要用户注册验证、订单通知等关键业务的网站,通过可视化配置界面集成SendGrid、Mailgun等专业服务商,同时提供邮件队列、发送日志等企业级功能,是解决PH

weixin_31714129的博客 200

为什么你的PHP mail()函数总是失败?90%的人都忽略了这3个关键点

解决PHP邮件发送失败难题,深入解析mail函数配置关键细节。涵盖常见错误、服务器环境要求与安全设置三大核心点,助你快速实现稳定邮件发送。适用本地开发与线上部署场景,提升成功率,值得收藏。

LogicNest的博客 850

PHP如何通过SMTP验证发送邮件

原文地址:How to Send Email from a PHP Script Using SMTP Authentication   PHP mail()与SMTP验证 缺乏灵活性是PHP的mail()函数显得过于简单的部分原因。最重要而且令人沮丧的是,死板的mail()函数通常还不允许你使用你选择的SMTP服务器,并且它也根本不支持如今已被众多邮件服务器采用的SMTP验证。 幸运的是

我想跟代码谈谈 1万+

php如何发生邮件,php如何发送邮件?

php发送邮件的实现方法:1、使用PHP内置的“mail()”函数来发送邮件;2、封装一个SMTP协议的邮件类,使用SMTP协议来发送邮件。php如何发送邮件?总结了两种使用PHP来发送电子邮件的方法:1、使用PHP内置的mail()函数...

weixin_35739967的博客 391

php使用mail邮件服务器,PHP mail()中继到邮件服务器

does the PHP mail() function automatically create an SMTP message tothe server? Or do I have to set the php.ini settings to look at thelocalhost and then configure sendmail/postfix to send the message...

weixin_33201531的博客 374

配置mail使用SMTP发送邮件

转载请注明文章出处:https://tlanyan.me/config-mai... 前文“PHP回顾之发送邮件”介绍了邮件中的一些基本概念,今天分享在Linux上使用mail命令通过SMTP对外发送邮件。 mail、mailx和sendmail 先看一下三者的关系:mail是mailx的别名,最初叫nail(与arch linux目前...

weixin_34054931的博客 2181
上一篇: (原创)关于如何处理EXCEL( CSV)文件 导入数据库的解决方法!!
下一篇: 已经是凌晨2点了!
大白菜芯
博客等级 码龄23年 162粉丝 130原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值