PHP が Python を呼び出して同時実行性の高い電子メールを迅速に送信する方法のサンプル コード

黄舟
リリース: 2023-03-14 09:34:01
オリジナル
1841 人が閲覧しました

1 はじめに

PHP で電子メールを送信するときは、通常、PHP SMTP 電子メール クラスをカプセル化して電子メールを送信します。ただし、PHP の基礎となるソケット プログラミングは、Python に比べて非常に非効率です。 CleverCode は、Web ページをクロールするために Python で書かれたクローラーと、Web ページをクロールするために php で書かれたクローラーも作成しました。 PHP のカールは Web ページのクロールに使用されますが、タイムアウトや複数のスレッドによる同時クロールなどが発生することがわかりました。ネットワークプログラミングにおいては、Python の方が PHP よりもはるかに効率的であると言わざるを得ません。

PHP がメールを送信する場合、自身で作成した SMTP クラスは送信効率と速度が比較的低くなります。特に、レポートが添付された大量の電子メールを同時に送信する場合はそうです。 php の効率は非常に低いです。メールを送信するには、php を使用して Python を呼び出すことをお勧めします。

2 プログラム

2.1 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&#39;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 &#39;smtpServer or username or password can not be empty!&#39;
        sys.exit(3)
           
    mail = SendMail(smtpServer,username,password)
    
    ret = mail.send(fromAddress,toAddress,subject,content,fileList)
    if ret != &#39;OK&#39;:
        print ret
        sys.exit(4)
    
    print &#39;OK&#39;
    
    return &#39;OK&#39;    
     
if name == &#39;main&#39;:
    
    start()
ログイン後にコピー

2.2 Pythonプログラムの使い方ヘルプ

次のコマンドを入力してこのプログラムの使い方ヘルプを出力します

# python mail.py --help


2.3 phpプログラム

このプログラムは主にphpのスプライシングですcommand String 、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 发件人,&#39;clevercode@qq.com&#39; 或者修改发件人名 &#39;CleverCode<clevercode@qq.com>&#39;
     * @param string $toAddress 收件人,多个收件人逗号分隔,&#39;test1@qq.com,test2@qq.com,test3@qq.com....&#39;, 或者 &#39;test1<test1@qq.com>,test2<test2@qq.com>,....&#39;
     * @param string $subject 标题
     * @param string $content 正文
     * @param string $fileList 附件,附件必须是绝对路径,多个附件逗号分隔。&#39;/data/test1.txt,/data/test2.tar.gz,...&#39;
     * @return string 成功返回&#39;OK&#39;,失败返回错误信息
     */
    public static function send($fromAddress, $toAddress, $subject = NULL, $content = NULL, $fileList = NULL){
        if (strlen($fromAddress) < 1 || strlen($toAddress) < 1) {
            return &#39;$fromAddress or $toAddress can not be empty!&#39;;
        }
        // smtp服务器
        $smtpServer = &#39;smtp.qq.com&#39;;
        // 登录用户
        $username = &#39;clevercode@qq.com&#39;;
        // 登录密码
        $password = &#39;123456&#39;;
        
        // 拼接命令字符串,实际是调用了/home/CleverCode/mail.py
        $cmd = "LANG=C && /usr/bin/python /home/CleverCode/mail.py";
        $cmd .= " -s &#39;$smtpServer&#39;";
        $cmd .= " -u &#39;$username&#39;";
        $cmd .= " -p &#39;$password&#39;";
        
        $cmd .= " -f &#39;$fromAddress&#39;";
        $cmd .= " -t &#39;$toAddress&#39;";
        
        if (isset($subject) && $subject != NULL) {
            $cmd .= " -S &#39;$subject&#39;";
        }
        
        if (isset($content) && $content != NULL) {
            $cmd .= " -c &#39;$content&#39;";
        }
        
        if (isset($fileList) && $fileList != NULL) {
            $cmd .= " -F &#39;$fileList&#39;";
        }
        
        // 执行命令
        exec($cmd, $out, $status);
        if ($status == 0) {
            return &#39;OK&#39;;
        } else {
            return "Error,Send Mail,$fromAddress,$toAddress,$subject,$content,$fileList ";
        }
        return &#39;OK&#39;;
    }
}
ログイン後にコピー

2.3 使用例

Excelを添付ファイルに圧縮してメール送信します。

りー

以上がPHP が Python を呼び出して同時実行性の高い電子メールを迅速に送信する方法のサンプル コードの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!