本人接触PHP已有一年,公司需要导入excel然后发送给每个人工资条,所以我就借助各方面资源写了这些,现在公司已经开始使用了,如有一些地方写得有问题或者很糟糕的地方,还请各位大神给出指点,小弟再修正.
思路是使用多个邮箱 轮流 依次 给多个员工发送邮件,是为了防止因为短时间大批量发送邮件被封,我也不知道这样管不管用,但是我是这么做的,比如有邮箱m1,m2,m3.员工有12345,那么发送的顺序是这样的m1=>1,m2=>2,m3=>3,m1=>4,m2=>5
这篇文章省略了Excel的导入,DAO层的操作,主要是controller和service层的邮箱选择并且轮流给每位员工发送邮件的操作,看起来比较简陋,我个人感觉功能应该没什么太大的问题
邮箱里边这个东西要先打开,要不然一切都是徒劳
phpexcel和phpmailer放在了vendor下边,这两个文件git上都有自己下载就是了
我也在网盘里存了一份,链接:https://pan.baidu.com/s/1kYnVs21US6pRxrDIRMfXjg 密码:fg5d
在extend里边写了一个执行发送和选择邮箱的类
last_id=count($this->emails)-1;
$this->current_id=0;
}
/**
* @return Mail|null
* 单例 避免并发冲突
*/
static public function instance(){
if(!(self::$instance instanceof Mail)){
self::$instance = new self;
}
return self::$instance;
}
/**
* @param $to_email
* @param $message
* @return array
* @throws \PHPMailer\PHPMailer\Exception
* 发送邮件
*/
public function send($to_name,$to_emails,$message){
$email = $this->getNextEmail();//每次发送都要获取一个邮箱
$mail = new PHPMailer();
$mail->Port = 465;
$mail->CharSet = 'UTF-8';
$mail->isSMTP();
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'ssl';
$mail->isHTML(true);
$mail->Host = 'smtp.mxhichina.com';
$mail->FromName = '';
$mail->Username = $email;
$mail->Password = $this->password;
$mail->setFrom($email,'财务部'); //发送方地址和昵称
$mail->addAddress($to_emails);//收件方地址和昵称
$mail->Subject = "工资条"; //标题
$mail->Body = $message; //内容
if ($mail->send()) {
echo '收件人:'.$to_name.',收件邮箱:'.$to_emails.',发送成功
';
} else {
echo '收件人:'.$to_name.',收件邮箱:'.$to_emails.',发送失败,重新发送
';
}
}
/**
* @return mixed
* 获取下一个邮箱
*/
private function getNextEmail(){
if($this->current_id<$this->last_id){
$this->current_id++;
}else{
$this->current_id=0;
}
return $this->emails[$this->current_id];
}
}
控制器,获取要发送的信息和收件人的邮箱,然后引用上边那个类来执行发送操作
因为工资表的信息是用excel导入到数据库的,每位员工的邮箱也存在这里边,所以这里我就直接在数据库里取了
getContent();//获取数据表信息
foreach($content as $k=>$v){
if(empty($v['mail'])){
continue(1);
};//判断邮箱是否为空
$chars = "/^([0-9A-Za-z\\-_\\.]+)@([0-9a-z]+\\.[a-z]{2,3}(\\.[a-z]{2})?)$/i";
if (!preg_match($chars, $v['mail'])){
echo $v['name']."的邮箱不合法,请检查邮箱后单条导入,重新发送返回首页
";
continue(1);
}//验证邮箱合法性
$message = "
工资月份 {$v['this_month']}
入职时间 {$v['join_time']}
姓名 {$v['name']}
基本工资 {$v['basic_wage']}
出勤天数 {$v['attendance']}
业绩考核 {$v['performance']}
奖金 {$v['award']}
加班时间 {$v['overtime']}
薪资变动 {$v['wage_change']}
请假天数 {$v['askforleave']}
公休 {$v['dayoff']}
迟到扣款 {$v['late_forfeit']}
缺卡扣款 {$v['sign_forfeit']}
社保扣费 {$v['social_security']}
旷工 {$v['neglect_work']}
应发工资 {$v['gross_pay']}
个人所得税扣费 {$v['individual_income_tax']}
实发工资 {$v['real_pay']}
";
if(empty($message)){
continue(1);
}//判断内容是否为空
UE::instance()->send($v['name'],$v['mail'],$message);
$wage->editStatus($v['id']);//这个是在发送完成以后把数据库里的一个字段标识改一下
}
}
}
最后感谢我上上任技术经理给了我很大的帮助