ホームページ  >  記事  >  バックエンド開発  >  python_PHP チュートリアルに基づいたメール送信時の文字化け問題の解決策

python_PHP チュートリアルに基づいたメール送信時の文字化け問題の解決策

WBOY
WBOYオリジナル
2016-07-21 15:11:53900ブラウズ

企業プロジェクトでは、電子メールをバックグラウンドで送信する必要があり、電子メールの内容には画像の添付ファイルが含まれます。 PHPmailer 経由で送信した場合、メール サーバーで遅延が発生する可能性があるため、PHPmailer 経由で電子メールを送信すると、結果が返されるまで電子メールが正常に送信されるまで待機する必要があります。これは、電子メールを送信してもすぐに結果が返されない場合があり、影響を受けることが実際に証明されています。ユーザーエクスペリエンス。

そこで、Pythonでメールを送信し、PHPはスクリプトを呼び出してメールを呼び出し、メールが正常に送信されたかどうかを判断せずに、スクリプトの実行に成功したらすぐに戻るようにしました。スクリプト ファイルが正常に実行される限り、成功フラグがクライアントに返されます。これにより、電子メールの送信速度が大幅に向上し、優れたユーザー エクスペリエンスが保証されます。

しかし、Pythonでメールを送信する際に文字化けという問題に遭遇しました。デバッグプロセス中に、次の現象が発生しました:

1. 中国語と英語の組み合わせが文字化けします。

2. メールに返信した人の名前は漢字2文字ですが、漢字3文字が文字化けしています。この問題は非常に隠されており、私は今日初めてこの問題を発見したため、上司の前で同じ間違いを 2 回犯してしまいました。私のテストはOKでした(私の名前は2文字です)が、3文字をテストしなかったため、ここで問題が発生するとは予想していませんでした。

3. メールの件名が文字化けしています

4. すべて正常ですが、メールの「返信」をクリックすると、表示される内容の一部が文字化けします。

5. 内容の問題が解決した後、返信の名前も文字化けしていることがわかりました。また、QQメールボックスは正常、foxmailは正常、163は正常、gmailは正常ですがoutlookは文字化けします。

通話環境:

1. PHP では、返信者、返信メール、送信メール、ファイル名などをスクリプトのパラメータとして使用し、便利に実行するために cmd コマンドを呼び出します。パラメータとして、一部の文字は特殊文字です。たとえば、アンパサンド、一重引用符、二重引用符などの問題です。もう 1 つの問題は、各パラメータの間にスペースを入れることができないことです。スペースが含まれる場合、パラメータの順序が崩れます。

つまり、文字化けの問題は完全に解決することはできません。結局、他に方法がなかったので、以下の方法を採用して、最終的にコード化けの問題を解決しました。

PHPでは、件名、返信名、メールアドレス、内容など、送信するメールの内容を設定ファイルに書き込みます。この設定ファイルの名前はランダムで、ファイルディレクトリは一時ディレクトリにあります。 PHP。必ず複数人で使用してください。次に、PHP で Python スクリプトを呼び出すときに設定ファイル名 (パスを含む) を渡し、Python で設定ファイルを読み込んで処理します。この場合、トピックと返信者、つまり漢字が含まれる部分が163で文字化けしています(コンテンツ部分は現時点では未検証です。トピックと返信者に漢字が含まれる部分は文字化けしていると判明しています)。 163 メールボックスではありますが、QQ メールボックスでは文字化けはなく、すべて正常です)、解決策は、Header("xxxx", "utf-8") を介して utf8 に変換することです。すべて正常です。

以下の関連コードを共有してください:

PHPはPythonスクリプトを呼び出します

コードをコピーします コードは次のとおりです:

//ini設定ファイルを生成します
$sampleData = array(
'mail' => array(
'subject' = >'こんにちは、あなたの友人があなたにメールを送りました - xxx Co., Ltd. から転送',
'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 メール送信スクリプト
コードをコピー コードは次のとおりです:

# -*- コーディング: 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("メール","宛先")
file_name=config.get("メール","ファイル名")
From = "%s" % Header("xx Technology", "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 forwardedあなたへのメール ",_charset="utf-8")
main_msg.attach(text_msg)
# 添付ファイルのコンテンツとして MIMEBase オブジェクトを構築し、ルート コンテナに添付します
ctype, encoding = mimetypes.guess_type(file_name)
ctype が None であるか、エンコーディングが 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)
最後に:
server .quit()
os.remove(file_name)


プレーンテキストを送信
コードをコピー コードは次のとおりです:

text_msg = email.MIMEText.MIMEText( "xxxx によってあなたのために転送されたメール", _charset="utf-8")
main_msg.attach(text_msg)

or
コードをコピーします コードは次のとおりです:

内容=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") を使用して繰り返し変換しないでください。変換するとエラーが発生します。

www.bkjia.com本当http://www.bkjia.com/PHPjc/326788.html技術記事企業プロジェクトでは、電子メールをバックグラウンドで送信する必要があり、電子メールの内容には画像の添付ファイルが含まれます。 PHPmailer 経由で送信する場合、メールサーバーの遅延の可能性があるため、PHPmailer 経由で送信します...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。