如何使用CodeIgniter邮件库向数据库联系人列表发送邮件?
嘿,作为CodeIgniter新手能想到从数据库批量发邮件,这点超棒!完全可以实现,而且用模型来处理数据库操作是CI推荐的最佳实践,代码会更整洁好维护。我给你一步步拆解怎么做:
第一步:创建联系人模型(推荐做法)
首先我们建一个专门处理联系人数据的模型,这样数据库操作和业务逻辑分开,符合MVC的设计思路。
在application/models/目录下新建Contacts_model.php,代码如下:
<?php class Contacts_model extends CI_Model { public function __construct() { parent::__construct(); $this->load->database(); // 加载数据库连接 } // 获取所有联系人的邮箱地址,返回二维数组(每个元素含email字段) public function get_all_contacts_emails() { $this->db->select('email'); $query = $this->db->get('contacts'); return $query->result_array(); } }
第二步:配置邮件类
CodeIgniter的邮件类可以全局配置,也可以在控制器里动态配置。新手可以先试试动态配置,测试没问题再写到全局配置文件里。
方式1:控制器内动态配置
在你要发送邮件的控制器里,加载邮件库并配置:
// 加载邮件库 $this->load->library('email'); // 邮件配置(根据你的邮件服务商调整,比如Gmail、阿里云邮箱等) $config = array( 'protocol' => 'smtp', // 推荐用SMTP协议,稳定性更高 'smtp_host' => 'smtp.example.com', // 你的SMTP服务器地址 'smtp_port' => 587, // SMTP端口,常见的是587或465 'smtp_user' => 'your_email@example.com', // 发件人邮箱 'smtp_pass' => 'your_email_auth_code', // 邮箱授权码(很多邮箱需要用授权码代替密码) 'mailtype' => 'html', // 支持HTML格式邮件 'charset' => 'utf-8', 'newline' => "\r\n" // 必须用这个换行符,避免发送失败 ); // 初始化配置 $this->email->initialize($config);
方式2:全局配置(更方便)
直接在application/config/email.php里填写上述配置,之后控制器里只需要加载邮件库就行,不用每次都写配置。
第三步:获取邮箱列表并发送邮件
现在我们在控制器里调用模型拿到邮箱,然后发送邮件。这里分两种常用场景:
场景1:给每个收件人发送个性化邮件(比如带对方名字)
如果需要给每个联系人发不同内容的邮件,就循环逐个发送:
// 加载模型 $this->load->model('contacts_model'); // 获取所有联系人数据 $contacts = $this->contacts_model->get_all_contacts_emails(); // 循环发送 foreach ($contacts as $contact) { $email = $contact['email']; $this->email->clear(); // 每次循环要清空之前的邮件设置 $this->email->from('your_email@example.com', '你的名字'); $this->email->to($email); $this->email->subject('专属你的邮件标题'); $this->email->message("嗨,这是给你的专属邮件内容!"); // 发送邮件并处理结果 if (!$this->email->send()) { echo '发送给' . $email . '失败:' . $this->email->print_debugger(); } else { echo '发送给' . $email . '成功!'; } }
场景2:发送统一内容的批量邮件(隐藏收件人)
如果所有收件人内容一样,不想让他们看到彼此的邮箱,用**BCC(密送)**更合适,只需要发送一次:
// 加载模型 $this->load->model('contacts_model'); // 获取所有联系人邮箱,转换成一维数组(只保留邮箱字符串) $contacts = $this->contacts_model->get_all_contacts_emails(); $email_list = array_column($contacts, 'email'); // 设置邮件内容 $this->email->clear(); $this->email->from('your_email@example.com', '你的名字'); $this->email->bcc($email_list); // 用密送,所有收件人看不到彼此邮箱 $this->email->subject('批量邮件标题'); $this->email->message('这是给所有联系人的统一邮件内容'); // 发送邮件并处理结果 if ($this->email->send()) { echo '批量邮件发送成功!'; } else { echo '发送失败:' . $this->email->print_debugger(); }
新手注意事项
- 测试阶段先只取少量邮箱(比如在模型里加
$this->db->limit(5);),避免触发邮件服务商的发送限制,被当成垃圾邮件。 - 一定要检查SMTP配置是否正确,比如端口、授权码(QQ邮箱、Gmail等都需要用授权码代替登录密码)。
- 如果发送失败,用
$this->email->print_debugger()查看详细错误信息,能快速定位问题。
内容的提问来源于stack exchange,提问作者Jim123
相关产品推荐
相关产品推荐

