谁可以告诉我怎样实现发送带附件的邮件,最好用PHP or ASP实现[250 分!!!!!](200分)

  • 主题发起人 主题发起人 Sheva
  • 开始时间 开始时间
jmail组件,新版的,支持
www.chinaasp.com上面看看:)
 
  Attachments 附件!!

W3 Jmail 简要介绍

整理编辑:飞鸟


  主页:http://tech.dimac.net

  使用w3 JMail 可以在asp应用里面发送电子邮件,而不需要使用一个诸如Eudora/exchange/outlook
之类的邮件客户端。w3 Jmail发送邮件速度快,功能丰富,而且是免费的,可以直接下载。

  下载地址:http://download.dimac.net/jmail/jmail.exe

  使用环境
  Webserver (IIS4/PWS4)
  Microsoft Windows NT or Microsoft Windows 95 with Winsock 2.0 (Download from Microsoft)

  版本:3.60的特性
  Attachments 附件
  Return Receipt 发信回执
  Detailed logging capabilities 详细日志能力
  Priority settings 优先级设定
  MIME with BASE64, UUEncode and Quoted-Printable Encoding 邮件编码设置
  Queued mailings without separate NT service. 邮件队列发送,无需单独的NT服务
  Unlimited redundant servers 没有限制的多余server(SMTP服务器)
  Blind Carbon Copy (BCC) 密送
  Carbon Copy (CC) 抄送
  Urgent flagging 紧急标志
  US ASCII and ISO-8859-1
  UUEncoding
  X-Headers and custom headers
  MS Mail and Exchange priority headers.
  Internal MX lookup with MX priority and redundancy

JMAIL的日志功能允许你能察看发送邮件时候发生的事情,这是一种发现问题所在的好方法,
如果MAIL SERVER错误设置的话。

  JMail 已经检查了下列Y2K测试
  2000-01-01 Bug - OK
  2000-02-29 Bug - OK
  2000-04-01 Bug - OK (Found in MS VCRT)

JMAIL使用16位精度表示年,所以日期范围限制在 -32767~ 32768



 
写在前面,下面的手册中,凡是额外功能部分都有 30天的使用限制,要解除该限制的方法如下:
如果你得到"AspEmail's premium features have expired"出错消息后
请运行regedit,删除HKEY_LOCAL_MACHINE/SOFTWARE/Persits Software/AspEmail
然后使用regsvr32重新注册AspEmail using.然后你又可以接着用30天了

AspEmail 4.1 手册
Copyright (c) 1999 Persits Software, Inc.
All Rights Reserved

什么是AspEmail 4.1?
AspEmail 4.1 是一个在ASP或则VB环境中使用外部SMTP服务器发送电子
邮件消息的活动服务组件。AspEmail 4.1 支持多收件人,多CC, 多Bcc,多附件,HTML格式, 内嵌图形
, 和非US ASCII字符集设置. AspEmail 4.1是一个完全免费的组件,除了内嵌图形功能、
Quoted-Printable编码支持功能、消息队列功能需要另外的购买许可外
这份完全免费的AspEmail可以从www.aspemail.com处下载。

系统需求:
一般配置需求:
Windows 95/98 或则 Windows NT 4.0+
一个外部SMTP服务程序
特殊配置需求:
Internet Information Server 3.0 + 和 Active Server Pages
或则Personal Web Server (任何版本) 和 Active Server Pages
或则Visual Basic, Visual C++, 其他支持COM组件的开发环境

如何开始呢?
首先需要在你的系统上注册AspEmail, 在你的MS DOS或则Start/Run中执行下面的命令:
C:/>regsvr32 c:/AspEmailDir/AspEmail.dll
AspEmail是和AspUpload(Persits Software, Inc.)组件评估版本一同发布的
该组件是用来将附件文件上载到服务端的.(译者注:当然了,AspMail也可以单独使用的)
注册AspUpload执行下面的命令:
C:/>regsvr32 c:/AspEmailDir/AspUpload.dll
AspUpload不需要运行AspEmail.
然而, 在和AspMail一起发布的Asp SendMail例子中在演示AspMail的附件功能时使用到了AspUpload
所以如果你需要使用这个例子的话,请也注册AspUpload(你可以去www.aspupload.com了解
更加详细的信息,不过它可不是免费的哦).

如何使用AspEmail
在ASP环境中使用AspEmail的代码如下:
<%
...
Set Mail = Server.CreateObject("Persits.MailSender")
...
%>
在VB环境中使用ASPMail的代码如下,使用前先去Project/References...中选中Persits Software AspEmail 4.1.
Dim Mail As MailSender
Set Mail = New MailSender

Mail.Host = "smtp.mycompany.com"
Mail.Port = 25
Mail.From = "sales@mycompany.com"
Mail.FromName = "Sales Department" ' 可选的

如果要增加消息的收件人,CCs, BCCs, 和Reply-To,分别使用AddAddress, AddCC, AddBcc and AddReplyTo方法.
这些方法都有两个输入参数: email地址和可选的参数name.
Mail.AddAddress "jsmith@company1.com", "John Smith"
Mail.AddCC "bjohnson@company2.com" ' Name是可选的
使用Subject和Body属性来分别指定消息的主题和消息正文.
正文可以是纯文本也可以是HTML格式的.如果要使用HTML格式的话,你必须要设置IsHTML属性为True.例如
Mail.Subject = "Sales Receipt"
Mail.Body = "Dear John:" & chr(13) & chr(10) & "Thank you for your business. Here is your receipt."
或则
Mail.Subject = "Sales Receipt"
Mail.Body = "<HTML><BODY BGCOLOR=#0000FF>Dear John:....</BODY></HTML>"
Mail.IsHTML = True
如果是要发送一个文件附件的话,使用AddAttachment方法.
它使用附件的绝对路径为输入参数.如果你有多个附件的话,就多次调用这个方法即可
注意:不要使用“=”来传递参数
Mail.AddAttachment "c:/dir/receipt.doc"
发送消息是调用Send方法. 该方法在出现异常时会出错
你应该选择截获这个出错信息,这个可以使用On Error Resume Next来实现,例如:
On Error Resume Next
Mail.Send
If Err <> 0 Then
Response.Write "An error occurred: " & Err.Description
End If


支持基于S/MIME的加密和数字电子签名
从Build 4.0.0.3版本开始, AspEmail就可以生成基于工业标准的S/MIME格式的密码和数字电子签名.
如果要发送秘密邮件, AspEmail必须要和AspEncrypt密码组件(也是Persits Software, Inc.出品)联合使用。
如果想了解更多的信息,可以去下载免费的AspEncrypt试用版本www.aspencrypt.com
额外特点(可不是免费的说):支持队列消息
AspEmail如果你是使用基本的功能(就是上面介绍的功能)的话,它是完全免费的.
但是它的额外的功能就需要你购买一个注册许可(当然你也可以免费使用30天它的额外功能)
可以去www.aspemail.com购买这个东东。
AspEmail 4.1有一个新方法SendToQueue, 该方法不是直接将邮件发送给SMTP服务器
而是将消息按照先后顺序放入队列中,该队列由EmailAgent NT服务来发送。这是一个后台运行的进程
你的ASP中发送邮件的代码就不用一直要等到邮件发送完毕后才能够结束
这样就意味着你将大大提高代码的效率,缩短客户端等待时间.
EmailAgent服务本身是完全免费的,可以从www.aspemail.com/download.html处下载.
但是只是SendToQueue方法需要在你使用了30天后购买一个注册的key。

额外特点: 使用内嵌图形发送消息
AspEmail能够发送包含有图形的电子邮件. 例子如下:(该例子发送一个有背景图形的电子邮件)
...
Mail.Body = "<HTML><BODY BACKGROUND=""cid:My-Background-Image"">...</BODY></HTML>"
Mail.AddEmbeddedImage "c:/aspemaildir/margin.gif", "My-Background-Image"

AddEmbeddedImage方法有两个输入参数:图形文件的绝对路径和Content ID (是一个字符串变量)
该变量格式如下:
"cid:<Content ID>"
在例子中的该变量Content ID为"My-Background-Image"用来
引用<BODY>标志的BACKGROUND属性.你可以使用同样的技术来在<IMG>标志中使用该功能,例子如下:
Mail.Body = "<HTML>....<IMG SRC=""cid:My-Company-Logo"">...</HTML>"
Mail.AddEmbeddedImage "c:/aspemaildir/logo.gif", "My-Company-Logo"
为了让你的脚本可读性更好,你可以选择把你的消息文本放到一个独立的文件中,
然后把该文件使用AppendBodyFromFile方法加入到正文中.例如:
<!-- File messagebody.html-->
<HTML>
<HEAD>
<STYLE>BODY {
COLOR: #427d64; FONT-FAMILY: "Arial"; FONT-SIZE: 12pt; MARGIN-LEFT: 8em
}
</STYLE>
</HEAD>
<BODY BACKGROUND="cid:My-Background-Image">
<H2>Thank you for Shopping At Our Online Store!</H2>

....

</BODY>
</HTML>

要在你的正文中使用上面这个文件,代码如下:
Mail.AppendBodyFromFile "c:/aspemaildir/messagebody.html"
Mail.AddEmbeddedImage "c:/aspemaildir/margin.gif", "My-Background-Image"

额外特点: 支持非US-ASCII字符集
AspEmail能够发送非US-ASCII字符集,只要是可以打印出来的格式即可.
也就是说,该格式在标准RFC-2045中有详细描述.也就是说ASC码小于33和大于126的可以被表示为"="
后加两个16进制的数字.例如, 10进制数值12 (US-ASCII中的换页符号)表示为"=0C",
10进制的数值61 (US-ASCII中的 "="字符)被表示为"=3D".
AspEmail自动对消息正文按照Quoted-Printable格式进行编码,如故将ContentTransferEncoding属性
设置为"quoted-printable". 你也可以设置CharSet属性为适当的字符集
下面的代码片段使用KOI8字符集的俄文发送一个文本文件(该文件在此不显示):
...
Mail.ContentTransferEncoding = "quoted-printable"
Mail.Charset = "koi8-r"
Mail.AppendBodyFromFile "c:/russiandoc.txt"
Mail.Send

ASP例子程序
跟随AspEmail发布的还有一个ASP例子程序,该例子允许你通过Web建立和发送有附件的邮件。
该例子程序由下面几个文件组成:
global.asa (collection object creation)
SendMail.asp (main Email interface page)
Attachments.asp (attachment handling page)
UploadScript.asp (upload script which uses AspUpload).
要正确使用这个例子的话,请正确注册ASPUpload组件试用版本

对象帮助
AspEmail的属性和属性注释
属性名称 属性类型 注释
Host String(必须) SMTP服务器的主机名称
Port Integer SMTP的端口号,默认为25.
From String(必须) 发件人的email地址
FromName String 发件人的名称
Subject String 消息的主题
Body String 消息的正文.可以是文本也可以是HTML格式.如果是后者,那么属性IsHTML必须为True.
IsHTML Boolean 默认值为False.如果被设置为True, AspEmail将设置消息的Content-Type部分为text/html.
Priority Integer 消息的优先权.合法值为1 (高), 3 (普通) 和5 (底). 默认为0(即没指定优先级).
Helo String 默认值为"AspEmail".当SMTP对话开始后该字符串随HELO命令被发送.用来SMTP的客户端标识SMTP服务器的域名.
ContentTransferEncoding String 默认为"7bit".指定Content-Transfer-Encoding MIME.其它的合法值包括"8bit"和"quoted-printable". 如果将其设置为"quoted-printable",AspEmail将自动转换消息正文为RFC-2045的Quoted-Printable格式.
CharSet String 默认值为"ISO-8859-1".指定消息中的Content-Type MIME.
Expires Date (只读) 返回额外功能的过期日期.如果安装了合法的key后返回9/9/9999.如果返回0 (显示为"12:00 AM")表示过期或则没有安装key

AspEmail的方法
方法名成 参数 注释
AddAddress Email As String
Name = ""(可选)将邮件的地址和可选的通讯全名加入到信笺的To: 列表中.
AddCC Email As String
Name = ""(可选)将一个email地址和可选的通讯全名加入到Cc:列表中.
AddBcc Email As String
Name = ""(可选)将一个email地址和可选的通讯全面加入到Bcc:列表中
AddReplyTo Email As String
Name = ""(可选)将一个email地址和可选的通讯全面加入到Reply-To:列表中
AddAttachment Path As String 将一个文件加入到消息的附件中.
AddEmbededImage Path As String
ContentID As String 将一个图形加入到消息内嵌的图形中,注意,Cotentid中不能够有空格:
AppendBodyFromFile Path As String 在Body属性中新增加一个文本或则HTML文件.
Send 无 发送消息,并有出错信息.出错信息见下面的列表。
SendToQueue Path = ""(可选) 发送消息到消息队列中,并马上返回.需要EmailAgent服务运行. Path用来指定消息在队列中的路径.Path被忽略, EmailAgent's Message Queue中将从注册信息里面获取Path配置.更多信息请参考EmailAgent.
SendEncrypted Msg As CryptoMessage 发送一个加密的消息. Msg是一个由AspEncrypt组件创建的对象。更多信息参看AspEncrypt网站
SendSigned Msg As CryptoMessage 发送一个数字签名. Msg是一个由AspEncrypt组件创建的对象。更多信息参看AspEncrypt网站
SendSignedAndEncrypted Msg1 AspCryptoMessage
Msg2 As CryptoMessage 发送一个消息,第一个是数字签名然后加密.
Reset 无 清除所有的地址和附件列表属性,然后用来发送一条新消息
ResetAll 无 功能和Reset类似,但是清除所有的属性,并设置为默认值.
LogonUser Domain As String;
UserID As String;
Password As String. 用来实现指定用户登录。如果Domain为空,那么将使用本地机来验证UserID/Password.调用者必须拥有"Act as Part of the Operating System"权限,否则会出错"Privilege is not held by client".
该方法当使用SendToQueue方法,而队列列表在另外一台机器,需要适当的帐号来将消息放置在远程机器上。
RevertToSelf 无 终止登录帐号.

错误代码
错误号 错误描述
1 Winsock initialization failed.
2 gethostbyname failed.
3 Socket creation failed.
4 Connection failed.
5 Sending data failed.
6 Error returned from SMTP server
7 Opening file failed.
8 Not enough memory.
9 Reading from file failed.
10 Host not specified
11 ContentID may not be empty (generated by AddEmbededImage)
12 ContetnID must be unique (generated by AddEmbeddedImage)
13 Invalid Priority value (generated by put_Priority)
14 Component is expired or invalid registration key (generated by premium methods and properties only)


 
CMailFile
这是一个用来在E-mail中发送文件附件的简单的类(class)
用法如下:
$newmail = new CMailFile($subject,$sendto,$replyto,$message,$filetoattach,$mimetype); $newmail->sendfile();

CMailFile类需要PHP中以下的一些函数:base64_encode(),chunk_split(),fread(),mail()

实现脚本如下:

<?php
/* 如果你的系统中没有base64_encode函数,那么这个类将不起作用 */

class CMailFile {
var $subject;
var $addr_to;
var $text_body;
var $text_encoded;
var $mime_headers;
var $mime_boundary = "--==================_846811060==_";
var $smtp_headers;

function CMailFile($subject,$to,$from,$msg,$filename,$mimetype = "application/octet-stream", $mime_filename = false) {
$this->subject = $subject;
$this->addr_to = $to;
$this->smtp_headers = $this->write_smtpheaders($from);
$this->text_body = $this->write_body($msg);
$this->text_encoded = $this->attach_file($filename,$mimetype,$mime_filename);
$this->mime_headers = $this->write_mimeheaders($filename, $mime_filename);
}

function attach_file($filename,$mimetype,$mime_filename) {
$encoded = $this->encode_file($filename);
if ($mime_filename) $filename = $mime_filename;
$out = "--" . $this->mime_boundary . "/n";
$out = $out . "Content-type: " . $mimetype . "; name=/"$filename/";/n";
$out = $out . "Content-Transfer-Encoding: base64/n";
$out = $out . "Content-disposition: attachment; filename=/"$filename/"/n/n";
$out = $out . $encoded . "/n";
$out = $out . "--" . $this->mime_boundary . "--" . "/n";
return $out;
}

function encode_file($sourcefile) {
if (is_readable($sourcefile)) {
$fd = fopen($sourcefile, "r");
$contents = fread($fd, filesize($sourcefile));
$encoded = chunk_split(base64_encode($contents));
fclose($fd);
}
return $encoded;
}

function sendfile() {
$headers = $this->smtp_headers . $this->mime_headers;
$message = $this->text_body . $this->text_encoded;
mail($this->addr_to,$this->subject,$message,$headers);
}

function write_body($msgtext) {
$out = "--" . $this->mime_boundary . "/n";
$out = $out . "Content-Type: text/plain; charset=/"us-ascii/"/n/n";
$out = $out . $msgtext . "/n";
return $out;
}

function write_mimeheaders($filename, $mime_filename) {
if ($mime_filename) $filename = $mime_filename;
$out = "MIME-version: 1.0/n";
$out = $out . "Content-type: multipart/mixed; ";
$out = $out . "boundary=/"$this->mime_boundary/"/n";
$out = $out . "Content-transfer-encoding: 7BIT/n";
$out = $out . "X-attachments: $filename;/n/n";
return $out;
}

function write_smtpheaders($addr_from) {
$out = "From: $addr_from/n";
$out = $out . "Reply-To: $addr_from/n";
$out = $out . "X-Mailer: PHP3/n";
$out = $out . "X-Sender: $addr_from/n";
return $out;
}
}

// end script
?>
用法 - 例如:mimetype 为 "image/gif"
$mailfile = new CMailFile($subject,$sendto,$replyto,$message,$filename,$mimetype);
$mailfile->sendfile();

$subject -- 主题
$sendto -- 收信人地址
$replyto -- 回复地址
$message -- 信件内容
$filename -- 附件文件名
$mimetype -- mime类型
 
dim objSendMail
place_of_resume="c:/test.doc"
set objsendmail=createobject("cdonts.newmail")
objsendmail.from="hrwong@mxic.com.tw"
objsendmail.to="joelu@mxic.com.tw"
objsendmail.subject="在线简历"
objsendmail.body="附件为在线简历"
att_file=place_of_resume
objsendmail.attachfile att_file
objsendmail.send
set objsendmail=nothing

if err.number>0 then
send_resume="error"
else
send_resume="success"
end if



文件名称:cdonts.dll
windows 2000,nt 上原先就有,不必用其他的。
 
>>以上的控件是ASP内置的,简单易用。
 
前些日子上不来,发宰了csdn上面,都没人哪,还是到这里来了,望各位高手多多指教
==============
主  题:如何保存附件?
作  者:Cixy
所属论坛:Web Services
问题点数:20
回复次数:3
发表时间:2001-8-5 16:35:41


邮件系统是如何保存附件的?我不想为每个邮件建立文件夹来保存,又不想把文件存到数据库,还想用户选择“另存”时自动给出的文件名和发送时的文件名一致,怎么办?

新浪的例子
http://mail.sina.com.cn/cgi-bin/attachment.cgi/terlanx/application/x-msdownload/996923548.26207.mail.sina.com.cn:2,S.a00.dat/单身情歌.txt

似乎是把类似
xxxx.asp?FileName=单身情歌.txt
的参数传递方法换成了
xxxx.asp/FileName=xxxx/单身情歌.txt
的形式,不知我这么想对不对?

总之,我想得到一个解决方法,请各位支招


回复贴子:
回复人: tinydust(tinydust) (2001-8-5 22:32:46) 得0分
WEBMail系统是不会对mail进行附件的保存的,因为这样缺点很多。
xxxx.asp?FileName=单身情歌.txt正说明了,他是在你浏览的时候,把mail的内容解释成了附件而已。文件名一直很简单,扩展名一致需要你设定返回类型

回复人: Cixy(塞克斯) (2001-8-6 2:38:57) 得0分
不保存邮件的附件,那收发邮件时的附件是从哪里来得?难道不是保存在服务器上的吗?我这边要自己实现一个系统来模仿邮件服务器,之所以说模仿,是因为邮件并不走pop/smtp协议,而是简单的在系统内部流转……(扯远了),主要问题在于我要在服务器保存邮件的附件,我想给每个用户建立一个文件夹来保存它们,但是又要避免文件重名,所以只好改名存储(例如加个唯值的标记),但是用户在浏览器中单击附件的链接时,要自动给出附件未更名之前的文件名称,前述例子可以改为这样子

新浪的例子
http://mail.sina.com.cn/cgi-bin/attachment.cgi/terlanx/application/x-msdownload/996923548.26207.mail.sina.com.cn:2,S.a00.dat/单身情歌.dat

似乎是把类似
xxxx.asp?FileName=单身情歌.dat
的参数传递方法换成了
xxxx.asp/FileName=xxxx/单身情歌.dat
的形式,不知我这么想对不对?

并不是说把邮件正文存为附件,也不涉及附件的文件类型问题(一律视作文件供用户下载)

请高手继续指教呀

 
接受答案了.
 
后退
顶部