ฉันมีปัญหาในการทำความเข้าใจวิธีส่งอีเมลไฟล์แนบโดยใช้ Python smtplib
ผมได้ส่งอีเมลข้อความที่เรียบง่ายกับประสบความสำเร็จ มีคนได้โปรดอธิบายวิธีการส่งไฟล์แนบในอีเมล ฉันรู้ว่ามีโพสต์อื่น ๆ ออนไลน์ แต่ในฐานะผู้เริ่มต้น Python ฉันพบว่ามันยากที่จะเข้าใจ
ฉันมีปัญหาในการทำความเข้าใจวิธีส่งอีเมลไฟล์แนบโดยใช้ Python smtplib
ผมได้ส่งอีเมลข้อความที่เรียบง่ายกับประสบความสำเร็จ มีคนได้โปรดอธิบายวิธีการส่งไฟล์แนบในอีเมล ฉันรู้ว่ามีโพสต์อื่น ๆ ออนไลน์ แต่ในฐานะผู้เริ่มต้น Python ฉันพบว่ามันยากที่จะเข้าใจ
คำตอบ:
นี่คืออีก:
import smtplib
from os.path import basename
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
def send_mail(send_from, send_to, subject, text, files=None,
server="127.0.0.1"):
assert isinstance(send_to, list)
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(MIMEText(text))
for f in files or []:
with open(f, "rb") as fil:
part = MIMEApplication(
fil.read(),
Name=basename(f)
)
# After the file is closed
part['Content-Disposition'] = 'attachment; filename="%s"' % basename(f)
msg.attach(part)
smtp = smtplib.SMTP(server)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
มันเหมือนกับตัวอย่างแรกมาก ... แต่มันควรจะง่ายกว่าที่จะปล่อย
file
f
part = MIMEApplication(open(f, 'rb').read())
นี่คือเวอร์ชั่นที่แก้ไขจากOli
สำหรับ python 3
import smtplib
from pathlib import Path
from email.mime.multipart import MIMEMultipart
from email.mime.base import MIMEBase
from email.mime.text import MIMEText
from email.utils import COMMASPACE, formatdate
from email import encoders
def send_mail(send_from, send_to, subject, message, files=[],
server="localhost", port=587, username='', password='',
use_tls=True):
"""Compose and send email with provided info and attachments.
Args:
send_from (str): from name
send_to (list[str]): to name(s)
subject (str): message title
message (str): message body
files (list[str]): list of file paths to be attached to email
server (str): mail server host name
port (int): port number
username (str): server auth username
password (str): server auth password
use_tls (bool): use TLS mode
"""
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = COMMASPACE.join(send_to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach(MIMEText(message))
for path in files:
part = MIMEBase('application', "octet-stream")
with open(path, 'rb') as file:
part.set_payload(file.read())
encoders.encode_base64(part)
part.add_header('Content-Disposition',
'attachment; filename="{}"'.format(Path(path).name))
msg.attach(part)
smtp = smtplib.SMTP(server, port)
if use_tls:
smtp.starttls()
smtp.login(username, password)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.quit()
import pathlib
ด้วยfrom pathlib import Path
นี่คือรหัสที่ฉันใช้:
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email import Encoders
SUBJECT = "Email Data"
msg = MIMEMultipart()
msg['Subject'] = SUBJECT
msg['From'] = self.EMAIL_FROM
msg['To'] = ', '.join(self.EMAIL_TO)
part = MIMEBase('application', "octet-stream")
part.set_payload(open("text.txt", "rb").read())
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="text.txt"')
msg.attach(part)
server = smtplib.SMTP(self.EMAIL_SERVER)
server.sendmail(self.EMAIL_FROM, self.EMAIL_TO, msg.as_string())
รหัสนั้นเหมือนกันกับโพสต์ของ Oli ขอบคุณทุกคน
รหัสจากโพสต์ปัญหาไฟล์แนบอีเมลไบนารี
from email.mime.base import MIMEBase
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
import smtplib
msg = MIMEMultipart()
msg.attach(MIMEText(file("text.txt").read()))
msg.attach(MIMEImage(file("image.png").read()))
# to send
mailer = smtplib.SMTP()
mailer.connect()
mailer.sendmail(from_, to, msg.as_string())
mailer.close()
smtplib
สนับสนุน ในการส่งไฟล์แนบคุณเข้ารหัสเป็นข้อความ MIME และส่งในอีเมลธรรมดา มีโมดูลอีเมลหลามใหม่ แต่: docs.python.org/library/email.mime.html
msg.as_string()
แล้วและดูเหมือนว่าร่างกายของอีเมลแบบหลายส่วน MIME Wikipedia อธิบาย MIME: en.wikipedia.org/wiki/MIME
Line 6, in <module> msg.attach(MIMEText(file("text.txt").read())) NameError: name 'file' is not defined
อีกวิธีหนึ่งด้วย python 3 (หากมีใครค้นหา):
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.base import MIMEBase
from email import encoders
fromaddr = "sender mail address"
toaddr = "receiver mail address"
msg = MIMEMultipart()
msg['From'] = fromaddr
msg['To'] = toaddr
msg['Subject'] = "SUBJECT OF THE EMAIL"
body = "TEXT YOU WANT TO SEND"
msg.attach(MIMEText(body, 'plain'))
filename = "fileName"
attachment = open("path of file", "rb")
part = MIMEBase('application', 'octet-stream')
part.set_payload((attachment).read())
encoders.encode_base64(part)
part.add_header('Content-Disposition', "attachment; filename= %s" % filename)
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
server.login(fromaddr, "sender mail password")
text = msg.as_string()
server.sendmail(fromaddr, toaddr, text)
server.quit()
ตรวจสอบให้แน่ใจว่าได้อนุญาต“ แอปที่ปลอดภัยน้อยลง ” ในบัญชี Gmail ของคุณ
รุ่น Gmail ทำงานกับ Python 3.6 (โปรดทราบว่าคุณจะต้องเปลี่ยนการตั้งค่า Gmail เพื่อให้สามารถส่งอีเมลผ่าน smtp ได้:
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
from os.path import basename
def send_mail(send_from: str, subject: str, text: str,
send_to: list, files= None):
send_to= default_address if not send_to else send_to
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = ', '.join(send_to)
msg['Subject'] = subject
msg.attach(MIMEText(text))
for f in files or []:
with open(f, "rb") as fil:
ext = f.split('.')[-1:]
attachedfile = MIMEApplication(fil.read(), _subtype = ext)
attachedfile.add_header(
'content-disposition', 'attachment', filename=basename(f) )
msg.attach(attachedfile)
smtp = smtplib.SMTP(host="smtp.gmail.com", port= 587)
smtp.starttls()
smtp.login(username,password)
smtp.sendmail(send_from, send_to, msg.as_string())
smtp.close()
การใช้งาน:
username = 'my-address@gmail.com'
password = 'top-secret'
default_address = ['my-address2@gmail.com']
send_mail(send_from= username,
subject="test",
text="text",
send_to= None,
files= # pass a list with the full filepaths here...
)
หากต้องการใช้กับผู้ให้บริการอีเมลรายอื่นเพียงแค่เปลี่ยนการกำหนดค่า smtp
รหัสที่ง่ายที่สุดที่ฉันสามารถทำได้คือ:
#for attachment email
from django.core.mail import EmailMessage
def attachment_email(request):
email = EmailMessage(
'Hello', #subject
'Body goes here', #body
'MyEmail@MyEmail.com', #from
['SendTo@SendTo.com'], #to
['bcc@example.com'], #bcc
reply_to=['other@example.com'],
headers={'Message-ID': 'foo'},
)
email.attach_file('/my/path/file')
email.send()
มันขึ้นอยู่กับเอกสาร Djangoอย่างเป็นทางการ
คำตอบอื่น ๆ นั้นยอดเยี่ยม แต่ฉันยังต้องการแบ่งปันวิธีการที่แตกต่างกันในกรณีที่มีใครบางคนกำลังมองหาทางเลือกอื่น
ข้อแตกต่างที่สำคัญคือการใช้วิธีนี้คุณสามารถใช้ HTML / CSS เพื่อจัดรูปแบบข้อความของคุณเพื่อให้คุณสามารถสร้างสรรค์และกำหนดสไตล์ให้กับอีเมลของคุณ แม้ว่าคุณจะไม่ได้บังคับให้ใช้ HTML แต่คุณยังสามารถใช้ข้อความธรรมดาได้เท่านั้น
ขอให้สังเกตว่าฟังก์ชั่นนี้ยอมรับการส่งอีเมลไปยังผู้รับหลายคนและยังอนุญาตให้แนบหลายไฟล์
ฉันเพิ่งลองทำสิ่งนี้กับ Python 2 แต่ฉันคิดว่ามันน่าจะใช้ได้ดีในวันที่ 3 ด้วย:
import os.path
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.application import MIMEApplication
def send_email(subject, message, from_email, to_email=[], attachment=[]):
"""
:param subject: email subject
:param message: Body content of the email (string), can be HTML/CSS or plain text
:param from_email: Email address from where the email is sent
:param to_email: List of email recipients, example: ["a@a.com", "b@b.com"]
:param attachment: List of attachments, exmaple: ["file1.txt", "file2.txt"]
"""
msg = MIMEMultipart()
msg['Subject'] = subject
msg['From'] = from_email
msg['To'] = ", ".join(to_email)
msg.attach(MIMEText(message, 'html'))
for f in attachment:
with open(f, 'rb') as a_file:
basename = os.path.basename(f)
part = MIMEApplication(a_file.read(), Name=basename)
part['Content-Disposition'] = 'attachment; filename="%s"' % basename
msg.attach(part)
email = smtplib.SMTP('your-smtp-host-name.com')
email.sendmail(from_email, to_email, msg.as_string())
ฉันหวังว่านี่จะช่วยได้! :-)
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
import smtplib
import mimetypes
import email.mime.application
smtp_ssl_host = 'smtp.gmail.com' # smtp.mail.yahoo.com
smtp_ssl_port = 465
s = smtplib.SMTP_SSL(smtp_ssl_host, smtp_ssl_port)
s.login(email_user, email_pass)
msg = MIMEMultipart()
msg['Subject'] = 'I have a picture'
msg['From'] = email_user
msg['To'] = email_user
txt = MIMEText('I just bought a new camera.')
msg.attach(txt)
filename = 'introduction-to-algorithms-3rd-edition-sep-2010.pdf' #path to file
fo=open(filename,'rb')
attach = email.mime.application.MIMEApplication(fo.read(),_subtype="pdf")
fo.close()
attach.add_header('Content-Disposition','attachment',filename=filename)
msg.attach(attach)
s.send_message(msg)
s.quit()
สำหรับคำอธิบายคุณสามารถใช้ลิงก์นี้เพื่ออธิบายอย่างถูกต้อง https://medium.com/@sdoshi579/to-send-an-email-along-with-attachment-using-smtp-7852e77623
from email.mime.multipart import MIMEMultipart
from email.mime.image import MIMEImage
from email.mime.text import MIMEText
import smtplib
msg = MIMEMultipart()
password = "password"
msg['From'] = "from_address"
msg['To'] = "to_address"
msg['Subject'] = "Attached Photo"
msg.attach(MIMEImage(file("abc.jpg").read()))
file = "file path"
fp = open(file, 'rb')
img = MIMEImage(fp.read())
fp.close()
msg.attach(img)
server = smtplib.SMTP('smtp.gmail.com: 587')
server.starttls()
server.login(msg['From'], password)
server.sendmail(msg['From'], msg['To'], msg.as_string())
server.quit()
ด้านล่างเป็นการรวมกันของสิ่งที่ฉันพบจากโพสต์ของ SoccerPlayer ที่นี่และลิงก์ต่อไปนี้ที่ทำให้ฉันแนบไฟล์ xlsx ได้ง่ายขึ้น พบได้ที่นี่
file = 'File.xlsx'
username=''
password=''
send_from = ''
send_to = 'recipient1 , recipient2'
Cc = 'recipient'
msg = MIMEMultipart()
msg['From'] = send_from
msg['To'] = send_to
msg['Cc'] = Cc
msg['Date'] = formatdate(localtime = True)
msg['Subject'] = ''
server = smtplib.SMTP('smtp.gmail.com')
port = '587'
fp = open(file, 'rb')
part = MIMEBase('application','vnd.ms-excel')
part.set_payload(fp.read())
fp.close()
encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment', filename='Name File Here')
msg.attach(part)
smtp = smtplib.SMTP('smtp.gmail.com')
smtp.ehlo()
smtp.starttls()
smtp.login(username,password)
smtp.sendmail(send_from, send_to.split(',') + msg['Cc'].split(','), msg.as_string())
smtp.quit()
ด้วยรหัสของฉันคุณสามารถส่งไฟล์แนบอีเมลโดยใช้ gmail คุณจะต้อง:
ตั้งค่าที่อยู่ Gmail ของคุณที่ " อีเมล SMTP ของคุณที่นี่ "
ตั้งรหัสผ่านบัญชี gmail ของคุณที่ " รหัสผ่าน SMTP ของคุณที่นี่" "
ในส่วน___EMAIL เพื่อรับ MESSAGE_คุณจะต้องตั้งค่าที่อยู่อีเมลปลายทาง
การแจ้งเตือนเป็นเรื่อง
มีคนเข้ามาในห้องภาพที่แนบมาคือร่างกาย
["/home/pi/webcam.jpg"]เป็นไฟล์แนบรูปภาพ
#!/usr/bin/env python
import smtplib
from email.MIMEMultipart import MIMEMultipart
from email.MIMEBase import MIMEBase
from email.MIMEText import MIMEText
from email.Utils import COMMASPACE, formatdate
from email import Encoders
import os
USERNAME = "___YOUR SMTP EMAIL HERE___"
PASSWORD = "__YOUR SMTP PASSWORD HERE___"
def sendMail(to, subject, text, files=[]):
assert type(to)==list
assert type(files)==list
msg = MIMEMultipart()
msg['From'] = USERNAME
msg['To'] = COMMASPACE.join(to)
msg['Date'] = formatdate(localtime=True)
msg['Subject'] = subject
msg.attach( MIMEText(text) )
for file in files:
part = MIMEBase('application', "octet-stream")
part.set_payload( open(file,"rb").read() )
Encoders.encode_base64(part)
part.add_header('Content-Disposition', 'attachment; filename="%s"'
% os.path.basename(file))
msg.attach(part)
server = smtplib.SMTP('smtp.gmail.com:587')
server.ehlo_or_helo_if_needed()
server.starttls()
server.ehlo_or_helo_if_needed()
server.login(USERNAME,PASSWORD)
server.sendmail(USERNAME, to, msg.as_string())
server.quit()
sendMail( ["___EMAIL TO RECEIVE THE MESSAGE__"],
"Alarm notification",
"Someone has entered the room, picture attached",
["/home/pi/webcam.jpg"] )
นอกจากนี้คุณยังสามารถระบุประเภทของไฟล์แนบที่คุณต้องการในอีเมลของคุณเป็นตัวอย่างที่ฉันใช้ pdf:
def send_email_pdf_figs(path_to_pdf, subject, message, destination, password_path=None):
## credits: http://linuxcursor.com/python-programming/06-how-to-send-pdf-ppt-attachment-with-html-body-in-python-script
from socket import gethostname
#import email
from email.mime.application import MIMEApplication
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
import smtplib
import json
server = smtplib.SMTP('smtp.gmail.com', 587)
server.starttls()
with open(password_path) as f:
config = json.load(f)
server.login('me@gmail.com', config['password'])
# Craft message (obj)
msg = MIMEMultipart()
message = f'{message}\nSend from Hostname: {gethostname()}'
msg['Subject'] = subject
msg['From'] = 'me@gmail.com'
msg['To'] = destination
# Insert the text to the msg going by e-mail
msg.attach(MIMEText(message, "plain"))
# Attach the pdf to the msg going by e-mail
with open(path_to_pdf, "rb") as f:
#attach = email.mime.application.MIMEApplication(f.read(),_subtype="pdf")
attach = MIMEApplication(f.read(),_subtype="pdf")
attach.add_header('Content-Disposition','attachment',filename=str(path_to_pdf))
msg.attach(attach)
# send msg
server.send_message(msg)
แรงบันดาลใจ / สินเชื่อ: http://linuxcursor.com/python-programming/06-how-to-send-pdf-ppt-attachment-with-html-body-in-python-script