python 에서 메 일 을 보 내 는 어 지 러 운 문제 해결 방법

회사 프로젝트 에 서 는 배경 을 통 해 메 일 을 보 내야 하 며,메 일 내용 은 사진 첨부 파일 을 포함한다.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")방식 을 통 해 utf 8 로 전환 한 후에 모두 정상 적 인 것 이다.
다음은 관련 코드 를 공유 합 니 다.
PHP 는 python 스 크 립 트

// 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 에서 메 일 스 크 립 트

# -*- 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<[email protected]>" % Header("xx ","utf-8")
server = smtplib.SMTP("smtp.exmail.qq.com",25)
server.login("[email protected]","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)

를 호출 하여 일반 텍스트

text_msg = email.MIMEText.MIMEText("xxxx ",_charset="utf-8")
main_msg.attach(text_msg)
또는

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")로 중복 전환 하지 마 세 요.그렇지 않 으 면 오류 가 발생 할 수 있 습 니 다.

좋은 웹페이지 즐겨찾기