当前位置: 澳门新濠3559 > 编程 > 正文

便可方便地编出一个在线发信页面,PHPMailer不能

时间:2019-11-22 20:51来源:编程
正文: 网上发送Email,可要用到mail()函数了。其格式如下: mail;在网上,发送Email给站长,通常是这样的:webmaster@163.com这样,当点击了webmaste崐r@163.com这个链接之后,就会启动默认的邮

正文: 网上发送Email,可要用到mail()函数了。其格式如下: mail; 在网上,发送Email给站长,通常是这样的:webmaster@163.com 这样,当点击了webmaste崐r@163.com这个链接之后,就会启动默认的邮件编缉器来写Email,实在是麻烦,使用mail()函数,便可方便地编出一个在线发信页面。这种崐页面的收件人是固定的,有需再填收件人地址了,而主题我们也可以将把它定下来。如下例: 文件:email.html

?>

PHPMailer不能连接SMTP服务器,和修改SMTP大小写没有关系

 代码如下

发信给网管

 代码如下

(2011-10-22 12:17:35)

<html>
<head>
<title>发信给网管</title>
</head>
<body>
<h2 align="center">网管收信</h2><br>
<hr><br>
<center>
<form action="mail.php">
发件人:<input type="text" name="from" size=25><br>
主题:<input type="text" name="subject" size=20><br>
内容:
<textarea name="content" cols=80 rows=15>你好,站长:</textarea><br>
<input type="submit" value="寄出"> <input type="reset" value="重写"><br>
</form>
</body></html>

网管收信


文件:mail.php

返回";} $body="[主题] $subjectn"; $body.="[发件人] $fromn"; $body.=$content; $deal=mail("webmaster@163.com",$subject,$body,"From:$from"); if {echo "寄件成功!";}else{echo "寄件失败!!!";} ?> PHP介绍到此,也差不多了,你是不是感到了PHP的强大,是不是也想加入PHP的行列,就现在吧。要使自己在PHP中飞翔,这点知识还是崐不足的,它只能帮你入门而已。入门之后,就修行在个人了。我的朋友,再见──--

<html>
<head>
<title>发信给网管</title>
</head>
<body>
<h2 align="center">网管收信</h2><br>
<hr><br>
<center>
<form action="mail.php">
发件人:<input type="text" name="from" size=25><br>
主题:<input type="text" name="subject" size=20><br>
内容:
<textarea name="content" cols=80 rows=15>你好,站长:</textarea><br>
<input type="submit" value="寄出"> <input type="reset" value="重写"><br>
</form>
</body></html>

转载▼

php代码

mail.php文件代码

标签:

php

phpmailer

杂谈

分类: 默认分类

 代码如下

<?php
if (empty($from) or empty($subject) or empty($content)) {
 echo "没有完成填写,请<a href='mail.html'>返回</a>";
}
$body="[主题] $subjectn";
$body.="[发件人] $fromn";
$body.=$content;
$deal=mail("");
if ($deal) {echo "寄件成功!";}else{echo "寄件失败!!!";}
?>

PHPmailer无法发送邮件,提示错误Error: Could not connect to SMTP host

<?php
if (empty($from) or empty($subject) or empty($content)) {
 echo "没有完成填写,请<a href='mail.html'>返回</a>";
}
$body="[主题] $subjectn";
$body.="[发件人] $fromn";
$body.=$content;
$deal=mail("");
if ($deal) {echo "寄件成功!";}else{echo "寄件失败www.111cn.net!!!";}
?>

关于php mail函数

博客之前有两篇文章,《PHPMailer::不能连接SMTP服务器》《PHPMailer不能连接SMTP服务器的两种常见原因便可方便地编出一个在线发信页面,PHPMailer不能连接SMTP服务器。》
一为转载,一为笔记,结果误人子弟了,不是每个人能解决问题。
有朋友来信求助,我也着急。虽然后来解决了,但我还是不得要领,静下心来又看了看

mail 简介
http 函数允许您从脚本中直接发送电子邮件。
需求
要使邮件函数可用,php 需要已安装且正在运行的邮件系统。要使用的程序是由 php.ini 文件中的配置设置定义的。
安装
邮件函数是 php 核心的组成部分。无需安装即可使用这些函数。
运行时配置
邮件函数的行为受 php.ini 的影响。

PHPMailer不能连接SMTP服务器,究竟为什么?先用代码检测一下:

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)

<?
function Get_host($host){  //解析域名
$Get_host=gethostbyname($host);
echo "尝试连接 $host ...<br>rn ";
if(!$Get_host){
$str= "解析失败 (1)<HR>";
}elseif($Get_host==$host){
$str= "解析失败 (2): 可能是一个无效的主机名<HR>";
}else{
echo "域名解析为 $Get_host ...<br>rn";
Open_host($host);}
echo $str;
}

 

Function Open_host($host){  //连接主机

if(function_exists('fsockopen')){
$fp = fsockopen($host,25,&$errno,&$errstr,60);
  elseif(function_exists('pfsockopen')){
    echo "服务器不支持Fsockopen,尝试pFsockopen函数 ...<br>rn";
    $fp = pfsockopen($host,25,&$errno,&$errstr,60); }
  else
    exit('服务器不支持Fsockopen函数');

if(!$fp){
echo "代号:$errno,<br>n错误原因:$errstr<HR>";
}else{
echo "SMTP服务器连接ok!<br>rn";
fwrite($fp, "");
$out0= fgets($fp, 128);
#echo $out0;
if (strncmp($out0,"220",3)==0){ // 判断三位字符内容
echo '220 SMTP服务端响应正常<HR>';
}else{
echo '服务器端错误<HR>';}
}
}
//SMTP服务器地址
$site = array("smtp.163.com","smtp.sina.cn","smtp.sina.com","smtp.qqq.com","smtp.126.com");

//调运脚本
#$host="smtp.163.com";
#echo Get_host($host);

for ($i=0; $i<=4; $i++)
{  
$host= $site[$i];
 echo Get_host($host);
}

PHPmailer是一个非常棒的PHP发送mail类,处理错误则侧重于和SMTP服务器会话过程中的问题,比如身份验证不对、收件人为空的错误提示,但是对于连接到smtp过程的错误提示以“Could not connect to SMTP host”一言蔽之,导致了很多问题没能解决,更可笑的是导致一些有用却讲不出道理的方法流传于世,可见,冥冥中一切皆有定数。

好了,不说口水话了。
想要搞清楚Could not connect to SMTP host的原因,自然要明白连接服务的步骤
一次完整有效的SMTP发信过程应该包括:解析域名、连接SMTP服务器、验证身份、确定收件人和信件内容、发送

上面那段PHP代码就是把这几个步骤分开来做,找出原因,然后寻找方法。回显的结果大概有如下几种:

1、解析失败 (2): 可能是一个无效的主机名
说明域名无法解析。可能是DNS级别的问题。联系管理员或者更换服务商

2、服务器不支持Fsockopen,尝试pFsockopen函数
如果用pfsockopen函数连接服务器成功了,则修改class.smtp.php 的$this->smtp_conn = fsockopen( 为$this->smtp_conn = pfsockopen( 。使PHPmailer恢复正常使用

3、服务器端错误
成功和远程主机建立连接,不过对方没有安装SMTP协议发送220响应码,说明SMTP服务器可能有问题

4、220 SMTP服务端响应正常

好吧,不论是fsockopen函数还是pfsockopen函数,已经和远程的SMTP服务器正常连接了。如果是无法用PHPmailer发信,我强烈建议你换一个账号重新试一下

5、其他报错,比如这样

Warning: fsockopen(): unable to connect to smtp163.com:25
你绝对有理由相信是防火墙搞的鬼! 这种情况下,如果不能联系管理员改防火墙规则 你可以试试《PHPMailer::不能连接SMTP服务器》中的方法,
搜索
function IsSMTP() {
$this->Mailer = 'smtp';
}

改成:
function IsSMTP() {
$this->Mailer = 'SMTP';
}

正如我标题所言“PHPMailer不能连接SMTP服务器,和修改SMTP大小写没有关系”。当然我不可能恶趣味的作弄你,而是有时候真的有效,治愈成功率多大就看你的人品了

来分析一下原因吧。
这句代码大概在class.phpmailer.php286行左右。这个函数在使用PHPmailer类时要首先调用,用以声明发送mail的方式

跟踪this->Mailer 到 class.smtp.php 400行左右 

switch($this->Mailer) {
      case 'sendmail':
        $result = $this->SendmailSend($header, $body);
        break;
      case 'smtp':
        $result = $this->SmtpSend($header, $body);
        break;
      case 'mail':
        $result = $this->MailSend($header, $body);
        break;
      default:
        $result = $this->MailSend($header, $body);
        break;

首先smtp绝对不等于SMTP!这一基本原则我居然都会忘掉。
所以,上面的条件都不满足 PHPmailer将执行 $result = $this->MailSend($header, $body);这句

再来跟踪MailSend()函数 在class.phpmailer.php 460行左右:

  function MailSend($header, $body) {
    $to = '';
    for($i = 0; $i < count($this->to); $i++) {
      if($i != 0) { $to .= ', '; }
      $to .= $this->AddrFormat($this->to[$i]);
    }

    $toArr = split(',', $to);

    $params = sprintf("-oi -f %s", $this->Sender);
    if ($this->Sender != '' && strlen(ini_get('safe_mode')) < 1) {
      $old_from = ini_get('sendmail_from');
      ini_set('sendmail_from', $this->Sender);
      if ($this->SingleTo === true && count($toArr) > 1) {
        foreach ($toArr as $key => $val) {
          $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
        }
      } else {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
      }
    } else {
      if ($this->SingleTo === true && count($toArr) > 1) {
        foreach ($toArr as $key => $val) {
          $rt = @mail($val, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header, $params);
        }
      } else {
        $rt = @mail($to, $this->EncodeHeader($this->SecureHeader($this->Subject)), $body, $header);
      }
    }

    if (isset($old_from)) {
      ini_set('sendmail_from', $old_from);
    }

    if(!$rt) {
      $this->SetError($this->Lang('instantiate'));
      return false;
    }

    return true;
  }

注意$rt = @mail( 这是用PHP内置的mail函数发信啊!

来自W3School的mail发信实例

<?php
$to = "somebody@example.com"; //这里改成你的邮箱地址
$subject = "My subject";
$txt = "Hello world!";
$headers = "From: dongfangtianyu@qq.com" . "rn" .
mail($to,$subject,$txt,$headers);
?>

如果在你的服务器上运行这脚本能够收到邮件,那么你完全可以用修改SMTP大小写的方法。不过,毕竟不大好用

.

想要使用mail函数函数发信,需要修改设置php.ini,也即是说,成与不成得看你的服务提供商。
如果服务器已经设置好了mail()相关的一切,PHPmailer使用mail()的方法当然可以发信成功。不再依赖fsockopen函数

这也就是为什么防火墙禁止的情况下,用修改smtp大小写反而能用PHPmailer发信,因为那封e-mail根本是用本地的smtp服务器代发的
亲爱的朋友,你明白了吗?

 

编辑:编程 本文来源:便可方便地编出一个在线发信页面,PHPMailer不能

关键词: