공부한 내용 정리하는 공간입니다.
틀린 내용이 있을 수 있습니다.
모든 지적, 첨언 환영합니다.
오늘의 코드
1. 사용자가 입력한 정보로 docx 파일 수정
2. docx 파일을 pdf 파일로 변환
3. pdf 파일 이메일로 전송
from flask import Flask, render_template, request, send_file
from docx import Document
from docx2pdf import convert
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from dotenv import load_dotenv
import os
app = Flask(__name__)
def mail_sender(user_mail, file_path):
load_dotenv()
send_email = os.getenv("SECRET_ID")
send_pwd = os.getenv("SECRET_PASS")
recv_email = user_mail
smtp_name = "smtp.naver.com"
smtp_port = 587
text = "수료증입니다"
msg = MIMEMultipart()
msg['Subject'] = "수료증 발급"
msg['From'] = send_email
msg['To'] = recv_email
contentPart = MIMEText(text)
msg.attach(contentPart)
etc_file_path = file_path
with open(etc_file_path, 'rb') as f :
etc_part = MIMEApplication( f.read() )
etc_part.add_header('Content-Disposition','attachment', filename=etc_file_path)
msg.attach(etc_part)
email_string = msg.as_string()
s = smtplib.SMTP(smtp_name, smtp_port)
s.starttls()
s.login(send_email, send_pwd)
s.sendmail(send_email, recv_email, email_string)
s.quit()
@app.route("/")
def index():
return render_template('index.html')
@app.route("/upload", methods=['GET', 'POST'])
def upload():
name = request.form['name']
course = request.form['course']
date = request.form['date']
user_mail = request.form['user_mail']
doc = Document('template.docx')
for paragraph in doc.paragraphs:
if 'NAME' in paragraph.text:
paragraph.text = paragraph.text.replace('NAME', name)
elif 'COURSE' in paragraph.text:
paragraph.text = paragraph.text.replace('COURSE', course)
elif 'DATE' in paragraph.text:
paragraph.text = paragraph.text.replace('DATE', date)
doc.save(f"{name}_certificate.docx")
convert(f"{name}_certificate.docx", f"{name}_certificate.pdf")
mail_sender(user_mail, f"{name}_certificate.pdf")
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>수료증 발급</title>
</head>
<body>
<h1>수료증 발급을 위한 정보 입력</h1>
<form method="post" action="{{url_for('upload')}}">
<b>이름 </b><input type="text" name="name"></br>
<b>과정 </b><input type="text" name="course"></br>
<b>날짜 </b><input type="date" name="date"></br>
<b>이메일 </b><input type="text" name="user_mail"></br>
<input type="submit" value="발급">
</form>
</body>
</html>
Document()
word 문서 파일을 열거나 새로 생성할 때 사용
python-docx 라이브러리의 클래스
.paragraph
word 문서의 모든 단락(paragraph)을 리스트 형태로 가져오는 속성
word 문서에서 줄 바꿈이나 Enter를 통해 나뉘는 각 부분이 하나의 단락으로 인식
객체로 저장한 뒤 단락 속성 사용 가능
>paragraph=doc.paragraphs일 때
>paragraph.text=단락의 텍스트
>paragraph.style=단락의 스타일
.replace(A, B)
문자열에서 A를 B로 바꿔주는 메서드
새로운 문자열을 반환하며, 원본 문자열은 바뀌지 않음
convert("A.docx", "b.pdf")
word 문서 파일 A를 PDF 파일 b로 변환
패키지 추가 설치 이후 사용할 수 있음
오늘의 코드
1. 사용자가 입력한 정보로 docx 파일 수정
2. docx 파일을 pdf 파일로 변환
3. pdf 파일 이메일로 전송
from flask import Flask, render_template, request, send_file
from docx import Document
from docx2pdf import convert
import smtplib
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from dotenv import load_dotenv
import os
app = Flask(__name__)
def mail_sender(user_mail, file_path):
load_dotenv()
send_email = os.getenv("SECRET_ID")
send_pwd = os.getenv("SECRET_PASS")
recv_email = user_mail
smtp_name = "smtp.naver.com"
smtp_port = 587
text = "수료증입니다"
msg = MIMEMultipart()
msg['Subject'] = "수료증 발급"
msg['From'] = send_email
msg['To'] = recv_email
contentPart = MIMEText(text)
msg.attach(contentPart)
etc_file_path = file_path
with open(etc_file_path, 'rb') as f :
etc_part = MIMEApplication( f.read() )
etc_part.add_header('Content-Disposition','attachment', filename=etc_file_path)
msg.attach(etc_part)
email_string = msg.as_string()
s = smtplib.SMTP(smtp_name, smtp_port)
s.starttls()
s.login(send_email, send_pwd)
s.sendmail(send_email, recv_email, email_string)
s.quit()
@app.route("/")
def index():
return render_template('index.html')
@app.route("/upload", methods=['GET', 'POST'])
def upload():
name = request.form['name']
course = request.form['course']
date = request.form['date']
user_mail = request.form['user_mail']
doc = Document('template.docx')
for paragraph in doc.paragraphs:
if 'NAME' in paragraph.text:
paragraph.text = paragraph.text.replace('NAME', name)
elif 'COURSE' in paragraph.text:
paragraph.text = paragraph.text.replace('COURSE', course)
elif 'DATE' in paragraph.text:
paragraph.text = paragraph.text.replace('DATE', date)
doc.save(f"{name}_certificate.docx")
convert(f"{name}_certificate.docx", f"{name}_certificate.pdf")
mail_sender(user_mail, f"{name}_certificate.pdf")
return render_template('index.html')
if __name__ == '__main__':
app.run(debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>수료증 발급</title>
</head>
<body>
<h1>수료증 발급을 위한 정보 입력</h1>
<form method="post" action="{{url_for('upload')}}">
<b>이름 </b><input type="text" name="name"></br>
<b>과정 </b><input type="text" name="course"></br>
<b>날짜 </b><input type="date" name="date"></br>
<b>이메일 </b><input type="text" name="user_mail"></br>
<input type="submit" value="발급">
</form>
</body>
</html>
오늘의 코드 설명
doc = Document('template.docx')
template.docx라는 이름의 word 파일을 열고 doc에 저장
1. 사용자가 입력한 정보로 docx 파일 수정
for paragraph in doc.paragraphs:
객체 paragraph는 문서의 모든 단락을 순회
if 'NAME' in paragraph.text:
paragraph.text = paragraph.text.replace('NAME', name)
단락에 NAME이라는 문자열이 포함되어 있으면
NAME이라는 문자열을 변수 name의 값으로 대체함
doc.save(f"{name}_certificate.docx")
word 파일을 저장
2. docx 파일을 pdf 파일로 변환
convert(f"{name}_certificate.docx", f"{name}_certificate.pdf")
word 문서 파일을 PDF로 변환
3. pdf 파일 이메일로 전송
mail_sender(user_mail, f"{name}_certificate.pdf")
user_mail로 pdf 파일을 첨부해서 메일 전송