سؤال

أنا جديد مع بايثون ..في الواقع، أحاول إرسال بريد إلكتروني مميز باستخدام لغة بايثون:نص HTML، والنص البديل، والمرفقات.

لذلك، لقد وجدت هذا درس تعليمي وقمت بتكييفه مع مصادقة Gmail (تم العثور على البرنامج التعليمي هنا)

الكود الموجود عندي في الصراف الآلي هو:

def createhtmlmail (html, text, subject):
"""Create a mime-message that will render HTML in popular
  MUAs, text in better ones"""
import MimeWriter
import mimetools
import cStringIO
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

out = cStringIO.StringIO() # output buffer for our message 
htmlin = cStringIO.StringIO(html)
txtin = cStringIO.StringIO(text)

writer = MimeWriter.MimeWriter(out)
#
# set up some basic headers... we put subject here
# because smtplib.sendmail expects it to be in the
# message body
#
writer.addheader("Subject", subject)
writer.addheader("MIME-Version", "1.0")
#
# start the multipart section of the message
# multipart/alternative seems to work better
# on some MUAs than multipart/mixed
#
writer.startmultipartbody("alternative")
writer.flushheaders()
#
# the plain text section
#
subpart = writer.nextpart()
subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
pout = subpart.startbody("text/plain", [("charset", 'us-ascii')])
mimetools.encode(txtin, pout, 'quoted-printable')
txtin.close()
#
# start the html subpart of the message
#
subpart = writer.nextpart()
subpart.addheader("Content-Transfer-Encoding", "quoted-printable")
#
# returns us a file-ish object we can write to
#
pout = subpart.startbody("text/html", [("charset", 'us-ascii')])
mimetools.encode(htmlin, pout, 'quoted-printable')
htmlin.close()


#
# Now that we're done, close our writer and
# return the message body
#
writer.lastpart()
msg = out.getvalue()
out.close()
return msg

import smtplib
f = open("/path/to/html/version.html", 'r')
html = f.read()
f.close()
f = open("/path/to/txt/version.txt", 'r')
text = f.read()
subject = "Prova email html da python, con allegato!"
message = createhtmlmail(html, text, subject)
gmail_user = "thegmailaccount@gmail.com"
gmail_pwd = "thegmailpassword"
server = smtplib.SMTP("smtp.gmail.com", 587)
server.ehlo()
server.starttls()
server.ehlo()
server.login(gmail_user, gmail_pwd)
server.sendmail(gmail_user, "example@example.com", message)
server.close()

وهذا يعمل ..الآن فقط أفتقد المرفق..ولا أستطيع إضافة المرفق (من هذا بريد)

فلماذا لا توجد فئة بايثون مثل phpMailer لـ php؟هل يرجع ذلك إلى أنه بالنسبة لمبرمج بايثون متوسط ​​القدرة، فإن إرسال بريد إلكتروني بتنسيق html مع مرفق ونص نص بديل أمر سهل للغاية بحيث لا تكون هناك حاجة إلى فصل دراسي؟أم لأنني لم أجده؟

إذا كنت سأتمكن من كتابة فصل دراسي كهذا، عندما أكون جيدًا بما يكفي في لغة بايثون، فهل سيكون ذلك مفيدًا لشخص ما؟

هل كانت مفيدة؟

المحلول

إذا كنت لا يمكن أن تبرر بعض تعزيز الذات الصارخ، كتبت الارسال وحدة أن يجعل إرسال البريد الإلكتروني مع بيثون بسيطة إلى حد ما. لم تبعيات أخرى من smtplib والبريد الإلكتروني المكتبات بيثون.

وهنا مثال بسيط لإرسال البريد الإلكتروني مع المرفقات:

from mailer import Mailer
from mailer import Message

message = Message(From="me@example.com",
                  To=["you@example.com", "him@example.com"])
message.Subject = "Kitty with dynamite"
message.Body = """Kitty go boom!"""
message.attach("kitty.jpg")

sender = Mailer('smtp.example.com')
sender.login("username", "password")
sender.send(message)

تعديل : في وإليك مثال بإرسال بريد إلكتروني HTML مع نص بديل. :)

from mailer import Mailer
from mailer import Message

message = Message(From="me@example.com",
                  To="you@example.com",
                  charset="utf-8")
message.Subject = "An HTML Email"
message.Html = """This email uses <strong>HTML</strong>!"""
message.Body = """This is alternate text."""

sender = Mailer('smtp.example.com')
sender.send(message)

تعديل 2 : في وبفضل واحد من التعليقات، واضاف لقد نسخة جديدة من الإرسال إلى pypi التي تمكنك من تحديد المنفذ في فئة ميلر

نصائح أخرى

وجانغو يشمل الطبقة التي تحتاج إليها في النواة، <وأ href = "http://docs.djangoproject.com/en/dev/topics/email/#sending-alternative-content-types" يختلط = "نوفولو noreferrer" > مستندات هنا

from django.core.mail import EmailMultiAlternatives

subject, from_email, to = 'hello', 'from@example.com', 'to@example.com'
text_content = 'This is an important message.'
html_content = '<p>This is an <strong>important</strong> message.</p>'
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.attach_file('/path/to/file.jpg')
msg.send()

في الإعدادات لدي:

#GMAIL STUFF
EMAIL_USE_TLS = True
EMAIL_HOST = 'smtp.gmail.com'
EMAIL_HOST_USER = 'name@gmail.com'
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PORT = 587

وفقط أريد أن أشير إلى مشروع امسون حيث كان ما كنت أبحث عنه عندما وجدت هذا الموضوع. فعلت بعض مزيد من البحث والعثور عليه. انها:

<اقتباس فقرة>   

والهدف امسون هو وضع حد للجحيم الذي هو "البريد الإلكتروني تطوير التطبيقات". بدلا من البقاء عالقا في 1970s، امسون تتبنى تصميم إطار تطبيق الويب الحديثة ويستخدم لغة البرمجة ثبت (بايثون).

وأنه يدمج بشكل جيد مع جانغو. لكنه أكثر جعل التطبيقات المستندة إلى البريد الإلكتروني. يبدو أن الحب النقي بالرغم من ذلك.

ربما يمكنك أن تجرب مع com.turbmail بيثون-turbomail.org

إنه أكثر سهولة ومفيدة :)

import turbomail

# ...

message = turbomail.Message("from@example.com", "to@example.com", subject)
message.plain = "Hello world!"

turbomail.enqueue(message)

وأوصي بقراءة SMTP RFC . ويظهر البحث جوجل أن هذا يمكن بسهولة أن يتم ذلك باستخدام فئة MimeMultipart الذي تقوم باستيراده لكنها لم تستخدم. هنا بعض الأمثلة في الموقع وثائق بايثون.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top