본문 바로가기

portfolio

Django 템플릿페이지에서 form태그 제출로 이메일보내기(게시글공유)

-정보처리기사 실기공부에서 배운내용 
SMTP - 로컬에서 이메일을 보내기위한 프로토콜, 기본포트번호는 25번
SSL/TLS - 클라이언트와 서버간의 웹데이터를 암호화해주고 무결성을 보장해주는 암호화프로토콜
 
 
 
0. settings.py 설정해준다

EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'ID'
EMAIL_HOST_PASSWORD = 'PASSWORD'
EMAIL_PORT = 587 
EMAIL_USE_TLS = True

 
 
 
1. MVT패턴으로 코딩(모델은 여기서 생략)
 
1-1클라이언트 요청 view에서 form 필드 값을 is_valid()를 통한 유효성검사를 한다.  유효성검사를 통과한 cd 데이터는 f스트링으로 데이터와 문자열을 합쳐서 send_mail()안에 데이터+문자열을 넣어서 메일을 보낸다. 보낸데이터로는 게시글 제목,보낸사람,url링크, 댓글이 있다.

from django.core.mail import send_mail

def post_share(request, post_id):
	# get_object_or_404(id를 조회하고 오류가 나면 404에러처리)
    post = get_object_or_404(Post, id =post_id, status = Post.Status.PUBLISHED)
    sent = False
    if request.method == 'POST':
        form = EmailPostForm(request.POST)
        # 유효성검사
        if form.is_valid():
        	# cd변수는 유효한 데이터 
            cd = form.cleaned_data
            post_url = request.build_absolute_uri(
                post.get_absolute_url()
            )
            subject = f"{cd['name']} 추천한당" \
                      f"{post.title}"
            message = f"Read {post.title} at {post_url}\n\n" \
                      f"{cd['name']}\'s comments: {cd['comments']}"
            send_mail(subject, message, 'your_id',[cd['to']])
            sent = True 
    else:
        form = EmailPostForm()
    return render(request, 'blog/post/share.html', {'post':post,'form':form,'sent': sent})

 
 
 
1-2 사용자에게 보여줄 HTML 템플릿에서 이메일 보내는 페이지를 꾸며보았다. form태그 에서 POST요청을 할 때 CSRF공격을 방지하기 위해 form태크안에  {% csrf_token %}을 넣어주었다.

{% extends "blog/base.html" %}

{% block title %}글 공유{% endblock %}

{% block content %}
  # 만약 성공하면 성공메시지를 출력해서 보여주고 유효성검사 실패하면 필드에 오류메시지가 뜬다.
  {% if sent %}
  <h1>이메일이 성공적으로 보내졌습니다</h1>
  <p>"{{ post.title }}" 게시글이 성공적으로 보내짐 send to{{ form.cleaned_data.to }}</p>
  {% else %}
    <h1>"{{ post.title }}" 게시글 이메일로 공유하기</h1>
    <form method="post">
      {{ form.as_p }}
      {% csrf_token %}
      <input type="submit" value="Send e-mail">
    </form>
  {% endif %}
{% endblock %}

 
 
2.결과화면 
 
2-1 게시글 페이지에 파란색으로 적혀진 게시글공유 링크 클릭

 
 
 
2-2 유효성 검사체크 

 
 
2-3 이메일 전송완료

 
 
 
 
 
참고한 책입니다.
https://www.yes24.com/Product/Goods/125101496

예제로 배우는 Django 4 - 예스24

Django 연습에 최적! 프로젝트 4개로 배우는 Django 4Django를 익히는 제일 좋은 방법은 무엇일까? 이 책에서는 ‘좋은 예제 많이 만들어 보기’를 그 답으로 정했다. 블로그, 소셜 웹사이트, 온라인 상

www.yes24.com