Python의 smtplib를 사용하여 이메일 보내기

Python의 smtplib를 사용하여 이메일 보내기



1. 환경


- Windows7
- Python2.7.13

2. 하고 싶은 일


- pythonを使用してメールを送信する
- 宛先,Ccに複数人設定する
- zipファイルを添付する
- 添付ファイル名に日本語を使用する

3. 프로그램 코드


import os.path
import datetime
import smtplib
import codecs, collections
import tempfile
import zipfileJPN as zipfile
import unittest, time, re, os, sys,datetime, shutil
import MimeWriter, mimetools, base64, StringIO

from email import Encoders
from email.Utils import formatdate
from email.MIMEBase import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText

def create_message(from_addr, from_addr_name, to_addr, cc_addr, subject, body, mime, attach_file):

    zf = tempfile.TemporaryFile(prefix='mail', suffix='.zip')
    zip = zipfile.ZipFile(zf, 'w')
    files = os.listdir(attach_file['path'])
    for i in files:
        filename =""
        filename=i
        zip.write(attach_file['path']+"/"+(filename.decode("cp932")).encode("cp932"))
    zip.close()
    zf.seek(0)

    cset = 'utf-8'
    msg = MIMEMultipart()
    msg["Subject"] = subject
    msg["From"] = from_addr_name+"<"+from_addr+">"
    msg["To"] = to_addr
    msg["Cc"] = cc_addr
    msg["Date"] = formatdate()
    body = MIMEText(body.encode("utf-8"), 'plain', 'utf-8')
    msg.attach(body)

    attachment = MIMEBase(mime['type'],mime['subtype'])
    attachment.set_payload(zf.read())
    Encoders.encode_base64(attachment)
    msg.attach(attachment)
    attachment.add_header("Content-Disposition","attachment", filename=attach_file['name'])
    return msg

def send(from_addr, to_addrs, cc_addrs, msg):
    smtp = smtplib.SMTP("localhost:host")#要変更
    smtp.sendmail(from_addr, to_addrs+cc_addrs, msg.as_string())
    smtp.close()

if __name__ == '__main__':
    from_addr="[email protected]"
    from_addr_name = "テスト"
    to_addr = "[email protected],[email protected]"
    cc_addr = "[email protected],[email protected]"
    subject = u"テスト"
    body = u"テスト"
    mime={'type':'application', 'subtype':'zip'}
    attach_file={'name':'FileName.zip', 'path':'D://test/File'}
    msg = create_message(from_addr, from_addr_name, to_addr, cc_addr, subject, body, mime, attach_file)
    send(from_addr,to_addr_list, cc_addr_list, msg)


4. 설명



1. python을 사용하여 메일 보내기


  • python의 smtplib를 사용하여 메일을 보냈습니다.
  • smtp = smtplib.SMTP ( "localhost : host")에 smtp 서버 이름, 호스트 설명
  • smtp.sendmail (발신 메일 주소, 수신자 메일 주소, 메일 내용)을 기재하고 송신하여 메일을 보낼 수 있습니다.
    def send(from_addr, to_addrs, cc_addrs, msg):
        smtp = smtplib.SMTP("localhost:host")#要変更
        smtp.sendmail(from_addr, to_addrs+cc_addrs, msg.as_string())
        smtp.close()
    

    2. 받는 사람,Cc에 여러 사람 설정


  • smtp.sendmail(from_addr, to_addrs+cc_addrs, msg.as_string())의 to_addrs+cc_addrs에 문자열로 "아 bc @ 아코응 t. 이 m , 에서 f@ 아코응 t. 이 m , g 히 @ 아코응 t. 이 m 구분 기호로 나열된 문자열)
  • 목적지를 잘못 기재하면 선두에만 보내지는 경우가 있으므로주의가 필요

  • 3. zip 파일 첨부


  • 대상 폴더에있는 파일을 zip 형식으로 씁니다.
  • MIME 유형을 설정하고 첨부 파일로 설정
  • 미리 zip 파일을 작성해, MIME 타입을 zip에 설정해 송신을 실시했지만, 송신은 할 수 있었지만, 파일이 망가져 버리는 일이 있다
  •   zf = tempfile.TemporaryFile(prefix='mail', suffix='.zip')
        zip = zipfile.ZipFile(zf, 'w')
        files = os.listdir(attach_file['path'])
        for i in files:
            filename =""
            filename=i
            zip.write(attach_file['path']+"/"+(filename.decode("cp932")).encode("cp932"))
        zip.close()
        zf.seek(0)
    
    

    4. 첨부 파일 이름에 일본어 사용


  • python2.7의 zipfile.write(파일 경로) 함수는 UTF-8 변환되어 버리므로, 그대로 일본어 파일명을 사용하면 파일을 특정할 수 없다.
  • 라이브러리를 수정하고 새 라이브러리로 만들고 가져 와서 해당
  • C:\Python27\Lib 안의 zipfile.py를 복사해, 새로운 이름의 파일로서 작성해,utf-8을 cp932(Windows의 일본어 문자 코드)에 변경해 보존한다.
  • import zipfileJPN as zipfile
    

    좋은 웹페이지 즐겨찾기