`
winphfar
  • 浏览: 47839 次
  • 性别: Icon_minigender_1
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

php中email的发送

阅读更多

在php中发送Email可以直接调用系统的mail()函数来完成,但是前提是你在php.ini文件中对mail都已经配置好了,以下为相关的配置信息:

[mail function]
; For Win32 only.
SMTP = localhost
smtp_port = 25

; For Win32 only.
;sendmail_from = me@example.com

; For Unix only.  You may supply arguments as well (default: "sendmail -t -i").
;sendmail_path =

; Force the addition of the specified parameters to be passed as extra parameters
; to the sendmail binary. These parameters will always replace the value of
; the 5th parameter to mail(), even in safe mode.
;mail.force_extra_parameters =

 

Mail 配置选项

 

名称 默认 描述 可更改
SMTP "localhost" Windows 专用:SMTP 服务器的 DNS 名称或 IP 地址。 PHP_INI_ALL
smtp_port "25" Windows 专用:SMTP 段口号。自 PHP 4.3 起可用。 PHP_INI_ALL
sendmail_from NULL

Windows 专用:规定从 PHP 发送的邮件中使用的 "from"

 地址。

PHP_INI_ALL
sendmail_path NULL Unix 系统专用:规定sendmail 程序的路径(通常 /usr/sbin/sendmail 或 /usr/lib/sendmail) PHP_INI_SYSTEM

 

上面写的很清楚,要是windows的服务器,必须装好开启本地的smtp服务器,在linux和unix下,要用到sendmail,所以得配置好sendmail,根据自己的实际情况选择适当的配置信息。

mail()函数如果邮件的投递被成功地接收,则返回 true,否则返回 false,语法:

mail($to,$subject,$message,$headers,$parameters)

 

 

参数 描述
$to 必需。规定邮件的接收者。
$subject 必需。规定邮件的主题。该参数不能包含任何换行字符。
$message 必需。规定要发送的消息。
$headers 必需。规定额外的报头,比如 From, Cc 以及 Bcc。
$parameters 必需。规定 sendmail 程序的额外参数。

 

 

简单的发封邮件,代码如下:

 

<?php

$txt = "First line of text\nSecond line of text";

// 如果一行大于 70 个字符,请使用 wordwrap()。
$txt = wordwrap($txt,70);

// 发送邮件
mail("somebody@example.com","My subject",$txt);
?>

 

如果是一封带HTML格式的Email则代码如下:

 

<?php

$to = "somebody@example.com, somebodyelse@example.com";
$subject = "HTML email";

$message = "
<html>
<head>
<title>HTML email</title>
</head>
<body>
<p>This email contains HTML Tags!</p>
<table>
<tr>
<th>Firstname</th>
<th>Lastname</th>
</tr>
<tr>
<td>John</td>
<td>Doe</td>
</tr>
</table>
</body>
</html>
";

// 当发送 HTML 电子邮件时,请始终设置 content-type
$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type:text/html;charset=iso-8859-1" . "\r\n";

// 更多报头
$headers .= 'From: <webmaster@example.com>' . "\r\n";
$headers .= 'Cc: myboss@example.com' . "\r\n";

mail($to,$subject,$message,$headers);
?>

 

函数很简单,看似很好用,但是实际上局限性很明显,必须是在本地的开启smtp的情况下,而且经过测试成功率不是很高,所以程序中很少有人用到mail()函数来发邮件。

如果要扩展功能的话,还得重新构造,网上也有好多现成的类可以直接调用来实现,其实就是靠fsockopen来进行连接smtp,下面的代码是个思路:

<?
名称:smtpsend.class.php
功能:邮件发送类,实现邮件发送功能 ,可以发送html邮件;可验证用户是否具有发送权限;可实现从任意服务器邮箱发送邮件,并非局限于本机。

$smtpserver; SMTP服务器
$smtpserverport; SMTP服务器端口
$smtpuser; SMTP服务器的用户帐号
$smtppass; SMTP服务器的用户密码
$fromMail; SMTP服务器的用户邮箱
$toMail; 发送给谁
$subject; 邮件主题
$content; 邮件内容
$mailtype; 邮件格式(HTML/TXT),TXT为文本邮件
*/
class smtpclass
{

    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 = 60; //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, $returnpath = "", $cc = "", $bcc = "", $additional_headers = "")
 
 {
 
 $mail_from = $this->get_address($this->strip_comment($from));
 
 $body = ereg_replace("(^|(\r\n))(\.)", "\1.\3", $body);
 
 
 $header = "";
 if(isset($returnpath) && $returnpath != "")
 {
 $header .= "Reply-To:".$returnpath."\r\n";
 }
 
 $header .= "MIME-Version:1.0\r\n";
 
 if($mailtype=="HTML"){
 
 $header .= 'Content-Type:text/html; charset=gb2312' . "\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;
  
  }
 
 }
 function senduserMail($smtpserver,$smtpserverport=25,$smtpuser,$smtppass,$fromMail,$toMail,$subject,$content,$mailtype='HTML')
  {
      if ($fromMail == "") {
       die("发件人不能为空!");
      }
      if ($smtpuser == "") {
       die("用户名不能为空!");
      }
      if ($smtppass == "") {
       die("用户密码不能为空!");
      }
      if ($subject == "") {
       die("标题不能为空!");
      }
      if ($toMail == "") {
       die("收件人不能为空!");
      }
      if ($content == "") {
       die("内容不能为空!");
      }
      
      $smtpserver = $smtpserver;//SMTP服务器
   $smtpserverport = $smtpserverport;//SMTP服务器端口
   $smtpuser = $smtpuser;//SMTP服务器的用户帐号
   $smtppass = $smtppass;//SMTP服务器的用户密码
   $smtpusermail = $fromMail;//SMTP服务器的用户邮箱
   $smtpemailto = $toMail;//发送给谁
   $mailsubject = $subject;//邮件主题
   $mailbody = $content;//邮件内容
   $mailtype = $mailtype;//邮件格式(HTML/TXT),TXT为文本邮件
    
   $this->smtp($smtpserver,$smtpserverport,true,$smtpuser,$smtppass);//这里面的一个true是表示使用身份验证,否则不使用身份验证.
         //$smtp->debug = TRUE;//是否显示发送的调试信息
         $this->sendmail($smtpemailto, $smtpusermail, $mailsubject, $mailbody, $mailtype);
  }
 
}
//$smtp = new smtpclass();
//$smtp->senduserMail("mail.163.com",25,"用户名","密码","xxx@xxx.com.cn","xx@xx.com","测试","测试一下","TXT"); 
?>

 

以上在网上看到的,其实具体的方法都是大同小异,用的很多的是一个开源的角phpmailer,很方便的,源码在附件里,需要的可以下载,这里贴出的是测试代码:

 

<? 
require("class.phpmailer.php");
require("class.smtp.php");
//以下是实例:

$mail = new phpmailer(); //建立邮件发送类
$address =xxx@xxx.com';
$mail->IsSMTP(); // 使用SMTP方式发送
$mail->Host = "mail.xxx.com"; // 您的企业邮局域名
$mail->SMTPAuth = false; // 启用SMTP验证功能
$mail->Username = "xxx"; // 邮局用户名(请填写完整的email地址)
$mail->Password = "xxx"; // 邮局密码

$mail->From = "xxxx@xxxx.cn"; //邮件发送者email地址
$mail->FromName = "您的名称";
$mail->AddAddress("$address", "");//收件人地址,可以替换成任何想要接收邮件的email信箱,格式是AddAddress("收件人email","收件人姓名")
//$mail->AddReplyTo("", "");

//$mail->AddAttachment("/var/tmp/file.tar.gz"); // 添加附件
//$mail->IsHTML(true); // set email format to HTML //是否使用HTML格式

$mail->Subject = "PHPMailer测试邮件"; //邮件标题
$mail->Body = "Hello,这是测试邮件"; //邮件内容
$mail->AltBody = "This is the body in plain text for non-HTML mail clients"; //附加信息,可以省略

if(!$mail->Send())
{
 echo "邮件发送失败. <p>";
 echo "错误原因: " . $mail->ErrorInfo;
 exit;
}

echo "邮件发送成功";

?>

 

 

 

 

 

3
0
分享到:
评论
1 楼 tanliwei 2014-07-07  

测试代码第十行
$mail->SMTPAuth改为true
$mail->SMTPAuth = true; // 启用SMTP验证功能
否则会报错:
SMTP Error: From address

测试代码第一行
少了php
<?php

相关推荐

    phpemail邮件发送demo

    "phpemail邮件发送demo"是一个关于如何使用PHP进行邮件发送的示例项目,它包含了必要的代码和配置文件,便于开发者理解和实现邮件功能。 邮件发送类是这个项目的核心部分,通常这样的类会封装SMTP(Simple Mail ...

    非常好用的email发送类 PHP的

    这正是描述中提到的“email发送类 PHP写的”的意义所在,它提供了一个功能丰富的接口,以处理这些高级需求。 在"email.php"文件中,通常会包含一个已实现的邮件发送类,这个类可能封装了SMTP协议,以通过SMTP服务器...

    PHP发送Email类

    PHP发email类,发送email邮件,两种方式

    php发送email

    根据给定的文件信息,我们可以总结出以下关于“PHP发送Email”的相关知识点: ### PHP发送Email的基本原理 在Web开发中,PHP是一种广泛使用的服务器端脚本语言,它支持多种功能,包括发送电子邮件。发送电子邮件...

    php发送email程序,E-mail发送程序

    在标题和描述中提到的“php发送email程序,E-mail发送程序”涉及到的是使用PHP来实现邮件发送功能,这是一个常见的需求,特别是在用户注册、密码重置、通知服务等场景下。下面将详细阐述如何使用PHP编写这样的程序,...

    PHP发送邮件的功能

    PHP实现发送邮件的功能; 不受服务器空间的影响,在任何...使用方法:进入email.php ,修改$mail-&gt;From、$mail-&gt;Username 和 $mail-&gt;Password 的值,即可成功发送邮件,修改$mail-&gt;AddAddress 可以修改接受邮件的邮箱;

    PHP发送EMAIL类以及实现方法

    标签中的"PHP+HTML实现发送EMAIL程序"意味着这个类可能特别强调了HTML邮件的支持,这对于创建更丰富的用户体验非常有用,比如包含图片、样式和链接。 总结来说,这个压缩包提供的"PHP发送EMAIL类"应该是实现邮件...

    PHP发送email的类

    标题提及的"PHP发送email的类"指的是PHPMailer类库,其核心文件`class.phpmailer.php`包含了处理邮件发送的全部功能。这个类库支持多种协议,如SMTP(简单邮件传输协议)和PHP的mail()函数,可以根据你的服务器配置...

    PHP发送邮件DEMO

    在PHP中发送邮件是一项常见的任务,特别是在开发Web应用程序时,我们经常需要向用户发送确认邮件、密码重置链接或订阅通知等。这个“PHP发送邮件DEMO”提供了一个基础的框架,帮助开发者快速理解并实现PHP邮件发送...

    phpmailer 调用远程smtp服务器发送邮件

    2. **引入 PHPMailer 类**:在需要发送邮件的 PHP 文件中,引入 `class.phpmailer.php` 和 `class.smtp.php` 文件。如果你已经通过 Composer 安装了 PHPMailer,那么可以使用 `require_once 'vendor/autoload.php';`...

    php email 发送邮件的哦 2种方法

    在PHP中发送电子邮件是开发过程中常见的一项任务,用于与用户进行互动,如验证注册、发送通知或接收反馈。...以上就是两种在PHP中发送邮件的方法,它们各自适用于不同的场景和需求。请根据实际情况选择适合的方案。

    php-email类

    在PHP编程中,电子邮件功能是十分常见的需求,用于发送通知、确认信息或者用户通信等。本文将深入探讨如何使用PHP实现基于SMTP(Simple Mail Transfer Protocol)的邮件发送,并结合一个名为"email"的类来说明具体...

    邮件(Email)发送类PHPMailer v2.2.1.rar

    PHPMailer,是一个为了实现PHP平台上发送电子邮件(Email)的优秀国外PHP类库。它最主要的两个特点:发送HTML内容格式的Email和发送带附件的Email。PHPMailer基本上能够实现所有邮箱本身所包含的邮件发送功能,包括...

    php中用phpmailer发送邮件.pdf

    在 PHP 中,使用 mail 函数可以发送邮件,但是它要求服务器支持 sendmail 或者设置一台不需要中继的邮件发送服务器,但这种方法往往无法成功发送email。相比之下,使用 PHPMailer 可以轻松发送邮件,并提供了许多...

    phpEmail

    资源标签中的“控件”可能是指“phpEmail”提供了一套接口或类,使得开发者可以通过简单的API调用来实现邮件的发送。这些控件通常包括设置发件人、收件人、主题、正文、附件等功能,以及配置SMTP服务器的详细信息。 ...

    PHP发送邮箱验证码

    在压缩包中的"mail"文件可能是PHPMailer的示例代码或者实际的PHP发送邮件脚本。你可以打开这个文件,根据上述指导进行学习和修改,以满足你的具体需求。记得在实际操作时替换为自己的QQ邮箱信息,并确保SMTP服务已...

    PHP 发送邮件类,含实例(客发送附件)

    在PHP编程中,发送邮件是一项常见的任务,尤其在构建网站时用于用户注册验证、通知服务或者客户服务交流。本文将深入探讨如何使用PHP实现邮件发送功能,重点是包含附件的邮件发送。我们将基于PHP的`PHPMailer`库进行...

    冰翎email发送类 v1.0.rar

    《冰翎Email发送类v1.0:基于SMTP协议的PHP邮件发送实现详解》 在IT行业中,电子邮件的发送是日常开发中常见的需求之一,尤其在通知用户、发送验证码或订阅服务等方面。PHP作为一种广泛使用的服务器端脚本语言,...

    email_send_test.rar_email-test.php_php email_php 邮件_send_email.p

    标签中的"php_email"和"send_email.php"进一步强调了这个示例专注于使用PHP进行邮件发送。`send_email.php`可能是另一个用来发送邮件的脚本,可能包含更复杂的邮件配置或使用了其他PHP邮件库,如PHPMailer或...

Global site tag (gtag.js) - Google Analytics