PHP로 이메일을 보낼 때 일반적으로 이메일을 보내기 위해 PHP SMTP 이메일 클래스를 캡슐화합니다. 그러나 PHP의 기본 소켓 프로그래밍은 Python에 비해 매우 비효율적입니다. CleverCode는 또한 웹 페이지를 크롤링하기 위해 Python으로 작성된 크롤러와 웹 페이지를 크롤링하기 위해 PHP로 작성된 크롤러를 작성했습니다. 나는 PHP의 컬이 웹 페이지를 크롤링하는 데 사용되지만 시간 초과, 여러 스레드에 의한 동시 크롤링 등을 포함한다는 것을 발견했습니다. 파이썬은 PHP보다 네트워크 프로그래밍에서 훨씬 더 효율적이라고 말하고 싶습니다.
PHP가 이메일을 보낼 때 자체적으로 작성된 SMTP 클래스는 전송 효율성과 속도가 상대적으로 낮습니다. 특히 보고서가 첨부된 대량의 이메일을 동시에 보낼 때 더욱 그렇습니다. PHP의 효율성은 매우 낮습니다. 이메일을 보내려면 PHP를 사용하여 Python을 호출하는 것이 좋습니다.
php 프로그램과 python 파일은 동일한 인코딩이어야 합니다. 모두 gbk 숫자이거나 동시에 utf-8로 인코딩된 경우 그렇지 않으면 잘못된 문자가 쉽게 나타납니다. Python은 주로 이메일 모듈을 사용하여 이메일을 보냅니다. 여기에 있는 Python 파일과 PHP 파일은 모두 gbk로 인코딩되어 있으며, 전송된 이메일의 헤더 내용과 본문 내용도 gbk로 인코딩되어 있습니다.
#!/usr/bin/python # -*- coding:gbk -*- """ 邮件发送类 """ # mail.py # # Copyright (c) 2014 by http://blog.csdn.net/CleverCode # # modification history: # -------------------- # 2014/8/15, by CleverCode, Create import threading import time import random from email.MIMEText import MIMEText from email.MIMEMultipart import MIMEMultipart from email.MIMEBase import MIMEBase from email import Utils, Encoders import mimetypes import sys import smtplib import socket import getopt import os class SendMail: def init(self,smtpServer,username,password): """ smtpServer:smtp服务器, username:登录名, password:登录密码 """ self.smtpServer = smtpServer self.username = username self.password = password def genMsgInfo(self,fromAddress,toAddress,subject,content,fileList,\ subtype = 'plain',charset = 'gb2312'): """ 组合消息发送包 fromAddress:发件人, toAddress:收件人, subject:标题, content:正文, fileList:附件, subtype:plain或者html charset:编码 """ msg = MIMEMultipart() msg['From'] = fromAddress msg['To'] = toAddress msg['Date'] = Utils.formatdate(localtime=1) msg['Message-ID'] = Utils.make_msgid() #标题 if subject: msg['Subject'] = subject #内容 if content: body = MIMEText(content,subtype,charset) msg.attach(body) #附件 if fileList: listArr = fileList.split(',') for item in listArr: #文件是否存在 if os.path.isfile(item) == False: continue att = MIMEText(open(item).read(), 'base64', 'gb2312') att["Content-Type"] = 'application/octet-stream' #这里的filename邮件中显示什么名字 filename = os.path.basename(item) att["Content-Disposition"] = 'attachment; filename=' + filename msg.attach(att) return msg.as_string() def send(self,fromAddress,toAddress,subject = None,content = None,fileList = None,\ subtype = 'plain',charset = 'gb2312'): """ 邮件发送函数 fromAddress:发件人, toAddress:收件人, subject:标题 content:正文 fileList:附件列表 subtype:plain或者html charset:编码 """ try: server = smtplib.SMTP(self.smtpServer) #登录 try: server.login(self.username,self.password) except smtplib.SMTPException,e: return "ERROR:Authentication failed:",e #发送邮件 server.sendmail(fromAddress,toAddress.split(',') \ ,self.genMsgInfo(fromAddress,toAddress,subject,content,fileList,subtype,charset)) #退出 server.quit() except (socket.gaierror,socket.error,socket.herror,smtplib.SMTPException),e: return "ERROR:Your mail send failed!",e return 'OK' def usage(): """ 使用帮助 """ print """Useage:%s [-h] -s <smtpServer> -u <username> -p <password> -f <fromAddress> -t <toAddress> [-S <subject> -c <content> -F <fileList>] Mandatory arguments to long options are mandatory for short options too. -s, --smtpServer= smpt.xxx.com. -u, --username= Login SMTP server username. -p, --password= Login SMTP server password. -f, --fromAddress= Sets the name of the "from" person (i.e., the envelope sender of the mail). -t, --toAddress= Addressee's address. -t "test@test.com,test1@test.com". -S, --subject= Mail subject. -c, --content= Mail message.-c "content, ......." -F, --fileList= Attachment file name. -h, --help Help documen. """ %sys.argv[0] def start(): """ """ try: options,args = getopt.getopt(sys.argv[1:],"hs:u:p:f:t:S:c:F:","--help --smtpServer= --username= --password= --fromAddress= --toAddress= --subject= --content= --fileList=",) except getopt.GetoptError: usage() sys.exit(2) return smtpServer = None username = None password = None fromAddress = None toAddress = None subject = None content = None fileList = None #获取参数 for name,value in options: if name in ("-h","--help"): usage() return if name in ("-s","--smtpServer"): smtpServer = value if name in ("-u","--username"): username = value if name in ("-p","--password"): password = value if name in ("-f","--fromAddress"): fromAddress = value if name in ("-t","--toAddress"): toAddress = value if name in ("-S","--subject"): subject = value if name in ("-c","--content"): content = value if name in ("-F","--fileList"): fileList = value if smtpServer == None or username == None or password == None: print 'smtpServer or username or password can not be empty!' sys.exit(3) mail = SendMail(smtpServer,username,password) ret = mail.send(fromAddress,toAddress,subject,content,fileList) if ret != 'OK': print ret sys.exit(4) print 'OK' return 'OK' if name == 'main': start()
이 프로그램의 사용법 도움말을 출력하려면 다음 명령을 입력하세요
# python mail.py --help
이 프로그램은 주로 php 스플라이싱입니다 command 문자열 , Python 프로그램 호출. 참고: 프로그램을 사용하여 이메일을 보내려면 이메일 서비스 제공업체에 가서 stmp 서비스 기능을 활성화해야 합니다. 예를 들어, QQ에서는 프로그램을 사용하여 이메일을 보내기 전에 SMTP 기능을 활성화해야 합니다. 아래 그림과 같이 엽니다.
php호출 프로그램은 다음과 같습니다.
<?php /** * SendMail.php * * 发送邮件类 * * Copyright (c) 2015 by http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/5/18, by CleverCode, Create * */ class SendMail{ /** * 发送邮件方法 * * @param string $fromAddress 发件人,'clevercode@qq.com' 或者修改发件人名 'CleverCode<clevercode@qq.com>' * @param string $toAddress 收件人,多个收件人逗号分隔,'test1@qq.com,test2@qq.com,test3@qq.com....', 或者 'test1<test1@qq.com>,test2<test2@qq.com>,....' * @param string $subject 标题 * @param string $content 正文 * @param string $fileList 附件,附件必须是绝对路径,多个附件逗号分隔。'/data/test1.txt,/data/test2.tar.gz,...' * @return string 成功返回'OK',失败返回错误信息 */ public static function send($fromAddress, $toAddress, $subject = NULL, $content = NULL, $fileList = NULL){ if (strlen($fromAddress) < 1 || strlen($toAddress) < 1) { return '$fromAddress or $toAddress can not be empty!'; } // smtp服务器 $smtpServer = 'smtp.qq.com'; // 登录用户 $username = 'clevercode@qq.com'; // 登录密码 $password = '123456'; // 拼接命令字符串,实际是调用了/home/CleverCode/mail.py $cmd = "LANG=C && /usr/bin/python /home/CleverCode/mail.py"; $cmd .= " -s '$smtpServer'"; $cmd .= " -u '$username'"; $cmd .= " -p '$password'"; $cmd .= " -f '$fromAddress'"; $cmd .= " -t '$toAddress'"; if (isset($subject) && $subject != NULL) { $cmd .= " -S '$subject'"; } if (isset($content) && $content != NULL) { $cmd .= " -c '$content'"; } if (isset($fileList) && $fileList != NULL) { $cmd .= " -F '$fileList'"; } // 执行命令 exec($cmd, $out, $status); if ($status == 0) { return 'OK'; } else { return "Error,Send Mail,$fromAddress,$toAddress,$subject,$content,$fileList "; } return 'OK'; } }
엑셀을 첨부파일로 압축해서 이메일로 보내주세요.
<?php /** * test.php * * 压缩excel成附件,发送邮件 * * Copyright (c) 2015 http://blog.csdn.net/CleverCode * * modification history: * -------------------- * 2015/5/14, by CleverCode, Create * */ include_once ('SendMail.php'); /* * 客户端类 * 让客户端和业务逻辑尽可能的分离,降低页面逻辑和业务逻辑算法的耦合, * 使业务逻辑的算法更具有可移植性 */ class Client{ public function main(){ // 发送者 $fromAddress = 'CleverCode<clevercode@qq.com>'; // 接收者 $toAddress = 'all@qq.com'; // 标题 $subject = '这里是标题!'; // 正文 $content = "您好:\r\n"; $content .= " 这里是正文\r\n "; // excel路径 $filePath = dirname(FILE) . '/excel'; $sdate = date('Y-m-d'); $PreName = 'CleverCode_' . $sdate; // 文件名 $fileName = $filePath . '/' . $PreName . '.xls'; // 压缩excel文件 $cmd = "cd $filePath && zip $PreName.zip $PreName.xls"; exec($cmd, $out, $status); $fileList = $filePath . '/' . $PreName . '.zip'; // 发送邮件(附件为压缩后的文件) $ret = SendMail::send($fromAddress, $toAddress, $subject, $content, $fileList); if ($ret != 'OK') { return $ret; } return 'OK'; } } /** * 程序入口 */ function start(){ $client = new Client(); $client->main(); } start(); ?>
위 내용은 PHP가 Python을 호출하여 동시성이 높은 이메일을 빠르게 보내는 방법에 대한 샘플 코드의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!