Hướng dẫn send email with attachment python - gửi email có tệp đính kèm python

Có một chút khó khăn trong việc lấy kịch bản của tôi để gửi các tệp đính kèm chung nhưng sau một chút công việc thực hiện nghiên cứu và lướt qua các bài viết trên bài đăng này, cuối cùng tôi đã đưa ra những điều sau đây

# to query: import sys import ast from datetime import datetime import smtplib import mimetypes from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email import encoders from email.message import Message from email.mime.audio import MIMEAudio from email.mime.base import MIMEBase from email.mime.image import MIMEImage from email.mime.text import MIMEText from dotenv import load_dotenv, dotenv_values load_dotenv() # load environment variables from .env ''' sample .env file # .env file SECRET_KEY="gnhfpsjxxxxxxxx" DOMAIN="GMAIL" TOP_LEVEL_DOMAIN="COM" EMAIL="CHESERExxxxxx@${DOMAIN}.${TOP_LEVEL_DOMAIN}" TO_ADDRESS = ("","")#didn't use this in the code but you can load recipients from here ''' import smtplib tls_port = 587 ssl_port = 465 smtp_server_domain_names = {'GMAIL': ('smtp.gmail.com', tls_port, ssl_port), 'OUTLOOK': ('smtp-mail.outlook.com', tls_port, ssl_port), 'YAHOO': ('smtp.mail.yahoo.com', tls_port, ssl_port), 'AT&T': ('smtp.mail.att.net', tls_port, ssl_port), } # todo: Ability to choose mail server provider # auto read in from the dictionary the respective mail server address and the tls and ssl ports class Bimail: def __init__(self, subject, recipients): self.subject = subject self.recipients = recipients self.htmlbody = '' self.mail_username = 'will be loaded from .env file' self.mail_password = 'loaded from .env file as well' self.attachments = [] # Creating an smtp object # todo: if gmail passed in use gmail's dictionary values def setup_mail_client(self, domain_key_to_use="GMAIL", email_servers_domains_dict=smtp_server_domain_names): """ :param report_pdf: :type to_address: str """ smtpObj = None encryption_status = True config = dotenv_values(".env") # check if the domain_key exists from within the available email-servers-domains dict file passed in # else throw an error # read environment file to get the Domain to be used if f"{domain_key_to_use}" in email_servers_domains_dict.keys(): # if the key is found do the following # 1.extract the domain,tls,ssl ports from email_servers dict for use in program try: values_tuple = email_servers_domains_dict.get(f"{domain_key_to_use}") ssl_port = values_tuple[2] tls_port = values_tuple[1] smtp_server = values_tuple[0] smtpObj = smtplib.SMTP(smtp_server, tls_port) print(f"Success connect with tls on {tls_port}") print('Awaiting for connection encryption via startttls()') encryption_status = False except: print(f"Failed connection via tls on port {tls_port}") try: smtpObj = smtplib.SMTP_SSL(smtp_server, ssl_port) print(f"Success connect with ssl on {ssl_port}") encryption_status = True except: print(f"Failed connection via ssl on port {ssl_port}") finally: print("Within Finally block") if not smtpObj: print("Failed!!! no Internet connection") else: # if connection channel is unencrypted via the use of tls encrypt it if not encryption_status: status = smtpObj.starttls() if status[0] == 220: print("Successfully Encrypted tls channel") print("Successfully Connected!!!! Requesting Login") # Loading .env file values to config variable #load Login Creds from ENV File self.mail_username = f'{config.get("EMAIL")}' self.mail_password = f'{cofig.get("SECRET_KEY")}' status = smtpObj.login(self.mail_usernam,self.mail_password) if status[0] == 235: print("Successfully Authenticated User to xxx account") success = self.send(smtpObj, f'{config.get("EMAIL")}') if not bool(success): print(f"Success in Sending Mail to {success}") print("Disconnecting from Server INstance") quit_result = smtpObj.quit() else: print(f"Failed to Post {success}!!!") print(f"Quiting anyway !!!") quit_result = smtpObj.quit() else: print("Application Specific Password is Required") else: print("World") def send(self,smtpObj,from_address): msg = MIMEMultipart('alternative') msg['From'] = from_address msg['Subject'] = self.subject msg['To'] = ", ".join(self.recipients) # to must be array of the form [''] msg.preamble = "preamble goes here" # check if there are attachments if yes, add them if self.attachments: self.attach(msg) # add html body after attachments msg.attach(MIMEText(self.htmlbody, 'html')) # send print(f"Attempting Email send to the following addresses {self.recipients}") result = smtpObj.sendmail(from_address, self.recipients,msg.as_string()) return result def htmladd(self, html): self.htmlbody = self.htmlbody + '<p></p>' + html def attach(self, msg): for f in self.attachments: ctype, encoding = mimetypes.guess_type(f) if ctype is None or encoding is not None: ctype = "application/octet-stream" maintype, subtype = ctype.split("/", 1) if maintype == "text": fp = open(f) # Note: we should handle calculating the charset attachment = MIMEText(fp.read(), _subtype=subtype) fp.close() elif maintype == "image": fp = open(f, "rb") attachment = MIMEImage(fp.read(), _subtype=subtype) fp.close() elif maintype == "ppt": fp = open(f, "rb") attachment = MIMEApplication(fp.read(), _subtype=subtype) fp.close() elif maintype == "audio": fp = open(f, "rb") attachment = MIMEAudio(fp.read(), _subtype=subtype) fp.close() else: fp = open(f, "rb") attachment = MIMEBase(maintype, subtype) attachment.set_payload(fp.read()) fp.close() encoders.encode_base64(attachment) attachment.add_header("Content-Disposition", "attachment", filename=f) attachment.add_header('Content-ID', '<{}>'.format(f)) msg.attach(attachment) def addattach(self, files): self.attachments = self.attachments + files # example below if __name__ == '__main__': # subject and recipients mymail = Bimail('Sales email ' + datetime.now().strftime('%Y/%m/%d'), ['', '']) # start html body. Here we add a greeting. mymail.htmladd('Good morning, find the daily summary below.') # Further things added to body are separated by a paragraph, so you do not need to worry about newlines for new sentences # here we add a line of text and an html table previously stored in the variable mymail.htmladd('Daily sales') mymail.addattach(['htmlsalestable.xlsx']) # another table name + table mymail.htmladd('Daily bestsellers') mymail.addattach(['htmlbestsellertable.xlsx']) # add image chart title mymail.htmladd('Weekly sales chart') # attach image chart mymail.addattach(['saleschartweekly.png']) # refer to image chart in html mymail.htmladd('<img src="cid:saleschartweekly.png"/>') # attach another file mymail.addattach(['MailSend.py']) # send! mymail.setup_mail_client( domain_key_to_use="GMAIL",email_servers_domains_dict=smtp_server_domain_names)

Python có thể gửi email với tệp đính kèm không?

Sử dụng thư viện SMTPLIB tích hợp của Python để gửi email cơ bản.Gửi email với nội dung HTML và tệp đính kèm bằng gói email.Gửi nhiều email được cá nhân hóa bằng tệp CSV với dữ liệu liên hệ.Send emails with HTML content and attachments using the email package. Send multiple personalized emails using a CSV file with contact data.

Làm cách nào để tự động hóa email với các tệp đính kèm trong Python?

Mục lục..
Bật xác minh 2 bước ..
Gửi email với Python.- Nhập thư viện và đặt người gửi và người nhận email.- Đặt chủ đề và cơ thể của email.- Thêm SSL.- Đăng nhập và gửi email ..
Lên lịch cho kịch bản Python để chạy hàng tháng, hàng tuần hoặc hàng ngày ..

Làm thế nào để bạn gửi nội dung HTML trong email bằng Python?

Gửi nội dung HTML với email ...
Nhập các mô -đun.....
Xác định tài liệu HTML.....
Thiết lập địa chỉ email và mật khẩu.....
Tạo một lớp Mimemultipart, và thiết lập các trường từ, đến, chủ đề.....
Gắn tài liệu HTML được xác định trước đó, dưới dạng loại nội dung HTML mimetext vào thông báo MIME.....
Chuyển đổi email_message dưới dạng chuỗi ..

Chủ đề