我正在建立一个网站,人们可以报名参加沙滩排球假期。该网站没有在线支付,所以它是如何工作的,人们注册自己(在一个很好的'html表格),然后你会收到一封应该包含发票的电子邮件。我已经做到了,所以这张发票是使用FPDF生成的(http://www.fpdf.org/ - 尽管我认为这对于这个问题的答案并不重要)。所以FPDF需要一堆PHP变量并用它生成一个PDF文件,并把这个文件放在FTP服务器上的一个目录中。
现在,我可以看到两种方法将此发票从服务器发送给刚注册的人(因为他们会立即想要确认他们的注册):
1)将其附在电子邮件中(我已经尝试了大约一个小时,可以让它去做)。如果这是更好的选择 - 那我该怎么做?上次我试过,我淹死了一堆关于MIME的信息,这是我以前从未听说过的。这是正确的轨道,还是有更简单的方法?我还读了一些关于Zend_framework和PHPMailer的内容,但是真的不知道哪种方法是正确的(或更好的)...
...或
2)在电子邮件中放入发票的链接。现在,如果我这样做,那么URL应该以某种方式被屏蔽或加密,因为如果他们访问的链接是:
,它将使得查找其他发票变得太容易了。http://www.something.com/invoicefolder/invoice16.pdf
显然,人们可以将16改为15,突然之间,那些拥有网络知识的人可以访问所有发票。
这就是为什么我谦卑地问你,StackOverflow ...将这个发票从FTP服务器发送到客户端的最佳(或最安全的方法)是什么,其中通信方法是电子邮件?
谢谢。
答案 0 :(得分:1)
我会查看PHPMailer并将发票作为附件发送。 PHPMailer非常易于使用,并且有一些很好的示例代码。
答案 1 :(得分:1)
确保发票不在公共文件夹中(即在doc根目录下),并让PHP根据请求提供服务。通过这种方式,您可以强制人们登录。
另一个想法是只将发票附加到电子邮件中,尽管人们往往会丢失电子邮件而他们仍然希望能够访问他们的发票。
答案 2 :(得分:1)
你必须创建一个控制器文件说“invoice.php”,它会强制下载指定的pdf文件,你的网址应该是这样的
假设您已在发票文件夹中存储了文件54219683.pdf,您可以在电子邮件中发送以下网址
http://www.example.com/invoice.php?id=54219683
这是一个非常简单的例子
//file: invoice.php
//content type
$file = $_GET['id'].'.pdf';
header('Content-type: application/pdf');
//open/save dialog box
header('Content-Disposition: attachment; filename="$file"');
//read from server and write to buffer
readfile($file);
您可以在http://www.finalwebsites.com/forums/topic/php-file-download
上找到更多详细信息,以便通过php文件下载pdf您不应该使用精确映射到数据库ID来保存实际文件,但是您应该为每个发票文件名使用随机唯一编号,这是黑客无法猜到的。
当您使用序列号保存文件时出现问题,因此请不要保存pdf文件,如1.pdf,2.pdf,3.pdf,但使用随机数保存,其次不要发送包含确切网址的电子邮件的文件,但通过控制器文件下载,您可以在其中添加更多限制,您也可以跟踪每次下载。
答案 3 :(得分:1)
我淹死了一堆关于MIME的信息,这是我以前从未听说过的。
很抱歉,但这真的让我的警钟响起 - 你必须对所提供的技术有基本的了解才能在代码中实现解决方案。
是的,您可以将其附加到电子邮件中 - 但是我建议您不要使用zend框架,直到您对软件开发更加熟悉。 phpmailer和swiftmailer都提供了一个简单,记录良好的API,用于处理电子邮件中的附件。
该问题的一个简单解决方案是将PDF文件保留在文档根目录之外,并使用执行其他验证的代理脚本。 e.g。
define('MY_SECRET', 'some rAnd0m strlng');
define('DOC_DIR','/path/to/files');
function getIdHash($id)
{
return sha1($id . MY_SECRET);
}
$id=(integer) $_GET['doc_id'];
$filename=DOC_DIR . '/' . $id . '.pdf';
if ( ($_GET['chk']==getIdHash($id))
&& file_exists($filename) && is_readable($filename)) {
header("Content-type:application/pdf");
readfile($filename);
exit;
} else {
header("Status: 404 Not Found");
print "Document does not exist or not authorized";
}
答案 4 :(得分:0)
我会采用类似于像RapidShare这样的共享储物柜的方案:
domain.com/invoice/{md5($email)}/{time()}.pdf
这个解决方案不够安全。有人猜测(或暴力破解)电子邮件地址的MD5摘要和生成发票的时间将非常困难。
此外,你可以发送带有附件的电子邮件,就像其他人所说的那样,如果你使用像SwiftMailer这样的库,这是非常简单的。即使implementing your own也不是那么困难。