Claws Mail不识别PHPMailer发送的附件的原因及解决办法

 更新时间:2016年11月25日 17:00  点击:1333
笔记遇到一个问题:Claws Mail不识别PHPMailer发送的附件,经过烽数次在网上找资料,终于找到原因并解决,现在把原因及解决办法整理如下 。

环境:Claws Mail 3.9.1, PHP 5.4.16, PHPMailer 5.2.6 c5e9f7873f

现象:PHPMailer 发送带附件的邮件,直接使用 AddAttachment() 方法

$mailer->AddAttachment($attach_file);

没有其他设置。Claws Mail 收到信以后,查看邮件内容为空白, 附件栏显示:

message/rfc822
    multipart/mixed

以下就是空白了。 而能够正常识别附件的邮件,附件栏内容一般为:

message/rfc822
    multipart/mixed
        text/plain
        text/html   (这个是附件的 mime 类型)

gmail 和 mutt 中识别这样的邮件是正常的。

分析:通过对比正常和不正常的邮件原始码, 发现不正常邮件在声明内容是分节之后,多了一句传输编码声明,比如:

Content-Type: multipart/mixed;
    boundary="b1_95a848b14cb4385965320b915d5829dd"
Content-Transfer-Encoding: base64

最后的 Content-Transfer-Encoding 就是比正常邮件多的一行。

由于邮件原始码的这个部分,只是用来声明后续邮件是多个部分组成, 并定义了每个部分的辨识边界 boundary,并没有实际的内容, 所以应当是不需要声明编码类型的。在 PHPMailer 中相关代码为:

  public function GetMailMIME() {
    $result = '';
    switch($this->message_type) {
      case 'inline':
        $result .= $this->HeaderLine('Content-Type', 'multipart/related;');
        $result .= $this->TextLine("tboundary="" . $this->boundary[1].'"');
        break;
      case 'attach':
      case 'inline_attach':
      case 'alt_attach':
      case 'alt_inline_attach':
        $result .= $this->HeaderLine('Content-Type', 'multipart/mixed;');
        $result .= $this->TextLine("tboundary="" . $this->boundary[1].'"');
        break;
      case 'alt':
      case 'alt_inline':
        $result .= $this->HeaderLine('Content-Type', 'multipart/alternative;');
        $result .= $this->TextLine("tboundary="" . $this->boundary[1].'"');
        break;
      default:
        // Catches case 'plain': and case '':
        $result .= $this->TextLine('Content-Type: '.$this->ContentType.'; charset='.$this->CharSet);
        break;
    }
    //RFC1341 part 5 says 7bit is assumed if not specified
    if ($this->Encoding != '7bit') {
      $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
    }

特意加上了这个申明,因为按照 RFC1341,7bit 编码类型是默认的。

解决: 或许问题是出在 Claws Mail 上,但我暂时只能修改 PHPMailer 来适应这个问题了。 上面的问题弄清楚之后,在 multipart 后面不添加传输编码声明即可:

    //RFC1341 part 5 says 7bit is assumed if not specified
    // Not after multipart/mixed, claws-mail will not recoginize attachment
    if (($this->Encoding != '7bit') && (!in_array($this->message_type, array(
        'attach',
        'inline_attach',
        'alt_attach',
        'alt_inline_attach',
    )))) {
      $result .= $this->HeaderLine('Content-Transfer-Encoding', $this->Encoding);
    }

终于解决了这个问题,现在我们可以放心的用PHPMailer发送附件了。

PHPMailer是一个邮件发送插件了,我们可以把PHPMailer安装包解压到Vendor目录中之后然后简单的配置就可以发邮件了,下面来看一个例子.

最近一直在用ThinkPHP框架开发项目, 一般进行用户注册的时候都会发送一封验证邮件, 验证注册. 在这次做的CRM客户管理系统中需要用到邀请注册这个功能, 团队管理员注册之后可通过邮件邀请团队的其他人员进行注册. 如何给团队人员发送邮件, 很流行的一个邮件发送类库就是PHPMailer.

1. 下载PHPmailer并解压到ThinkPHP\Extend\Vendor文件夹下

2. 用ThinkPHP自带的Vendor方法载入第三方类库

3. 配置相关参数.

4.为了方便随意调用, 在common.php创建一个发送邮件的函数, 之后就可以调用此函数发送邮件了

/**
 * 邮件发送
 */
function sendMail(){
    // 载入邮件发送类库
    Vendor('PHPMailer.PHPMailerAutoload');

    $mail = new PHPMailer;

    $mail->isSMTP();        //设置PHPMailer使用SMTP服务器发送Email
    $mail->Host = 'smtp.163.com';   //指定SMTP服务器 可以是smtp.126.com, gmail, qq等服务器 自行查询
    $mail->SMTPAuth = true;
    $mail->CharSet='UTF-8';     //设置字符集 防止乱码
    $mail->Username = 'username@163.com';  //发送人的邮箱账户
    $mail->Password = 'xxxxxxxxxx';   //发送人的邮箱密码
    $mail->Port = 25;   //SMTP服务器端口

    $mail->From = 'user@admin.com';            //发件人邮箱地址
    $mail->FromName = '在路上';                //发件人名称
    $mail->addAddress('guest@test.com');      // 收件人邮箱地址 此处可以发送多个

    $mail->WordWrap = 50;                                 // 换行字符数
    $mail->isHTML(true);                                  // 设置邮件格式为HTML

    $mail->Subject = '青岛XXX';       //邮件标题
    $mail->Body    = '尊敬的先生/女士:<br/>非常抱歉,您接受到这封邮件是因您的好友邀请您加入我们的CRM系统体验当中,请点击以下链接注册账户<a href=####>######</a><br/>如您没有相关意向,请忽略';

    if(!$mail->send()) {
        echo '邮件发送失败.';
        echo '错误信息: ' . $mail->ErrorInfo;
    } else {
        echo '邮件发送成功';
    }
}


定义好函数之后,如果想发送邮件,直接调用 sendMail();

可把发送内容, 发送标题, 收件人全部设置为变量, 例如: sendMail($body, $title, $recipient)  收件人可为数组的形式, 在函数里面循环一下就搞定啦!!  SMTP服务器以及发件人的一些配置可以写到Conf\config.php文件中, 直接C()方法调用即可.


方法二,

第一步 先下载PHPMailer.class.php压缩包(本文上面有附件下载)

解压后会有如下的三个文件:

1.class.pop3.php
2.class.smtp.php
3.PHPMailer.class.php
PHPMailer.class.php这个文件就是核心的文件,把这个文件放到ThinkPHP的扩展包下路径如\下:ThinkPHP\Extend\Library

第二步 在ThinkPHP,common文件中新建一个common.php文件写入如下代码:

functionSendMail($address,$title,$message)
{
import('ORG.Net.PHPMailer');
$mail=newPHPMailer();
// 设置PHPMailer使用SMTP服务器发送Email
$mail->IsSMTP();
// 设置邮件的字符编码,若不指定,则为'UTF-8'
$mail->CharSet='UTF-8';
// 添加收件人地址,可以多次使用来添加多个收件人
$mail->AddAddress($address);
// 设置邮件正文
$mail->Body=$message;
// 设置邮件头的From字段。
$mail->From=C('MAIL_ADDRESS');
// 设置发件人名字
$mail->FromName='zyimm';
// 设置邮件标题
$mail->Subject=$title;
// 设置SMTP服务器。
$mail->Host=C('MAIL_SMTP');
// 设置为“需要验证”
$mail->SMTPAuth=true;
// 设置用户名和密码。
$mail->Username=C('MAIL_LOGINNAME');
$mail->Password=C('MAIL_PASSWORD');
// 发送邮件。
return($mail->Send());
第三步 在ThinkPHP,conf.php文件写入如下代码:

注意:以下是的我自己QQ邮箱的测试的,每个邮箱参数不同,具体以邮箱为准,qq邮箱的stmp需要自己到邮箱开启的。

returnarray(
//'配置项'=>'配置值'
'MAIL_ADDRESS'=>'799783009@qq.com', // 邮箱地址 
'MAIL_LOGINNAME'=>'799783009@qq.com', // 邮箱登录帐号
'MAIL_SMTP'=>'smtp.qq.com', // 邮箱SMTP服务器
'MAIL_PASSWORD'=>'******', // 邮箱密码
'SHOW_PAGE_TRACE'=>true,
);

第四步 剩下使用了。在ThinkPHP,IndexAction.class.php文件写入如下代码:

// 本类由系统自动生成,仅供测试用途
classIndexAction extendsAction {
publicfunctionindex(){
if(!empty($_POST['title']) && !empty($_POST['content'])){
if(SendMail("597417106@qq.com",$_POST['tile'],$_POST['content']))
echo'发送成功!';
else
echo'发送失败';
}
$this->assign('title','测试标题');
$this->display();
}
}
好了,就这么简单的

方法二算是一个标准的方法了,整体都放到thinkphp类中了,小编推荐使用第二种方案.

本例子是利用phpmailer来登录QQ邮件然后利用QQ邮件向指定邮件发送一封邮件的例子,希望本例子能帮助到各位同学哦。

PHP发邮件的例子,发邮件当然需要一个客户端邮箱,今天这个例子是使用QQ免费企业邮箱来做为发邮件的邮箱,

 代码如下 复制代码

<?php
include "PHPMailer/class.phpmailer.php";
function send_mail($frommail,$tomail,$subject,$body,$ccmail,$bccmail){
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug;
$mail->Host = "smtp.qq.com";
$mail->SMTPAuth = true;
$mail->Port = 25;
$mail->Username = "admin@51yip.com";
$mail->Password = "******";
$mail->AddReplyTo($frommail, 'tankzhang');
$mail->AddAddress($tomail);
$mail->SetFrom($frommail, 'tankzhang');
$mail->IsHTML(true);
$mail->Subject = $subject;
$mail->MsgHTML($body);
if(!$mail->Send())
{
echo "邮件发送失败. <p>";
echo "错误原因: " . $mail->ErrorInfo;
exit;
}else{
echo "success";
}
}
?>

调用上边的函数来发送邮件:

 代码如下 复制代码

$result= send_mail("admin@163.com","12345@qq.com","test","test","","");

注:如果没有QQ免费邮箱的朋友,可以自己去腾讯网站注册一个,然后添加成员和DNS,如果没有DNS服务器的话,就添加二个mx记录,比如使用dnspod。

PHP邮件发送例子我介绍过很多不过几乎都是使用phpmailer邮件插件来实现发送了,下面这个例子我是测试发送邮件成功的例子了哦。

在win下,

利用PHP的mail函数来发送邮件

mail()函数的作用:
是连接到邮件服务器
利用smtp协议,与该服务器交互
并投邮件

注意:
1:mail函数不支持esmtp协议,---即,只能直投,不能登陆
2: 由上条,我们只能直投至最终的收件服务器地址.
而该地址,又是在PHP.ini中指定的.


所以我们想用mail()函数往 aseoev@163.com发信的话
我们要---
1: 查询163邮件服务器的地址
2: 把该地址写到php.ini里去

 代码如下 复制代码

SMTP =  163mx02.mxmail.netease.com
sendmail_from = wusong@192.168.1.100

var_dump(mail('597417106@qq.com','from php mail function','very intresting'));

但是使用php自带的mail函数发送邮件我们需要在linux中安装一个sendmail组件才可以否则无法使用。

如果你没有这个sendmail组件我们可以使用phpmailer函数来操作

例子

 代码如下 复制代码
<?php
 
  require('./PHPMailer/class.phpmailer.php');
 
  $phpmailer = new PHPMailer();
 
  $phpmailer->IsSMTP();
 
  $phpmailer->Host = 'smtp.163.com';
  $phpmailer->SMTPAuth = true;
  $phpmailer->Username = '';
  $phpmailer->Password = '';
 
  $phpmailer->CharSet = 'utf-8';
  $phpmailer->From = '';
  $phpmailer->FromName = '';
  $phpmailer->Subject = '';
  $phpmailer->Body = '';
 
  $phpmailer->AddAddress('never_kiss@163.com','Aseoe');
 
  echo $phpmailer->send()?'发送成功':'发送失败';
 
 
?>

上面不带内容,下面看个带内容的

<?php


/**
用PHPMailer类来发信

 代码如下 复制代码

步骤:
0: 引入
1: 实例化
2: 配置属性
3: 调用发送

**/

require('./PHPMailer/class.phpmailer.php');

$phpmailer = new PHPMailer();


/*
设置phpmailer发信用的方式
可用用win下mail()函数来发
可以用linux下sendmail,qmail组件来发
可以利用smtp协议登陆到某个账户上,来发
*/

$phpmailer->IsSMTP();  // 用smtp协议来发

$phpmailer->Host = 'smtp.163.com';
$phpmailer->SMTPAuth = true;
$phpmailer->Username = '';  //发送邮箱的账号(用163邮箱发信的账号)
$phpmailer->Password = '';  //发送邮箱的密码

// 可以发信了
$phpmailer->CharSet='utf-8';
$phpmailer->From = 'never_kill@163.com';
$phpmailer->FromName = 'neverkill';
$phpmailer->Subject = 'Superstart Aseoe';
$phpmailer->Body = '爱思资源网(http://www.111cn.net/)- 专注前端开发与PHP编程设计.';

//设置收信人
$phpmailer->AddAddress('never_kill@163.com','neverkill');
// 添加一个抄送
$phpmailer->AddCC('597417106@qq.com','Aseoe');

// 发信

echo $phpmailer->send()?'ok':'fail';

补充一个使用上面例子的方法

直接将phpmailer压缩包解压 放到根目录即可运行

直接把文件 放到本地wamp 根目录 ,运行02.php 邮件即可发出(前提 php文件可执行)-(不行的话 在根目录建一个文件夹 重复操作一次)

http://localhost/02.php

imap是一款邮件交互访问的协议了,下面我来给大家介绍利用php imap模块来快速获取邮件的例子,有兴趣的朋友可参考一下。

列出所有目录:

 代码如下 复制代码

$host = '{imap.mail.yahoo.com:993/ssl}';
$user = 'user@yahoo.com';
$pass = 'password';
$inbox = imap_open($host, $user, $pass);
$mailboxes = imap_list($inbox, $host, '*');
$mailboxes = str_replace($host, '', $mailboxes);
print_r($mailboxes);

结果:

Array
(
    [0] => Bulk Mail
    [1] => Draft
    [2] => Inbox
    [3] => Sent
    [4] => Trash
)

重新打开指定的目录:

imap_reopen($inbox, $host.'Bulk Mail');
$emails = imap_search($inbox,'ALL');
print_r($emails);

windows安装imap

注意在windows中我们需要开启php.ini中的一个imap模板了,在php中找到php_imap.dll扩展然后开启,同时如果你看extensions没有关php_imap.dll需要复制一个过去。

linux中安装imap

最后完整的编译 imap 模块参数如下:

 代码如下 复制代码
./configure --with-php-config=/usr/local/webserver/php/bin/php-config --with-kerberos=/usr --with-imap-ssl=/usr
make
make install
[!--infotagslink--]

相关文章

  • PHP session_start()很慢问题分析与解决办法

    本文章来给各位同学介绍一下关于PHP session_start()很慢问题分析与解决办法,希望碰到此问题的同学可进入参考。 最近在做东西的时候发现一个问题 有一个接口挂...2016-11-25
  • php中json_decode()和json_encode()用法与中文不显示解决办法

    本文章介绍了关于php中json_decode()和json_encode()用法与中文不显示解决办法,有需要的朋友可以参考一下下。 php中json_decode()和json_encode() 1.json_decode(...2016-11-25
  • phpexcel导出数据身份证后四位0000解决办法

    在php中我们如果要导入excel数据我们通常会使用phpexcel插件了,但是有朋友会发与使用phpexcel导出数据出现身份证后四位是0000情况了,下面我们就来看解决办法。 最...2016-11-25
  • 401错误码代表什么 401错误解决办法

    401是HTTP状态码的一种,属于“请示错误”,表示请求可能出错,已妨碍了服务器对请求的处理。具体的401错误是指:未授权,请求要求进行身份验证。登录后,服务器可能会返回对页面...2017-01-22
  • apache网站提示503错误解决办法

    Apache status 503 的原因大致有如下几种情况 : 1、 CPU 负载过高,服务器响应不过来,返回503 2、 系统连接数超限,超过MaxVhostClients的上限,返回503 3、 单IP连接数超限,超过M...2016-01-28
  • Perl CPAN::Modulelist的解决办法

    今天用CPAN安装Term::ReadLine,报了个这样的错误 Going to read /root/.cpan/sources/modules/03modlist.data.gz Can't locate object method "data" via package "C...2016-11-25
  • phpStudy访问速度慢和启动失败的解决办法

    下面给大家介绍phpstudy访问速度慢的解决办法。1、修改mysql数据库链接地址为ip地址127.0.0.1。2、使用最新版本,这个坑了我好久时间。下面一段内容是关于phpstudy启动失败的解决办法。php5.3、5.4和apache都是用vc9编...2015-11-24
  • PHP Curl出现403错误的解决办法

    自己用的小PHP应用,使用curl抓网页下来处理,为了穿墙方便,使用Privoxy作为代理,便于选择哪些网站使用proxy、哪些不用。但今天却遇到了奇怪的问题,访问google baidu这些网站居然都返回403错误,而访问其他的一些网站没事,如果...2014-05-31
  • PHP判断上传文件类型的解决办法

    分享给大家php判断上传文件类型的方法,大家一起学习学习。/** * 读取文件前几个字节 判断文件类型 * @return String */ function checkTitle($filename){ $file=fopen($filename, "rb"); $bin=fread($file, 2); /...2015-10-21
  • android.os.BinderProxy cannot be cast to com解决办法

    本文章来给大家介绍关于android.os.BinderProxy cannot be cast to com解决办法,希望此文章对各位有帮助呀。 Android在绑定服务的时候出现java.lang.ClassCastExc...2016-09-20
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • php的mail函数发送UTF-8编码中文邮件时标题乱码的解决办法

    最近遇到一个问题,就是在使用php的mail函数发送utf-8编码的中文邮件时标题出现乱码现象,而邮件正文却是正确的。最初以为是页面编码的问题,发现页面编码utf-8没有问题啊,找了半天原因,最后找到了问题所在。 1.使用 PEAR 的...2015-10-21
  • PHP页面转UTF-8中文编码乱码的解决办法

    对于乱码这个问题php开发者几乎都会有碰到过,我们下面主要是介绍了php文件乱码和页面乱码。PHP页面转UTF-8编码问题 1.在代码开始出加入一行: header("Content-Type: text/html;charset=utf-8"); 2.PHP文件编码问题...2015-10-21
  • Android开发之PhoneGap打包及错误解决办法

    下面来给各位简单的介绍一下关于Android开发之PhoneGap打包及错误解决办法,希望碰到此类问题的同学可进入参考一下哦。 在我安装、配置好PhoneGap项目的所有依赖...2016-09-20
  • Ubuntu15下mysql5.6.25不支持中文的解决办法

    apt-get install 安装的,不是源码包安装的mysql1 修改mysql的配置文件/etc/mysql/conf.d/mysql.cnf在[mysql]的下方加入如下语句:(注:这个文件下没有配置,只有【mysql】)no-auto-rehash default-character-set=utf8/etc/...2015-10-21
  • php mail发邮件标题中文乱码的问题解决办法

    本文章来给大家介绍php mail发邮件标题中文乱码的问题解决办法,希望到此类问题的朋友可进入参考。 当使用下面的PHP语句发送电子邮件的时候,如果编码和接收邮箱编码...2016-11-25
  • FlashFXP连接站点中文显示乱码解决办法

    FlashFXP是一款常用的服务器客户连接软件了,我们可以通过FlashFXP来上传或下载文件,但有一些朋友使用FlashFXP时碰到中文目录或文件名乱码问题,那么要如何来解决呢?具体就...2016-10-10
  • 帝国cms 从6.6升级到7.0 出现的错误及解决办法

    刚升级一会就出现 Multiple primary key definedalter table ***_ecms_infoclass_shop change classid classid int(10) unsigned NOT NULL default '0', DROP INDEX clas...2013-05-20
  • Fatal error: Cannot redeclare class 原因分析与解决办法

    我使用的都是php __autoload状态自动加载类的,今天好好的程序不知道怎么在运行时提示Fatal error: Cannot redeclare class 了,看是重复定义了类,下面我来分析一下解决办...2016-11-25
  • ecshop后台登录超时session过期的解决办法

    可能有不少用户会发现自己的ecshop经常会使用关就超时了,这个问题解决办法有很多种,我们可以直接在ecsho中进行修改,具体方法如下 在includescls_session.php中修改...2016-11-25