از طریق منوی جستجو مطلب مورد نظر خود در وبلاگ را به سرعت پیدا کنید
روش ارسال ایمیل با boto و SES
سرفصلهای مطلب
معرفی
تقریباً هر برنامه و وبسایت مبتنی بر کاربر نیاز به ارسال ایمیل برای کاربر دارد، بنابراین در نهایت باید با دنیای شادیآور ایمیلهای برنامهای دست و پنجه نرم کنید. تعداد زیادی سرویس برای کمک به شما در این زمینه وجود دارد، اما با توجه به اینکه هر اپلیکیشنی نیازمندی های منحصر به فرد خود را دارد، تعداد کمی از این سرویس ها به اندازه کافی کار را انجام می دهند.
بنابراین که چند بار با این مشکل مواجه شدم (و به چند زبان)، تصمیم گرفتم این پست کوتاه را بنویسم روی روش ارسال ایمیل با بوتو و SES. کتابخانه boto یک پوشش بسیار خوب برای پایتون است که به شما کمک می کند با API AWS تعامل داشته باشید. برای دیدن برخی دیگر از قابلیت های آن، مقاله بوتوی دیگر من را بررسی کنید روی روش آپلود فایل در s3
برپایی
قبل از اینکه بتوانید واقعاً کاری انجام دهید، به یک حساب AWS (بدیهی است) به همراه کلید دسترسی و کلید مخفی حساب خود نیاز دارید که برای احراز هویت با سرورهای SES استفاده می شود. وجود دارد چند راه مختلف شما می توانید از کلیدها برای احراز هویت استفاده کنید، اما در اینجا ما فقط آنها را به آن منتقل می کنیم connect_to_region
روش ارائه شده توسط بوتو
در مرحله بعد، باید یا با SES یک آدرس ایمیل (آدرس Gmail به خوبی کار میکند) یا دامنهای را که مالک آن هستید تأیید کنید. اگر فقط این ویژگی را آزمایش می کنید، پیشنهاد می کنم فقط یک آدرس ایمیل را تأیید کنید زیرا کمی سریعتر است. تنها کاری که باید انجام دهید این است که کلیک کنید روی یک پیوند در ایمیل تأییدی که برای شما ارسال میکنند، برخلاف افزودن رکوردهای TXT به فایل منطقه شما برای تأیید یک دامنه.
اگر فقط برای اولین بار از SES استفاده می کنید و برنامه شما باید حجم بالایی از ایمیل ها را ارسال کند، ممکن است لازم باشد درخواستی برای افزایش سهمیه ارسال خود ارسال کنید. حساب SES شما در ابتدا در جعبه ایمنی قرار می گیرد، به این معنی که شما فقط می توانید 200 ایمیل در مدت 24 ساعت ارسال کنید. هنگامی که با موفقیت درخواست افزایش محدودیت های ارسال خود را دادید، باید بتوانید ارسال کنید زیاد بیشتر (من برای 50000 در روز تایید شدم که بسیار بیشتر از نیاز من است).
کد
پس از انجام تنظیمات اولیه که در بالا ذکر کردم، باید بتوانید از کد زیر برای ارسال ایمیل استفاده کنید.
import boto.ses
AWS_ACCESS_KEY = 'YOUR-ACCESS-KEY-HERE'
AWS_SECRET_KEY = 'YOUR-SECRET-KEY-HERE'
class Email(object):
def __init__(self, to, subject):
self.to = to
self.subject = subject
self._html = None
self._text = None
self._format = 'html'
def html(self, html):
self._html = html
def text(self, text):
self._text = text
def send(self, from_addr=None):
body = self._html
if isinstance(self.to, basestring):
self.to = (self.to)
if not from_addr:
from_addr = '(email protected)'
if not self._html and not self._text:
raise Exception('You must provide a text or html body.')
if not self._html:
self._format = 'text'
body = self._text
connection = boto.ses.connect_to_region(
'us-east-1',
aws_access_key_id=AWS_ACCESS_KEY,
aws_secret_access_key=AWS_SECRET_KEY
)
return connection.send_email(
from_addr,
self.subject,
None,
self.to,
format=self._format,
text_body=self._text,
html_body=self._html
)
برای استفاده از این کد، تنها کاری که باید انجام دهید این است:
email = Email(to='(email protected)', subject='You are HTML Awesome')
email.text('This is a text body. Foo bar.')
email.html('<html><body>This is a text body. <strong>Foo bar.</strong></body></html>')
email.send()
را email.html()
تماس اختیاری است اگر هم متن و هم HTML را در ایمیل خود وارد کنید، هر دو در نتیجه گنجانده می شوند MIME و کلاینت ایمیل هر فرمتی که توسط کاربر پشتیبانی یا ترجیح داده می شود را نشان می دهد.
استفاده از قالب های ایمیل
اگر می خواهید واقعاً شیک باشید، از موتور قالب استفاده کنید. بهجای ارسال مستقیم رشته متن ایمیل، میتوانیم آن را از یک الگو بارگیری کنیم، دقیقاً مانند HTML. page در یک چارچوب وب مانند Django
.
در اینجا ما از جینجا2 موتور قالب برای مدیریت بارگذاری و رندر قالب:
import boto.ses
from jinja2 import Environment, PackageLoader
env = Environment(loader=PackageLoader('yourapp', 'templates'))
AWS_ACCESS_KEY = 'YOUR-ACCESS-KEY-HERE'
AWS_SECRET_KEY = 'YOUR-SECRET-KEY-HERE'
class Email(object):
def __init__(self, to, subject):
self.to = to
self.subject = subject
self._html = None
self._text = None
def _render(self, filename, context):
template = env.get_template(filename)
return template.render(context)
def html(self, filename, context):
self._html = self._render(filename, context)
def text(self, filename, context):
self._text = self._render(filename, context)
def send(self, from_addr=None):
توجه داشته باشید: برای کد تولید، در واقع کلیدهای امنیتی AWS خود را مستقیماً در کد خود قرار ندهید. به جای آن از چیزی مانند متغیرهای محیطی استفاده کنید.
استفاده از این کد شبیه به قبل است، اما در عوض ما فقط نام فایل قالب و زمینه ای که قالب از آن پر می شود را ارسال می کنیم:
email = Email(to='(email protected)', subject='OMG an Email!')
ctx = {'username': user.username}
email.text('email.txt', ctx)
email.html('email.html', ctx)
email.send()
اکنون می توانید به راحتی ایمیل های HTML را درست مانند صفحات وب ایجاد و رندر کنید.
نتیجه
امیدواریم این آموزش کوتاه برای شما مفید بوده باشد. کد در اینجا باید برای بیشتر موارد استفاده خوب باشد، اگرچه میتوانید با افزودن CC، Bcc، آدرسهای پاسخ، مسیرهای برگشت یا حتی پیوستهای فایل، پیشرفت بیشتری کسب کنید.
همه این ویژگیهای اضافی که من به آن اشاره کردم، به جز پیوستها، قابل کنترل هستند send_email
تابع. برای ارسال پیوست ها باید از سطح پایین تر استفاده کنید send_raw_email
تابعی که از شما می خواهد پیام MIME را خودتان بسازید. نگران نباشید، این به لطف پایتون خیلی سخت نیست پست الکترونیک بسته، اما ما آن را برای مقاله دیگری ذخیره می کنیم.
این برای شما مفید بود؟ اشتباهی پیدا کردی؟ در نظرات به من اطلاع دهید!
منتشر شده در 1403-01-30 14:16:04