/********************************************
 函數 setSubject($inSubject)用于設置郵件主題,
 參數$inSubject為字串, 默認返回值為true
 ********************************************/
 function setSubject($inSubject)
{
if(strlen(trim($inSubject)) > 0)
{
$this->mailSubject = ereg_replace( "n", "",$inSubject);
return true;
  }
    return false;
  }
/***********************************************
 函數setText($inText)  設置文本格式的郵件主体,
 參數 $inText 為文本內容默認返回值為true
 **********************************************/
 function setText($inText)
   {
 if(strlen(trim($inText)) > 0)
   {
     $this->mailText = $inText;
         return true;
       }
     return false;
   }
/*********************************************
 函數setHTML($inHTML)設置html格式的郵件主体,
 參數$inHTML為html格式,默認返回值為true
 *********************************************/
 function setHTML($inHTML)
  {
if(strlen(trim($inHTML)) > 0)
  {
  $this->mailHTML = $inHTML;
        return true;
      }
    return false;
  }
/**********************************************************************
 函數 setAttachments($inAttachments) 設置郵件的附件,參數$inAttachments
 為一個包涵目錄的字串,也可以包涵多個文件用逗號進行分割 默認返回值為true
 **********************************************************************/
 function setAttachments($inAttachments)
   {
     if(strlen(trim($inAttachments)) > 0)
       {
$this->mailAttachments = $inAttachments;
return true;
 }
    return false;
  }
/*******************************************************************
 函數 checkEmail($inAddress) :這個函數我們前面已經調用過了,主要就是
 用于檢查email地址的合法性
 *******************************************************************/
 function checkEmail($inAddress)
   {
     return (ereg( "^[^@ ]+@([a-zA-Z0-9-]+.)+([a-zA-Z0-9-]{2}|net|com.cn|com|gov|mil|org|edu|int)$",$inAddress));
   }
/*********************************************************************
 函數loadTemplate($inFileLocation,$inHash,$inFormat)  讀取臨時文件并且
 替換無用的信息 參數$inFileLocation用于定位文件的目錄$inHash 由于存儲
 臨時的值  $inFormat 由于放置郵件主体
 *********************************************************************/
 function loadTemplate($inFileLocation,$inHash,$inFormat)
   {
/*  比如郵件內有如下內容:  Dear ~!UserName~,
Your address is ~!UserAddress~  */
//--其中”~!”為起始標志”~”這結束標志
$templateDelim = "~";
$templateNameStart = "!";
//--找出這些地方并把他們替換掉
$templateLineOut = "";  //--打開臨時文件
if($templateFile = fopen($inFileLocation, "r"))
  {
    while(!feof($templateFile))
    {
$templateLine = fgets($templateFile,1000);
$templateLineArray = explode($templateDelim,$templateLine);
for( $i=0; $i<count($templateLineArray);$i++)
 {
//--尋找起始位置
if(strcspn($templateLineArray[$i],$templateNameStart)==0)
{
//--替換相應的值
$hashName = substr($templateLineArray[$i],1);
//- 替換相應的值
$templateLineArray[$i] = ereg_replace($hashName,(string)$inHash[$hashName],$hashName);
}
}
//--輸出字符數級并疊加
$templateLineOut .= implode($templateLineArray, "");
  }  //--關閉文件fclose($templateFile);
//--設置主体格式(文本或html)
if( strtoupper($inFormat)== "TEXT" )
  return($this->setText($templateLineOut));
else if( strtoupper($inFormat)== "HTML" )
       return($this->setHTML($templateLineOut));
}
return false;
  }
/**********************************************************(****
 函數 getRandomBoundary($offset)  返回一個隨机的邊界值
 參數 $offset 為整數 – 用于多管道的調用 返回一個md5()編碼的字串
 ***************************************************************/
 function getRandomBoundary($offset = 0)
  {
//--隨机數生成
srand(time()+$offset);
//--返回 md5 編碼的32位 字符長度的字串
return ( "----".(md5(rand())));
  }
/***************************************************
 函數: getContentType($inFileName)用于判斷附件的類型
 ***************************************************/
 function getContentType($inFileName)
   {
//--去除路徑
$inFileName = basename($inFileName);
//echo $inFileName;

//--去除沒有擴展名的文件
if(strrchr($inFileName, ".") == false)
   {
    return "application/octet-stream";
  }
//--提出擴展名并進行判斷
     $extension = strrchr($inFileName, ".");
switch($extension)
  {
case ".gif": 
    return "image/gif";  break;
case ".gz":  
    return "application/x-gzip";  break;
case ".htm": 
    return "text/html";  break;
case ".html":
    return "text/html";  break;
case ".jpg": 
    return "image/jpeg";  break;
case ".tar": 
    return "application/x-tar";  break;
case ".txt": 
    return "text/plain";  break;
case ".zip": 
    return "application/zip";  break;
         
          case ".rtf":
              return "text/richtext";  break;
          case ".doc": 
              return "application/msword";  break;
          case ".xls": 
              return "application/vnd.ms-excel";  break;
         //case ".gz": return "application/x-gzip-compressed";
         // case ".tar": return "application/x-tar-compressed";
          case ".zip": 
              return "application/x-zip-compressed";   break;
          case ".swf": 
              return "application/x-shockwave-flash";   break;
          case ".mid":
              return "audio/mid";  break;
          case ".wav":
              return "audio/wav";  break;

default: return "application/octet-stream";
}
return "application/octet-stream";
}
/**********************************************
 函數formatTextHeader把文本內容加上text的文件頭
 **********************************************/
 function formatTextHeader()
  {
$outTextHeader="";
$outTextHeader.="Content-Type:text/plain;\n charset=\"big5\";\n";   //已確認無誤
$outTextHeader.="Content-Transfer-Encoding: base64\n\n";  //已改好,確認無誤﹔修改前的"Content-Transfer-Encoding: quoted-printable\n\n";
$outTextHeader.=$this->mailText."\n";
return $outTextHeader;
 }
/*****************************************************
 函數formatHTMLHeader()把郵件主体內容加上html的文件頭
 *****************************************************/
 function formatHTMLHeader()
  {
$outHTMLHeader = "";
$outHTMLHeader .= "Content-Type:text/html;";    //這里刪除了charset=big5\n"
$outHTMLHeader .= "Content-Transfer-Encoding:quoted-printable\n\n";
$outHTMLHeader .= $this->mailHTML. "\n";
return $outHTMLHeader;
}

解决方案 »

  1.   

    /********************************************************************
     函數 formatAttachmentHeader($inFileLocation)  把郵件中的附件標識出來
     *********************************************************************/
     function formatAttachmentHeader($inFileLocation)
      {
    $outAttachmentHeader="";
    //--用上面的函數getContentType($inFileLocation)得出附件類型
    $contentType = $this->getContentType($inFileLocation);

    if(ereg( "text",$contentType))    //--如果附件是文本型則用標准的7位編碼
      {
    $outAttachmentHeader .= "Content-Type:".$contentType.";\n";
    $outAttachmentHeader .= 'name="'.basename($inFileLocation).'"'.";\n";
    $outAttachmentHeader .= "Content-Transfer-Encoding:quoted-printable";    //修改前7bitn
    $outAttachmentHeader .= "Content-Disposition: attachment;\n";  //先為attachment
    $outAttachmentHeader .= 'filename="'.basename($inFileLocation).'"'.";\n\n";
    $textFile = fopen($inFileLocation, "r");        while(!feof($textFile))
               {
                 $outAttachmentHeader.= fgets($textFile,1000);
               }
    //--關閉文件 fclose($textFile);
    $outAttachmentHeader.= "\n";
          }
    //--非文本格式則用64位進行編碼
    else
      {
       $outAttachmentHeader .= "Content-Type:".$contentType.";\n";
      $outAttachmentHeader .= 'name="'. basename($inFileLocation).'"'.";\n";
      //$outAttachmentHeader.="Content-Transfer-Encoding:base64n";
      $outAttachmentHeader .= "Content-Disposition: attachment;\n";
      $outAttachmentHeader .= 'filename="'. basename($inFileLocation).'"'.";\n\n";
      //--調用外部命令uuencode進行編碼
            exec( "uuencode -m $inFileLocation nothing_out",$returnArray);
            for ($i = 1; $i<(count($returnArray)); $i++)
                {
                  $outAttachmentHeader .= $returnArray[$i]. "\n";
                }
          }
       return $outAttachmentHeader;
     }
      

  2.   

    /*********************************************
     函數 send()用于發送郵件,發送成功返回值為true
     *********************************************/
      function send()
        {
    //--設置郵件頭為空
    $mailHeader = "";
    if($this->mailCC != "") $mailHeader .= "CC: ".$this->mailCC. "\n";       //--添加抄送人

    if($this->mailBCC != "") $mailHeader .= "BCC: ".$this->mailBCC. "\n";     //--添加秘密抄送人

    if($this->mailFrom != "") $mailHeader .= "FROM: ".$this->mailFrom. "\n";   //--添加發件人
    //---------------------------郵件格式------------------------------
    //--文本格式 if($this->mailText != "" && $this->mailHTML == "" && $this->mailAttachments == "")
      {
    return mail($this->mailTo,$this->mailSubject,$this->mailText,$mailHeader);
    }
    //--文字加html格式
    else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments == "")
     {
    $bodyBoundary = $this->getRandomBoundary();
    $textHeader = $this->formatTextHeader();
    $htmlHeader = $this->formatHTMLHeader();

    //--設置 MIME-版本
    $mailHeader .= "MIME-Version:1.0;\n";
    $mailHeader .= "Content-Type:multipart/mixed;\n";  //修改前"Content-Type:multipart/alternative;\n";
    $mailHeader .= ' boundary="'.$bodyBoundary. '"';
    $mailHeader .= "\n\n\n";

    //--添加郵件主体和邊界
    $mailHeader .= "--".$bodyBoundary."\n";
    $mailHeader .= $textHeader;
    $mailHeader .= "--".$bodyBoundary."\n";

    //--添加html附件
    $mailHeader .= $htmlHeader;
    $mailHeader .= "\n--".$bodyBoundary."--";

    //--發送郵件
    return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
         }
         //--文本加html加附件
         else if($this->mailText != "" && $this->mailHTML != "" && $this->mailAttachments != "")
          {
    $attachmentBoundary = $this->getRandomBoundary();

    $mailHeader .="MIME-Version:1.0;\n";   //開始沒有﹐我加的
    $mailHeader .= "Content-Type:multipart/mixed;\n";


    //$mailHeader.= ' boundary="'.$bodyBoundary. '"'."\n\n";       //開始沒有﹐我加的
    $mailHeader .= ' boundary="'.$attachmentBoundary. '"'. "\n\n";   //先在
    $mailHeader .= "This is a multi-part message in MIME format.\n\n";

    $mailHeader .=$attachmentBoundary;         //自己加的
    //$mailHeader .= "--".$attachmentBoundary."\n";   //這行似乎很重要﹐比較關鍵

    $bodyBoundary = $this->getRandomBoundary(1);
    $textHeader = $this->formatTextHeader();
    $htmlHeader = $this->formatHTMLHeader();

    //$mailHeader .= "MIME-Version: 1.0;\n";
    //$mailHeader .= "Content-Type: multipart/alternative;\n";
    //$mailHeader .= ' boundary="'.$bodyBoundary. '"';

    $mailHeader .= "\n\n";
    //$mailHeader .=$bodyBoundary."\n\n";  //自己加的
    //$mailHeader .= "--".$bodyBoundary. "\n";

    $mailHeader .= $textHeader;
    $mailHeader .= $attachmentBoundary."\n\n";  //自己加的
    //$mailHeader .= "--".$bodyBoundary. "\n";

    //$mailHeader .= $htmlHeader;
    //$mailHeader .= $bodyBoundary;   //自己加的
    //$mailHeader .= "\n--".$bodyBoundary. "--";

    //--獲取附件值
    $attachmentArray = explode(",",$this->mailAttachments);
      //--根据附件的個數進行循環           for($i=0;$i<count($attachmentArray);$i++)
                 {
    //$mailHeader .= "\n--".$attachmentBoundary. "\n";  //--分割   //先是屏掉
    //--附件信息
    $mailHeader .= $this->formatAttachmentHeader($attachmentArray[$i]);    //先再
     }
                    
                    $mailHeader .= $attachmentBoundary;
    //$mailHeader .= "--".$attachmentBoundary. "--";
    return mail($this->mailTo,$this->mailSubject, "",$mailHeader);
         }
            return false;
       }
     }
    ?>
      

  3.   

    用Jmail发送附件: 
    jmail.Body="this is a file from jmail using c# asp.net"; jmail.AddAttachment(Server.MapPath("01.jpg"),false,"image/jpg"); 发送HTML: jmail.HTMLBody="<hr>this is html<br>"; 如果HTML内容中含有图像等连接,可以: 1) jmail.HTMLBody="<hr>this is html<br><img src=http://www.image.com/img.gif''>"; 2) string cid=jmail.AddAttachment(Server.MapPath("01.jpg"),true,"image/jpg"); jmail.HTMLBody="<hr>this is html<br><img src=''cid:"+cid+"''>"; jmail.smtpmailBody : String
    (v3.0)
    信件体,正文,使用AppendText追加内容
    如:JMail.Body = "Hello world"Charset : String
    (v3.0)
    字符集,缺省为"US-ASCII"
    如:JMail.Charset = "US-ASCII"ContentTransferEncoding : String
    (v3.0)
    指定内容传送时的编码方式,缺省是"Quoted-Printable"
    如:JMail.ContentTransferEncoding = "base64"ContentType : String
    (v3.0)
    信件的contentype. 缺省是"text/plain",但是可以设置为其他你想要的类型.
    如果你以HTML格式发送邮件, 改为"text/html"即可。
    如:JMail.ContentType = "text/html"DeferredDelivery : Date
    (v3.0)
    设置延期发送. 如果邮件服务器支持的话,消息到了这个时间才会发送
    如:(javascript)JMail.DeferredDelivery = new Date( 2000, 02, 17 ).getVarDate();Encoding : String
    (v3.0)
    这个属性可以用来改变附件编码方式(缺省是"base64). 可以选择使用的是"base64", "uuencode" or "quoted-printable"
    如:JMail.Encoding = "base64"ErrorCode : Integer
    (v3.0)
    如果JMail.silent设置为true,ErrorCode包含的是错误代码
    如:Response.Write( JMail.ErrorCode );ErrorMessage : String
    (v3.0)
    如果JMail.silent设置为true,包含的是错误信息
    如:Response.Write( JMail.ErrorMessage );ErrorSource : String
    (v3.0)
    Contains the error source if JMail.silent is set to true
    如:Response.Write( JMail.ErrorSource ); ISOEncodeHeaders : Boolean
    (v3.0)
    是否将信头编码成iso-8859-1字符集. 缺省是true
    如:JMail.ISOEncodeHeaders = falseLazysend : Boolean
    (v3.0)这个属性指定Jmail是否一直等到mail发送了然后返回,或者缓冲这条消息然后在后台发送。 然而设置了这个属性,你就不能控制错误信息。注意:如果选择了这个选项,属性ServerAddress将无效,lazysend将通过dsn查询决定邮件服务器, 在一些设置里面,这可能有问题。
    如:JMail.LazySend = true;Log : String
    (v3.0)
    Jmail创建的日志,如果loging属性设置为true
    如:Response.Write( JMail.Log );Logging : Boolean
    (v3.0)
    是否使用日志
    如:JMail.Logging = trueMailDomain : String
    (v3.0)
    This can be used to override the EHLO/HELO statement to your mailserver
    如:JMail.Maildomain = "hello.world.com"MimeVersion : String
    (v3.0)
    指定mime版本。缺省是"1.0"
    如:JMail.MimeVersion = "1.0"Priority : Integer
    (v3.0)
    优先级. 范围在1-5之间
    1 高优先级. 有些邮件程序称之为紧急
    2 也是高优先级
    3 普通优先级
    4 低优先级
    5 最低的优先级
    如:JMail.Priority = 3Recipients : String
    (v3.0)
    只读属性,返回所有收件人
    如:Response.Write( "" + JMail.Recipients + "" );ReplyTo : String
    (v3.0)
    指定一个可选的回信地址
    如:JMail.ReplyTo = "[email protected]"ReturnReceipt : Boolean
    (v3.0)
    指定是否发件人需要一个回复收据. 缺省是false
    如:JMail.ReturnReceipt = trueSender : String
    (v3.0)
    指定发件人的邮件地址
    如:JMail.Sender = "[email protected]"SenderName : String
    (v3.0)
    指定发件人的姓名
    如:JMail.SenderName = "Bat man"ServerAddress : String
    (v3.0)
    指定邮件服务器的地址。可以指定多个服务器,用分号点开。可以指定端口号。
    如果serverAddress保持空白,JMail会尝试解决远程邮件服务器,然后直接发送到服务器上去。
    如:JMail.ServerAddress = "mail.mydom.net; mail2.mydom.net:2500" Silent : Boolean
    (v3.0)
    如果设置为true,JMail不会抛出例外错误. JMail.execute() 会根据操作结果返回true或false
    如:JMail.silent = trueSimpleLayout : Boolean
    (v3.0)
    设置为true,减少Jmail产生的header信头
    如:JMail.SimpleLayout = trueSubject : String
    (v3.0)
    设定消息的标题
    如:JMail.Subject = "Dimac rocks big time!"UsePipelining : Boolean
    (v3.0)
    Overrides if JMail should use pipelining on a server that supports it.
    如:JMail.Pipelining = false AddAttachment( FileName, [ContentType] )
    (v3.0)
    添加文件附件到信件
    如:JMail.AddAttachment( "c:\\autoexec.bat" );AddCustomAttachment( FileName, Data )
    (v3.0)
    添加自定义附件. This can be used to attach "virtual files" like a generated text string or certificate etc.
    如:JMail.AddCustomAttachment( "readme.txt", "Contents of file" );AddHeader( XHeader, Value )
    (v3.0)
    添加用户定义的X-header到message
    如:JMail.AddHeader( "Originating-IP","193.15.14.623" );AddNativeHeader( Header, Value )
    (v3.0)
    添加信头
    如:JMail.AddNativeHeader( "MTA-Settings", "route" );AddRecipient( Email )
    (v3.0)
    增加收件人
    如:JMail.AddRecipient( "[email protected]" );AddRecipientBCC( Email )
    (v3.0)
    增加密件收件人
    如:JMail.AddRecipientBCC( "[email protected]" );AddRecipientCC( Email )
    (v3.0)
    增加抄送收件人
    如:JMail.AddRecipientCC( "[email protected]" );AddRecipientEx( Email, Name )
    (v3.0)
    增加一个带名字的收件人
    如:JMail.AddRecipientEx( "[email protected]", "Dimac INFO" );AddURLAttachment( bstrURL, bstrAttachAs, [bstrAuth] )
    (v3.0)
    下载并添加一个来自url的附件. 第二个参数"AttachAs", 被用来指定信件收到后的/webpage/asp/jmail1.htm. 第3个可选参数是用来可选的WWW-鉴定.
    如:JMail.AddURLAttachment( "http://download.dimac.net/jmail/jmail.exe", "jmail.exe" )AppendBodyFromFile( FileName )
    (v3.0)
    将一个文件内容追加到正文后
    如:JMail.AppendBodyFromFile( "c:\\mytext.txt" );AppendText( Text )
    (v3.0)
    追加信件的正文内容
    如:JMail.AppendText( "Text appended to message Body" );ClearAttachments()
    (v3.0)
    清除附件列表
    如:JMail.ClearAttachments();ClearCustomHeaders()
    (v3.0)
    清除所有自定义的信头
    如:JMail.ClearCustomHeaders();ClearRecipients()
    (v3.0)
    清除收件人列表
    如:JMail.ClearRecipients();Close()
    (v3.0)
    强制JMail关闭缓冲的与邮件服务器的连接
    如:JMail.Close();Execute() : Boolean
    (v3.0)
    执行邮件的发送
    如:JMail.Execute();ExtractEmailAddressesFromURL( bstrURL, [bstrAuth] )
    (v3.0)
    从一个url下载和添加email地址
    如:JMail.ExtractEmailAddressesFromURL( "http://duplo.org/generateEmailList.asp" );GetMessageBodyFromURL( bstrURL, [bstrAuth] )
    (v3.0)
    清除message的正文,并用url的内容替换。Contenttype 会自动设置成URl的contentyp。第二参数(login and password)是可选的。
    如:JMail.GetMessageBodyFromURL( "http://duplo.org/", "login:password" )LogCustomMessage( Message )
    (v3.0)
    将用户自定义消息加入JMail日志. 只有属性loging设置为true时,这项功能才能起作用
    如:JMail.LogCustomMessage( "Hello world" );