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()
Xong!