【发布时间】:2011-01-02 00:28:27
【问题描述】:
我需要创建一个可以向网站的所有成员发送电子邮件的 PHP 类。简单的 mysql_fetch_array 和循环不适合,因为我的客户想要一个类,而我实际上对类以及他到底想要什么知之甚少。你能解释一下或给我任何提示吗?
【问题讨论】:
-
请您的客户说明他想要什么。你的问题没有多大意义。
我需要创建一个可以向网站的所有成员发送电子邮件的 PHP 类。简单的 mysql_fetch_array 和循环不适合,因为我的客户想要一个类,而我实际上对类以及他到底想要什么知之甚少。你能解释一下或给我任何提示吗?
【问题讨论】:
一般来说,我们无法告诉您您的客户想要什么。你得问问他。 :) 但是有一些关于发送更多电子邮件的一般指示。
在组合一个 E-Mail 类时,要注意的最敏感的事情,也是它不起作用的最可能原因是要发送的邮件数量。 mail() 是发送邮件的一个非常慢的命令,如果你有成千上万的成员,纯 mail() 的解决方案很可能会失败,因为 PHP 脚本的运行时间通常限制在 30 或 60 秒。
查看电子邮件类,如 PHPMailer,它可以直接通过 SMTP 发送,这样更快。
还要确保检查发送邮件的服务器是否对每个间隔的外发电子邮件数量施加任何限制。如果您使用托管服务提供商,请先与他们交谈。这也很好,因为这样他们就知道您没有滥用他们的服务器来发送垃圾邮件。
确保在实际开始向实际成员发送之前进行测试运行。
还要确保您的外发电子邮件看起来正常。从技术上讲,这样他们就不会被垃圾邮件过滤。请参阅this question 获取一些建议。
有关面向对象编程的基础知识,请参阅例如主题上的PHP Manual。
通常,在使用邮件系统时要非常小心。确保在一切正常之前进行检查,以防止实际发送给实际成员。想象一下,将十封“asfsafsd”测试电子邮件发送给收件人列表中的每个人是多么尴尬。
不要忘记,也有付费服务可以做到这一点。如果涉及一些预算,并且您想使用现有的付费解决方案而不是自己动手,您可以在 SO 上设置另一个问题。
【讨论】:
首先你应该问你的客户他想要什么,如果你不知道的话。否则无法继续。其次,让自己熟悉Object Oriented Programming,尤其是PHP。
【讨论】:
如果可以使用phpmailer是一个处理所有邮件发送的类,
或使用 phpclasses 网站上的类(需要注册)
http://www.phpclasses.org/browse/package/1553.html
类代码:
<?
/* sendMail Class - by André Cupini - andre@neobiz.com.br */
class sendMail
{
var $to;
var $cc;
var $bcc;
var $subject;
var $from;
var $headers;
var $html;
function sendMail()
{
$this->to = NULL;
$this->cc = NULL;
$this->bcc = NULL;
$this->subject = NULL;
$this->from = NULL;
$this->headers = NULL;
$this->html = FALSE;
}
function getParams($params)
{
$i = 0;
foreach ($params as $key => $value) {
switch($key) {
case 'to':
$this->to = $value;
break;
case 'cc':
$this->cc = $value;
break;
case 'bcc':
$this->bcc = $value;
break;
case 'subject':
$this->subject = $value;
break;
case 'from':
$this->from = $value;
break;
case 'submitted':
NULL;
break;
default:
$this->body[$i]["key"] = str_replace("_", " ", ucWords(strToLower($key)));
$this->body[$i++]["value"] = $value;
}
}
}
function setHeaders()
{
$this->headers = "From: $this->from\r\n";
if($this->html === TRUE) {
$this->headers.= "MIME-Version: 1.0\r\n";
$this->headers.= "Content-type: text/html; charset=iso-8859-1\r\n";
}
if(!empty($this->cc)) $this->headers.= "Cc: $this->cc\r\n";
if(!empty($this->bcc)) $this->headers.= "Bcc: $this->bcc\r\n";
}
function parseBody()
{
$count = count($this->body);
for($i = 0; $i < $count; $i++) {
if($this->html) $content.= "<b>";
$content .= $this->body[$i]["key"].': ';
if($this->html) $content.= "</b>";
if($this->html) $content .= nl2br($this->body[$i]["value"])."\n";
else $content .= $this->body[$i]["value"];
if($this->html) $content.= "<hr noshade size=1>\n";
else $content.= "\n".str_repeat("-", 80)."\n";
}
if($this->html) {
$content = "
<style>
BODY {
font-family: verdana;
font-size: 10;
}
</style>
".$content;
}
$this->body = $content;
}
function send()
{
if(mail($this->to, $this->subject, $this->body, $this->headers)) return TRUE;
else return FALSE;
}
function set($key, $value)
{
if($value) $this->$key = $value;
else unset($this->$key);
}
}
?>
【讨论】:
setHeaders)。看起来这个类使事情变得更加复杂。
【讨论】:
是的,以上所有答案都是正确的。我一直使用 PHP Mailer。我个人在我的数据库中有一个“发件箱”表,我在其中排队传出消息。然后我有一个 CRON 工作通过并一次发送块。这不仅使您可以控制发送速率,而且如果您“搞砸”并发送错误的内容,您可以快速进入数据库并在 cron 出现之前将它们全部清除。我什至在我的大型项目中实现了优先级,这样重要的电子邮件就会在新闻通讯之类的事情之前发出。
祝你好运!
【讨论】: