/*auto readmore*/ /*auto readmore*/ /* an hien script*/ // an hien password /*an hien ma chuong trinh cong tru */ /*Scrollbox thanh cuon*/ /***Nhung CODE***/ /* dòng xanh dòng trắng */ /* https://cdnjs.com/libraries/prism lay thu vien, can vao ten file ma goi 1. copy link vao vi du:prism-python.min.js 2. ten ngon nua la python */ /*=== New posts ===*/ /*header slider*/ /*=== bai viet lien quan===*/ /*===tabcode===*/

Network Automation #012 - SMTP Sending Emails With Attachment in Python - Gửi Mail Đính Kèm File Bằng Python

YÊU CẦU:

1. Sử dụng thư viện email smtplib của python để kết nối đến gmail để gửi mail đính kèm attach file

2. Gửi mail hàng loạt, đính kèm attach file với thông tin được lưu trữ trong file email_list.csv

3. Sử dụng profile hiện của MS Outlook để gửi mail.


THỰC HIỆN

1. Sử dụng thư viện email smtplib của python để kết nối đến gmail để gửi mail đính kèm attach file

Code:

'''
Kết nối đến Gmail để gửi mail và đính kèm attach file

Điều kiện:
1. Tắt bảo mật 2 lớp
https://myaccount.google.com/security?utm_source=OGB&utm_medium=act#signin

2. Allow less secure apps: ON
https://myaccount.google.com/u/1/lesssecureapps?pli=1&pageId=none

nếu không chúng ta sẽ gặp lỗi
#smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/?p=BadCredentials qe12sm2115875pjb.29 - gsmtp')

Link tham khảo
https://realpython.com/python-send-email/
'''
import email, smtplib, ssl
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

def send_mail_att(mail_from, mail_password, mail_to, mail_subject, mail_body, att_file): # Hàm gửi mail
	port = 465  # For SSL
	smtp_server = "smtp.gmail.com"
	# Create a multipart message and set headers
	message = MIMEMultipart()
	message["From"] = mail_from
	message["To"] = mail_to
	message["Subject"] = mail_subject
	#message["Bcc"] = "khanhvc2003@yahoo.com"

	# Add body to email
	message.attach(MIMEText(mail_body, "plain"))

	# Open file in binary mode
	with open(att_file, "rb") as attachment:
	    # Add file as application/octet-stream
	    # Email client can usually download this automatically as attachment
	    part = MIMEBase("application", "octet-stream")
	    part.set_payload(attachment.read())

	# Encode file in ASCII characters to send by email    
	encoders.encode_base64(part)

	# Add header as key/value pair to attachment part
	part.add_header("Content-Disposition", f"attachment; filename = {att_file}")

	# Add attachment to message and convert message to string
	message.attach(part)
	text = message.as_string()

	# Log in to server using secure context and send email
	context = ssl.create_default_context()
	try:
		with smtplib.SMTP_SSL(smtp_server, port, context = context) as server:
		    server.login(mail_from, mail_password)
		    server.sendmail(mail_from, mail_to, text)
		    print (f"Successfuly sent to '{mail_to}'")
	except:
		print (f"Communication failure in '{smtp_server}'")

email_info = {
	"mail_from": "khanhvc.wrk@gmail.com",
	"mail_password": "matkhaucuaban" ,
	"mail_to": "khanhvc@hansollvina.com",
	"mail_subject" : "This is for testing 8.19 r duong dan BO PHAY" ,
	"mail_body": "This is for testing email",
	"att_file": r"C:\python\Blog\TextFSM Custom.JPG"
	#pass_mail = input("Type your password and press enter:")
}
send_mail_att(**email_info)


2. Gửi mail hàng loạt, đính kèm attach file với thông tin được lưu trữ trong file email_list.csv

Tạo file email_list.csv có dạng:



Code:
'''
Kết nối đến Gmail để gửi mail và đính kèm attach file, danh sách các địa chỉ email được lưu trong file

Điều kiện:
1. Tắt bảo mật 2 lớp
https://myaccount.google.com/security?utm_source=OGB&utm_medium=act#signin

2. Allow less secure apps: ON
https://myaccount.google.com/u/1/lesssecureapps?pli=1&pageId=none

nếu không chúng ta sẽ gặp lỗi
#smtplib.SMTPAuthenticationError: (535, b'5.7.8 Username and Password not accepted. Learn more at\n5.7.8  https://support.google.com/mail/?p=BadCredentials qe12sm2115875pjb.29 - gsmtp')

Link tham khảo
https://realpython.com/python-send-email/
'''
import email, smtplib, ssl
from email import encoders
from email.mime.base import MIMEBase
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText

import pandas as pd
from datetime import datetime
import os

path = os.getcwd()  # lấy đường dẫn hiện tại
now = datetime.now().strftime("%Y-%b-%d_%H%M%S")

ERR_log = f"Send_Mail_{now}_ERR_logs.log" # định nghĩa tên file lưu trữ thông tin lỗi

def send_mail_att(mail_from, mail_password, mail_to, mail_subject, mail_body, att_file): # Hàm gửi mail
	port = 465  # For SSL
	smtp_server = "smtp.gmail.com"
	# Create a multipart message and set headers
	message = MIMEMultipart()
	message["From"] = mail_from
	message["To"] = mail_to
	message["Subject"] = mail_subject
	#message["Bcc"] = "khanhvc2003@yahoo.com"

	# Add body to email
	message.attach(MIMEText(mail_body, "plain"))

	# Open file in binary mode
	with open(att_file, "rb") as attachment:
	    # Add file as application/octet-stream
	    # Email client can usually download this automatically as attachment
	    part = MIMEBase("application", "octet-stream")
	    part.set_payload(attachment.read())

	# Encode file in ASCII characters to send by email    
	encoders.encode_base64(part)

	# Add header as key/value pair to attachment part
	part.add_header("Content-Disposition", f"attachment; filename = {att_file}")

	# Add attachment to message and convert message to string
	message.attach(part)
	text = message.as_string()

	# Log in to server using secure context and send email
	context = ssl.create_default_context()
	try:
		with smtplib.SMTP_SSL(smtp_server, port, context = context) as server:
		    server.login(mail_from, mail_password)
		    server.sendmail(mail_from, mail_to, text)
		    print (f"Successfuly sent to '{mail_to}'")
	except:
		f = open(ERR_log,"a")
		f.write(f'Undelivered email to: {mail_to}')
		f.write("\n")
		f.close()
		print (f"Communication failure in '{smtp_server}'")
		pass

att_file = r"C:\python\Blog\TextFSM Custom.JPG" # tên file cần đính kèm

email_list = 'email_list.csv' # tên file lưu trữ thông tin thiết bị
column_name = ['mail_from', 'mail_subject', 'mail_to', 'mail_body', 'mail_password'] # chỉ định các cột cần lấy
try:
	email_list = pd.read_csv(email_list, usecols = column_name, encoding = "utf-8") # đọc và xử lý chuyển dữ liệu về dạng DataFrame, và sử dụng code utf-8
	email_list = email_list.to_dict(orient='records') # chuyển đổi về dict tương ứng (ví dụ: nếu file có 10 dòng thì sẽ tạo ra 9 (10 dòng bỏ đi dòng đầu tiên đã làm key) dictionary tương ứng)
	#pprint(email_list)

	for email_info in email_list:
		email_info["att_file"] = att_file # thêm thông tin att_file vào dict
		send_mail_att(**email_info)
	ERR_info = f"*** ERROR: Please check file : '{ERR_log}' at '{path}' ***\n"
	print (ERR_info)
except:
	ERR_info = f"*** ERROR: Please check file : '{email_list}' at '{path}' ***\n"
	print (ERR_info)
	pass


3. Sử dụng profile hiện của MS Outlook để gửi mail.
import win32com.client
def outlook_send_mail(mail_to, mail_subject, mail_body, att_file):
	"""
 	gọi outlook hiện tại để send mail
	"""
	outlook = win32com.client.Dispatch('outlook.application')
	mail = outlook.CreateItem(0)
	mail.To = rf"{mail_to}"
	mail.Subject = rf"{mail_subject}"
	mail.HTMLBody = '

This is HTML Body

' mail.Body = rf"{mail_body}" mail.Attachments.Add(rf"{att_file}") # mail.Attachments.Add('them file nua.abc') # mail.CC = 'somebody@company.com' mail.Send()


Tham khảo bài gửi mail KHÔNG attach file tại đây.


Xong!

No comments:

Post a Comment

/*header slide*/