高分請教郵件附件不能正確顯示的問題

熊柏棠 2005-07-13 06:59:50
請高手幫忙測試一下下面這段代碼中﹐郵件附件不能正確顯示的問題﹗
或者哪位有現成可用的PHP用來發送帶附件的郵件的源代碼﹐一定要可用﹗
代碼如下﹕
<?php
class Email
{
//---設置全局變量
var $mailTo = ""; // 收件人
var $mailCC = ""; // 抄送
var $mailBCC = ""; // 秘密抄送
var $mailFrom = ""; // 發件人
var $mailSubject = ""; // 主題
var $mailText = ""; // 文本格式的信件主体
var $mailHTML = ""; // html格式的信件主体
var $mailAttachments = ""; // 附件
/* 函數setTo($inAddress) :用于處理郵件的地址參數 $inAddress
為包涵一個或多個字串,email地址變量,使用逗號來分割多個郵件地址
默認返回值為true
**********************************************************/
function setTo($inAddress)
{
//--用explode()函數根据”,”對郵件地址進行分割
$addressArray = explode( ",",$inAddress);
//--通過循環對郵件地址的合法性進行檢查
for($i=0;$i<count($addressArray);$i++)
{
if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入數組中
$this->mailTo = implode($addressArray, ",");
return true;
}
/**************************************************
函數 setCC($inAddress) 設置抄送人郵件地址
參數$inAddress 為包涵一個或多個郵件地址的字串,email地址變量,
使用逗號來分割多個郵件地址 默認返回值為true
**************************************************************/
function setCC($inAddress)
{
//--用explode()函數根据”,”對郵件地址進行分割
$addressArray = explode( ",",$inAddress);
//--通過循環對郵件地址的合法性進行檢查
for($i=0;$i<count($addressArray);$i++)
{
if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入數組中
$this->mailCC = implode($addressArray, ",");
return true;
}
/*************************************************************************
函數setBCC($inAddress) 設置秘密抄送地址 參數 $inAddress 為包涵一個或多
個郵件地址的字串,email地址變量,使用逗號來分割多個郵件地址 默認返回值為true
**************************************************************************/
function setBCC($inAddress)
{
//--用explode()函數根据”,”對郵件地址進行分割
$addressArray = explode( ",",$inAddress);
//--通過循環對郵件地址的合法性進行檢查
for($i=0;$i<count($addressArray);$i++)
{
if($this->checkEmail($addressArray[$i])==false)
return false;
}
//--所有合法的email地址存入數組中
$this->mailBCC = implode($addressArray, ",");
return true;
}
/******************************************************************
函數setFrom($inAddress):設置發件人地址 參數 $inAddress 為包涵一個
或多地址的字串﹐默認返回值為true
******************************************************************/
function setFrom($inAddress)
{
if($this->checkEmail($inAddress))
{
$this->mailFrom = $inAddress;
return true;
}
return false;
}
...全文
408 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fibona 2006-03-27
  • 打赏
  • 举报
回复
代码太多了,只能慢慢去看了
尚和空四 2006-03-27
  • 打赏
  • 举报
回复
用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.smtpmail

Body : 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 = false

Lazysend : 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 = true

MailDomain : 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 = 3

Recipients : String
(v3.0)
只读属性,返回所有收件人
如:Response.Write( "" + JMail.Recipients + "" );

ReplyTo : String
(v3.0)
指定一个可选的回信地址
如:JMail.ReplyTo = "president@dimac.net"

ReturnReceipt : Boolean
(v3.0)
指定是否发件人需要一个回复收据. 缺省是false
如:JMail.ReturnReceipt = true

Sender : String
(v3.0)
指定发件人的邮件地址
如:JMail.Sender = "batman@dimac.net"

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 = true

SimpleLayout : Boolean
(v3.0)
设置为true,减少Jmail产生的header信头
如:JMail.SimpleLayout = true

Subject : 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( "info@dimac.net" );

AddRecipientBCC( Email )
(v3.0)
增加密件收件人
如:JMail.AddRecipientBCC( "someone@somedomain.net" );

AddRecipientCC( Email )
(v3.0)
增加抄送收件人
如:JMail.AddRecipientCC( "someone@somedomain.net" );

AddRecipientEx( Email, Name )
(v3.0)
增加一个带名字的收件人
如:JMail.AddRecipientEx( "info@dimac.net", "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" );


熊柏棠 2005-07-13
  • 打赏
  • 举报
回复
/*********************************************
函數 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;
}
}
?>
熊柏棠 2005-07-13
  • 打赏
  • 举报
回复
/********************************************************************
函數 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;
}
熊柏棠 2005-07-13
  • 打赏
  • 举报
回复
/********************************************
函數 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;
}

21,891

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧