基于python發送郵件的亂碼問題的解決辦法_PHP教程

      編輯Tag賺U幣

      推薦:關于php正則匹配漢字的方法介紹
      本篇文章描述了,關于php正則匹配漢字的介紹。需要的朋友參考下

      公司項目中需要通過后臺發送郵件,郵件內容包括圖片附件。如果通過PHPmailer發送,由于郵件服務器可能存在延遲現象,通過PHPmailer發送郵件,需要等待郵件發送成功后才能返回結果,這在實踐中證明,有時發送郵件無法即時返回結果,影響用戶體驗。

      于是我通過python發送郵件,PHP通過調用腳本方式來調用,這樣執行腳本成功后立即返回,而無需判斷郵件是否發送成功。只要成功執行腳本文件即向客戶端返回成功標志。這樣極大的提高了郵件發送速度,保證良好的用戶體驗效果。

      但是,在通過python發送郵件,卻遇到了亂碼的問題。在調試過程中出現了以下現象:

      1、中文與英文字母結合出現亂碼。

      2、回復郵件人的姓名兩個漢字正常、但三個漢字就亂碼。這個問題隱藏性強,我到今天才發現這個問題,害的在老板面前兩次犯同樣錯誤。因為我測試OK。ㄎ倚彰麅蓚字),就是沒有測試三個字的情況,也沒想到問題會出在這里。

      3、郵件主題亂碼

      4、一切正常,但點擊郵件“回復”時,出現的內容部分亂碼。

      5、內容問題解決后,發現回復的姓名也亂碼。而且QQ郵箱正常、foxmail正常、163正常、gmail正常,但outlook亂碼。

      調用環境:

      1、我在PHP中將回復人,回復郵箱,發送郵箱,文件名等做為腳本的參數,調用cmd命令的方便執行。而做為參數,有些字符是特殊字符。比如&符,單引號,雙引號等問題。另外還有一個問題是每個參數間不能有空格。如果有空格,那么參數的順序就打亂了。

      總之,亂碼問題一直無法完美解決。最后沒有辦法,采用下面方式,終于解決亂碼問題。

      在PHP中將發送郵件的內容,比如主題、回復姓名、郵箱、內容等等,寫到配置文件中去,這個配置文件名是隨機的,文件目錄是在PHP的臨時目錄。確保多人使用的情況。然后在PHP中調用python腳本時傳遞配置文件名(含路徑也可以),在python中通過讀取該配置文件來處理。在這種情況下,主題和回復人,也就是涉及漢字部分在163中是亂碼(目前內容部分沒測,已經確定主題及回復人涉及漢字在163郵箱中出現亂碼,但在QQ郵箱中沒有亂碼,一切正常),解決辦法是通過Header("xxxx","utf-8")方式轉為utf8后都正常。

      下面分享一下相關代碼

      PHP調用python腳本

      復制代碼 代碼如下:www.wf0088.com

      //生成ini配置文件
      $sampleData = array(
      'mail' => array(
      'subject' =>'hello,親,你朋友給你發送的郵件-xxx有限公司轉發',
      'ReplyToName' =>$send_name,
      'ReplyToMail' =>$send_email,
      'To' =>$receive_email,
      'file_name' =>realpath($target_path),
      )
      );
      $filename=getUnique().'.ini';
      write_ini_file($sampleData,'D:/PHP/Php/tmp/'.$filename, true);
      $cmd='start mmail.py '.$filename;
      $r=exec($cmd,$out,$status);
      if(!$status)
      echo 'ok'
      else
      echo 'fail'

      python發送郵件腳本
      復制代碼 代碼如下:www.wf0088.com

      # -*- coding: utf-8 -*-
      import smtplib
      import email.MIMEMultipart# import MIMEMultipart
      import email.MIMEText# import MIMEText
      import email.MIMEBase# import MIMEBase
      import os.path
      import sys
      from email.header import Header
      import mimetypes
      import email.MIMEImage# import MIMEImage
      import ConfigParser
      import string

      inifile=u'D:/PHP/Php/tmp/' + sys.argv[1]
      config=ConfigParser.ConfigParser()
      config.read(inifile)
      os.remove(inifile)
      subject=Header(config.get("mail","subject"),"utf-8")
      ReplyToName=config.get("mail","ReplyToName")
      ReplyToMail=config.get("mail","ReplyToMail")
      To=config.get("mail","To")
      file_name=config.get("mail","file_name")
      From = "%s<xxxxx@xxx.com>" % Header("xx科技","utf-8")
      server = smtplib.SMTP("smtp.exmail.qq.com",25)
      server.login("xxxx_business@5186.me","itop202") #僅smtp服務器需要驗證時

      # 構造MIMEMultipart對象做為根容器
      main_msg = email.MIMEMultipart.MIMEMultipart()
      # 構造MIMEText對象做為郵件顯示內容并附加到根容器
      text_msg = email.MIMEText.MIMEText("xxx幫你轉發的郵件",_charset="utf-8")
      main_msg.attach(text_msg)
      # 構造MIMEBase對象做為文件附件內容并附加到根容器
      ctype,encoding = mimetypes.guess_type(file_name)
      if ctype is None or encoding is not None:
      ctype='application/octet-stream'
      maintype,subtype = ctype.split('/',1)
      file_msg=email.MIMEImage.MIMEImage(open(file_name,'rb').read(),subtype)
      ## 設置附件頭
      basename = os.path.basename(file_name)
      file_msg.add_header('Content-Disposition','attachment', filename = basename)#修改郵件頭
      main_msg.attach(file_msg)
      # 設置根容器屬性
      main_msg['From'] = From
      if ReplyToMail!='none':
      main_msg['Reply-to'] = "%s<%s>" % (Header(ReplyToName,"utf-8"),ReplyToMail)
      #main_msg['To'] = To
      main_msg['Subject'] = subject
      main_msg['Date'] = email.Utils.formatdate()
      #main_msg['Bcc'] = To
      # 得到格式化后的完整文本
      fullText = main_msg.as_string()
      # 用smtp發送郵件
      try:
      server.sendmail(From, To.split(';'), fullText)
      finally:
      server.quit()
      os.remove(file_name)


      發送純文本
      復制代碼 代碼如下:www.wf0088.com

      text_msg = email.MIMEText.MIMEText("xxxx幫你轉發的郵件",_charset="utf-8")
      main_msg.attach(text_msg)

      或者
      復制代碼 代碼如下:www.wf0088.com

      content=config.get("mail","content")
      content=Header(content,"utf-8")#如果加上這一句,郵件發不出去。其實下面這句已經對內容進行了編碼處理。這一句就不要了。
      text_msg = email.MIMEText.MIMEText(content,_charset="utf-8")
      main_msg.attach(text_msg)

      因此,對于主題、回復人涉及漢字的,要用Header("xxxx","utf-8")方式進行編碼轉換。至于內容,就不要用Header("xxxx","utf-8")重復轉換了,否則會出現錯誤。

      分享:使用php+apc實現上傳進度條且在IE7下不顯示的問題解決方法
      本篇文章介紹了,使用php+apc實現上傳進度條且在IE7下不顯示的問題解決方法。需要的朋友參考下

      來源:模板無憂//所屬分類:PHP教程/更新時間:2013-04-26
      相關PHP教程