smtplib --- کلاینت پروتکل SMTP¶
کد منبع: Lib/smtplib.py
ماژول smtplib یک شیء نشست کلاینت SMTP را تعریف میکند که میتوان از آن برای ارسال ایمیل به هر ماشین اینترنتی با دیمن شنونده SMTP یا ESMTP استفاده کرد. برای جزئیات عملکرد SMTP و ESMTP، به RFC 821 (پروتکل انتقال سادهی ایمیل) و RFC 1869 (افزونههای سرویس SMTP) مراجعه کنید.
دسترسپذیری: not WASI.
این ماژول روی WebAssembly کار نمیکند یا در دسترس نیست. برای اطلاعات بیشتر سکوهای WebAssembly را ببینید.
- class smtplib.SMTP(host='', port=0, local_hostname=None, [timeout, ]source_address=None)¶
یک نمونه از
SMTPیک اتصال SMTP را در بر میگیرد. این کلاس متدهایی دارد که از مجموعه کاملی از عملیات SMTP و ESMTP پشتیبانی میکنند. اگر پارامترهای اختیاری host و port داده شوند، متدconnect()SMTP در حین مقداردهی اولیه با آن پارامترها فراخوانی میشود. در صورت مشخص بودن، از local_hostname بهعنوان FQDN میزبان محلی در دستور HELO/EHLO استفاده میشود. در غیر این صورت، نام میزبان محلی با استفاده ازsocket.getfqdn()یافت میشود. اگر فراخوانیconnect()هر مقداری غیر از یک کد موفقیت برگرداند، استثنایSMTPConnectErrorپرتاب میشود. پارامتر اختیاری timeout مهلتی به ثانیه برای عملیاتهای مسدودکننده مانند تلاش برای اتصال مشخص میکند (اگر مشخص نشود، از تنظیم پیشفرض سراسری مهلت استفاده خواهد شد). اگر مهلت منقضی شود، استثنایTimeoutErrorپرتاب میشود. پارامتر اختیاری source_address امکان مقیدسازی به یک نشانی مبدأ خاص در ماشینی با چندین رابط شبکه و/یا به یک پورت TCP مبدأ خاص را فراهم میکند. این پارامتر یک تاپل دوتایی(host, port)را میگیرد تا سوکت پیش از اتصال، بهعنوان نشانی مبدأ خود به آن مقید شود. در صورت حذف این پارامتر (یا اگر host یا port به ترتیب''و/یا0باشند) از رفتار پیشفرض سیستمعامل استفاده خواهد شد.برای استفادهی عادی، تنها باید به متدهای راهاندازی/اتصال،
sendmail()وSMTP.quit()نیاز داشته باشید. یک نمونه در زیر آمده است.کلاس
SMTPاز دستورwithپشتیبانی میکند. هنگامی که به این شکل استفاده شود، فرمانQUITSMTP بهطور خودکار در زمان خروج از دستورwithصادر میشود. برای مثال:>>> from smtplib import SMTP >>> with SMTP("domain.org") as smtp: ... smtp.noop() ... (250, b'Ok') >>>
تمام دستورات یک رویداد حسابرسی
smtplib.SMTP.sendرا با آرگومانهایselfوdataپرتاب میکنند، کهdataبایتهایی است که قرار است به میزبان راه دور ارسال شوند.تغییر یافته در نسخهی 3.3: پشتیبانی از دستور
withافزوده شد.تغییر یافته در نسخهی 3.3: آرگومان source_address اضافه شد.
اضافه شده در نسخهی 3.5: افزونهی SMTPUTF8 (RFC 6531) اکنون پشتیبانی میشود.
تغییر یافته در نسخهی 3.9: اگر پارامتر timeout روی صفر تنظیم شود، یک
ValueErrorپرتاب میشود تا از ایجاد یک سوکت غیرمسدودکننده جلوگیری شود.
- class smtplib.SMTP_SSL(host='', port=0, local_hostname=None, *, [timeout, ]context=None, source_address=None)¶
یک نمونه از
SMTP_SSLدقیقاً مانند نمونههایSMTPرفتار میکند.SMTP_SSLباید برای موقعیتهایی استفاده شود که SSL از ابتدای اتصال مورد نیاز باشد و استفاده ازstarttls()مناسب نباشد. اگر host مشخص نشده باشد، از میزبان محلی استفاده میشود. اگر port صفر باشد، از درگاه استاندارد SMTP-over-SSL (۴۶۵) استفاده میشود. آرگومانهای اختیاری local_hostname، timeout و source_address همان معنایی را دارند که در کلاسSMTPدارند. context، که آن هم اختیاری است، میتواند شامل یکSSLContextباشد و به شما امکان میدهد که جنبههای مختلف اتصال امن را پیکربندی کنید. لطفاً برای بهترین شیوهها، ملاحظات امنیتی را بخوانید.تغییر یافته در نسخهی 3.3: context اضافه شد.
تغییر یافته در نسخهی 3.3: آرگومان source_address افزوده شد.
تغییر یافته در نسخهی 3.4: این کلاس اکنون از بررسی نام میزبان با
ssl.SSLContext.check_hostnameو نشاندهی نام سرور (Server Name Indication) پشتیبانی میکند (ssl.HAS_SNIرا ببینید).تغییر یافته در نسخهی 3.9: اگر پارامتر timeout برابر با صفر تنظیم شود، یک
ValueErrorپرتاب میشود تا از ایجاد یک سوکت غیرمسدودکننده جلوگیری شودتغییر یافته در نسخهی 3.12: پارامترهای منسوخ keyfile و certfile حذف شدهاند.
- class smtplib.LMTP(host='', port=LMTP_PORT, local_hostname=None, source_address=None[, timeout])¶
پروتکل LMTP، که بسیار شبیه به ESMTP است، تا حد زیادی مبتنی بر کلاینت SMTP استاندارد است. استفاده از سوکتهای یونیکس برای LMTP رایج است، بنابراین متد
connect()ما باید هم از آن و هم از یک سرور معمولی host:port پشتیبانی کند. آرگومانهای اختیاری local_hostname و source_address همان معنایی را دارند که در کلاسSMTPدارند. برای مشخص کردن یک سوکت یونیکس، باید برای host از یک مسیر مطلق استفاده کنید که با '/' شروع میشود.احراز هویت با استفاده از سازوکار معمول SMTP پشتیبانی میشود. هنگام استفاده از یک سوکت یونیکس، LMTP معمولاً از هیچ احراز هویتی پشتیبانی نمیکند یا به آن نیازی ندارد، اما ممکن است شرایط شما متفاوت باشد.
تغییر یافته در نسخهی 3.9: پارامتر اختیاری timeout افزوده شد.
همچنین مجموعهی مناسبی از استثناها تعریف شده است:
- exception smtplib.SMTPException¶
زیرکلاسی از
OSErrorکه کلاس پایهی استثنا برای تمام استثناهای دیگری است که توسط این ماژول ارائه میشوند.تغییر یافته در نسخهی 3.4: SMTPException به زیرکلاسی از
OSErrorتبدیل شد
- exception smtplib.SMTPServerDisconnected¶
این استثنا زمانی پرتاب میشود که سرور بهطور غیرمنتظرهای قطع ارتباط کند، یا زمانی که تلاشی برای استفاده از نمونهی
SMTPپیش از اتصال آن به سرور صورت گیرد.
- exception smtplib.SMTPResponseException¶
کلاس پایه برای همه استثناهایی که شامل یک کد خطای SMTP هستند. این استثناها در برخی موارد زمانی تولید میشوند که سرور SMTP یک کد خطا برمیگرداند.
- smtp_code¶
کد خطا.
- smtp_error¶
پیام خطا.
- exception smtplib.SMTPSenderRefused¶
نشانی فرستنده رد شد. علاوه بر ویژگیهایی که روی همهی استثناهای
SMTPResponseExceptionتنظیم شدهاند، این استثنا 'sender' را برابر با رشتهای قرار میدهد که سرور SMTP آن را رد کرده است.
- exception smtplib.SMTPRecipientsRefused¶
تمام نشانیهای گیرنده رد شدند.
- recipients¶
دیکشنری دقیقاً از همان نوعی که
SMTP.sendmail()بازمیگرداند، شامل خطاهای هر گیرنده است.
- exception smtplib.SMTPDataError¶
سرور SMTP از پذیرش دادههای پیام خودداری کرد.
- exception smtplib.SMTPConnectError¶
خطایی در هنگام برقراری اتصال با سرور رخ داد.
- exception smtplib.SMTPHeloError¶
سرور پیام
HELOما را رد کرد.
- exception smtplib.SMTPNotSupportedError¶
فرمان یا گزینهی تلاششده توسط سرور پشتیبانی نمیشود.
اضافه شده در نسخهی 3.5.
- exception smtplib.SMTPAuthenticationError¶
احراز هویت SMTP با مشکل مواجه شد. به احتمال زیاد سرور ترکیب نام کاربری/گذرواژهی ارائهشده را نپذیرفت.
همچنین ملاحظه نمائید
- RFC 821 - پروتکل انتقال نامهی ساده (Simple Mail Transfer Protocol)
تعریف پروتکل SMTP. این سند مدل، رویه عملیاتی و جزئیات پروتکل SMTP را پوشش میدهد.
- RFC 1869 - افزونههای سرویس SMTP
تعریف افزونههای ESMTP برای SMTP. این متن چارچوبی را برای گسترش SMTP با دستورهای جدید توصیف میکند، از کشف پویای دستورهای ارائهشده توسط سرور پشتیبانی میکند و چند دستور اضافی را تعریف میکند.
اشیای SMTP¶
نمونهای از SMTP دارای متدهای زیر است:
- SMTP.set_debuglevel(level)¶
سطح خروجی اشکالزدایی را تنظیم کنید. مقدار ۱ یا
Trueبرای level منجر به پیامهای اشکالزدایی برای اتصال و برای تمام پیامهای ارسالی به سرور و دریافتی از سرور میشود. مقدار ۲ برای level باعث میشود این پیامها دارای مهر زمانی شوند.تغییر یافته در نسخهی 3.5: debuglevel 2 افزوده شد.
- SMTP.docmd(cmd, args='')¶
فرمان cmd را به سرور ارسال کنید. آرگومان اختیاری args بهسادگی با یک فاصله به فرمان الحاق میشود.
این یک تاپل ۲تایی متشکل از یک کد پاسخ عددی و خط پاسخ واقعی را برمیگرداند (پاسخهای چندخطی به یک خط طولانی تبدیل میشوند).
در حالت عادی، نیازی به فراخوانی صریح این متد نیست. این متد برای پیادهسازی سایر متدها استفاده میشود و ممکن است برای آزمون افزونههای خصوصی مفید باشد.
اگر اتصال به سرور در حین انتظار برای پاسخ قطع شود،
SMTPServerDisconnectedپرتاب خواهد شد.
- SMTP.connect(host='localhost', port=0)¶
به یک میزبان در یک پورت مشخص متصل میشود. پیشفرض این است که به میزبان محلی در پورت استاندارد SMTP (۲۵) متصل شود. اگر نام میزبان با یک دونقطه (
':') و به دنبال آن یک عدد پایان یابد، آن پسوند حذف میشود و عدد بهعنوان شماره پورتی که باید استفاده شود تفسیر میشود. اگر در هنگام نمونهسازی یک میزبان مشخص شده باشد، این متد بهطور خودکار توسط سازنده فراخوانی میشود. یک تاپل ۲تایی شامل کد پاسخ و پیامی که سرور در پاسخ اتصال خود ارسال کرده است برمیگرداند.یک رویداد حسابرسی
smtplib.connectرا با آرگومانهایself،host،portپرتاب میکند.
- SMTP.helo(name='')¶
با استفاده از
HELOخود را به سرور SMTP معرفی کنید. آرگومان hostname بهطور پیشفرض برابر با نام دامنهی کامل میزبان محلی است. پیام برگرداندهشده از سوی سرور، بهعنوان ویژگیhelo_respشیء ذخیره میشود.در عملکرد عادی، لازم نیست این متد را بهطور صریح فراخوانی کنید. در صورت لزوم، این متد بهطور ضمنی توسط
sendmail()فراخوانی میشود.
- SMTP.ehlo(name='')¶
با استفاده از
EHLO، خود را به یک سرور ESMTP معرفی کنید. آرگومان hostname بهطور پیشفرض برابر با نام دامنهی کامل میزبان محلی (fully qualified domain name) است. پاسخ را از نظر گزینههای ESMTP بررسی کنید و آنها را ذخیره کنید تاhas_extn()از آنها استفاده کند. همچنین چند ویژگی اطلاعاتی را تنظیم میکند: پیام برگرداندهشده از سرور بهعنوان ویژگیehlo_respذخیره میشود،does_esmtpبسته به اینکه سرور از ESMTP پشتیبانی کند یا نه، رویTrueیاFalseتنظیم میشود، وesmtp_featuresیک دیکشنری حاوی نام افزونههای سرویس SMTP پشتیبانیشده توسط این سرور و پارامترهای آنها (در صورت وجود) خواهد بود.مگر اینکه بخواهید پیش از ارسال ایمیل از
has_extn()استفاده کنید، نیازی به فراخوانی صریح این متد نیست. این متد در صورت لزوم بهطور ضمنی توسطsendmail()فراخوانی میشود.
- SMTP.ehlo_or_helo_if_needed()¶
این متد،
ehlo()و/یاhelo()را در صورتی فراخوانی میکند که پیشتر در این نشست دستورEHLOیاHELOوجود نداشته باشد. ابتدا ESMTPEHLOرا امتحان میکند.SMTPHeloErrorسرور بهدرستی به سلام
HELOپاسخ نداد.
- SMTP.has_extn(name)¶
اگر name در مجموعهی افزونههای سرویس SMTP برگرداندهشده توسط سرور وجود داشته باشد،
Trueو در غیر این صورتFalseبرمیگرداند. بزرگی و کوچکی حروف نادیده گرفته میشود.
- SMTP.verify(address)¶
صحت یک نشانی در این سرور را با استفاده از
VRFYدر SMTP بررسی میکند. اگر نشانی کاربر معتبر باشد، تاپلی شامل کد ۲۵۰ و یک نشانی کامل RFC 822 (شامل نام شخص) بازمیگرداند. در غیر این صورت، یک کد خطای SMTP با مقدار ۴۰۰ یا بیشتر و یک رشته خطا بازمیگرداند.توجه
بسیاری از وبسایتها SMTP
VRFYرا غیرفعال میکنند تا جلوی هرزنامهفرستندگان را بگیرند.
- SMTP.login(user, password, *, initial_response_ok=True)¶
به یک سرور SMTP که نیازمند احراز هویت است، وارد شوید. آرگومانها، نام کاربری و گذرواژهای هستند که برای احراز هویت استفاده میشوند. اگر در این نشست هیچ دستور
EHLOیاHELOپیشینی وجود نداشته باشد، این متد ابتدا ESMTPEHLOرا امتحان میکند. این متد در صورت موفقیتآمیز بودن احراز هویت، بهصورت عادی برمیگردد، یا ممکن است استثناهای زیر را پرتاب کند:SMTPHeloErrorسرور بهدرستی به سلام
HELOپاسخ نداد.SMTPAuthenticationErrorسرور ترکیب نامکاربری/گذرواژه را نپذیرفت.
SMTPNotSupportedErrorسرور از فرمان
AUTHپشتیبانی نمیکند.SMTPExceptionهیچ متد احراز هویت مناسبی یافت نشد.
هر یک از روشهای احراز هویت پشتیبانیشده توسط
smtplib، در صورتی که پشتیبانی از آنها توسط سرور اعلام شده باشد، بهترتیب امتحان میشوند. برای مشاهده فهرستی از روشهای احراز هویت پشتیبانیشده،auth()را ببینید. initial_response_ok بهauth()منتقل میشود.آرگومان کلیدواژهای اختیاری initial_response_ok مشخص میکند که آیا، برای روشهای احراز هویتی که از آن پشتیبانی میکنند، میتوان یک «پاسخ اولیه» مطابق RFC 4954 را همراه با دستور
AUTHارسال کرد، به جای آنکه به چالش/پاسخ نیاز باشد.تغییر یافته در نسخهی 3.5: ممکن است
SMTPNotSupportedErrorپرتاب شود، و پارامتر initial_response_ok افزوده شده است.
- SMTP.auth(mechanism, authobject, *, initial_response_ok=True)¶
دستور
SMTPAUTHرا برای mechanism احراز هویت مشخصشده صادر کنید و پاسخ چالش را از طریق authobject مدیریت کنید.mechanism مشخص میکند که کدام سازوکار احراز هویت باید بهعنوان آرگومان فرمان
AUTHاستفاده شود؛ مقادیر معتبر، آنهایی هستند که در عنصرauthازesmtp_featuresفهرست شدهاند.authobject باید یک شیء فراخوانیپذیر باشد که یک آرگومان اختیاری میپذیرد:
data = authobject(challenge=None)
اگر آرگومان کلیدواژهای اختیاری initial_response_ok درست باشد،
authobject()ابتدا بدون آرگومان فراخوانی میشود. این تابع میتواند یکstrASCII «پاسخ اولیه» طبق RFC 4954 را برگرداند که کدگذاری شده و بهصورت زیر همراه با دستورAUTHارسال میشود. اگرauthobject()از پاسخ اولیه پشتیبانی نمیکند (مثلاً به این دلیل که به یک چالش نیاز دارد)، باید هنگام فراخوانی باchallenge=NoneمقدارNoneرا برگرداند. اگر initial_response_ok نادرست باشد، آنگاهauthobject()ابتدا باNoneفراخوانی نمیشود.اگر بررسی پاسخ اولیه
Noneبرگرداند، یا اگر initial_response_ok نادرست باشد،authobject()فراخوانی خواهد شد تا پاسخ چالش سرور را پردازش کند؛ آرگومان challenge که به آن داده میشود یکbytesخواهد بود. باید data از نوعstrASCII را بازگرداند که کدگذاری base64 میشود و به سرور ارسال میشود.کلاس
SMTP،authobjectsرا برای سازوکارهایCRAM-MD5،PLAINوLOGINفراهم میکند؛ این موارد بهترتیبSMTP.auth_cram_md5،SMTP.auth_plainوSMTP.auth_loginنامگذاری شدهاند. همهی آنها نیاز دارند که ویژگیهایuserوpasswordاز نمونهیSMTPروی مقادیر مناسب تنظیم شده باشند.کد کاربر معمولاً نیازی ندارد
authرا مستقیماً فراخوانی کند، بلکه میتواند در عوض متدlogin()را فراخوانی کند، که هر یک از سازوکارهای بالا را بهنوبت و به ترتیب ذکرشده امتحان میکند.authبرای تسهیل پیادهسازی روشهای احراز هویت که مستقیماً درsmtplibپشتیبانی نمیشوند (یا هنوز پشتیبانی نمیشوند) در دسترس قرار گرفته است.اضافه شده در نسخهی 3.5.
- SMTP.starttls(*, context=None)¶
اتصال SMTP را در حالت TLS (امنیت لایهی انتقال) قرار دهید. تمام دستورات SMTP که در ادامه میآیند رمزگذاری خواهند شد. سپس باید
ehlo()را دوباره فراخوانی کنید.اگر keyfile و certfile ارائه شده باشند، از آنها برای ایجاد یک
ssl.SSLContextاستفاده میشود.پارامتر اختیاری context یک شیء
ssl.SSLContextاست؛ این یک جایگزین برای استفاده از keyfile و certfile است و در صورت مشخص شدن، هر دو keyfile و certfile بایدNoneباشند.اگر در این نشست هیچ دستور پیشین
EHLOیاHELOوجود نداشته باشد، این متد ابتدا ESMTPEHLOرا امتحان میکند.تغییر یافته در نسخهی 3.12: پارامترهای منسوخ keyfile و certfile حذف شدهاند.
SMTPHeloErrorسرور بهدرستی به سلام
HELOپاسخ نداد.SMTPNotSupportedErrorسرور از افزونه STARTTLS پشتیبانی نمیکند.
RuntimeErrorپشتیبانی از SSL/TLS در مفسر پایتون شما در دسترس نیست.
تغییر یافته در نسخهی 3.3: context اضافه شد.
تغییر یافته در نسخهی 3.4: این متد اکنون از بررسی نام میزبان با
ssl.SSLContext.check_hostnameو نشانگر نام سرور (Server Name Indicator) پشتیبانی میکند (نگاه کنید بهHAS_SNI).تغییر یافته در نسخهی 3.5: خطایی که به دلیل فقدان پشتیبانی از STARTTLS پرتاب میشود، اکنون به جای کلاس پایهی
SMTPException، از زیرکلاسSMTPNotSupportedErrorاست.
- SMTP.sendmail(from_addr, to_addrs, msg, mail_options=(), rcpt_options=())¶
ارسال ایمیل. آرگومانهای الزامی عبارتاند از: یک رشتهی آدرس فرستنده مطابق RFC 822، فهرستی از رشتههای آدرس گیرنده مطابق RFC 822 (یک رشتهی ساده بهعنوان فهرستی حاوی ۱ آدرس در نظر گرفته میشود)، و یک رشتهی پیام. فراخواننده میتواند فهرستی از گزینههای ESMTP (مانند
"8bitmime") را برای استفاده در دستوراتMAIL FROMبهعنوان mail_options ارسال کند. گزینههای ESMTP (مانند دستوراتDSN) را که باید با تمام دستوراتRCPTاستفاده شوند، میتوان بهعنوان rcpt_options ارسال کرد. هر گزینه باید بهصورت رشتهای ارسال شود که حاوی متن کامل گزینه باشد، از جمله هر کلید احتمالی (برای مثال،"NOTIFY=SUCCESS,FAILURE"). (اگر نیاز دارید برای گیرندگان مختلف از گزینههای ESMTP متفاوت استفاده کنید، باید از متدهای سطح پایین مانندmail()،rcpt()وdata()برای ارسال پیام استفاده کنید.)توجه
پارامترهای from_addr و to_addrs برای ساخت پاکت پیام (message envelope) مورد استفادهی عوامل انتقال به کار میروند.
sendmailبه هیچ وجه سرآیندهای پیام را تغییر نمیدهد.msg ممکن است یک رشته حاوی نویسههای محدوده ASCII یا یک رشته بایتی باشد. یک رشته با استفاده از کدک ascii به بایت کدگذاری میشود و نویسههای منفرد
\rو\nبه نویسههای\r\nتبدیل میشوند. یک رشته بایتی تغییر نمیکند.اگر در این نشست پیشتر دستور
EHLOیاHELOارسال نشده باشد، این متد ابتداEHLOESMTP را امتحان میکند. اگر سرور ESMTP را پشتیبانی کند، اندازه پیام و هر یک از گزینههای مشخصشده به آن ارسال میشوند (اگر گزینه در مجموعه قابلیتهایی باشد که سرور اعلام میکند). اگرEHLOناموفق باشد،HELOامتحان میشود و گزینههای ESMTP حذف میشوند.این متد در صورت پذیرفته شدن ایمیل برای حداقل یک گیرنده، بهطور عادی برمیگردد. در غیر این صورت استثنایی پرتاب خواهد کرد. یعنی اگر این متد استثنایی پرتاب نکند، ایمیل شما باید به دست کسی برسد. اگر این متد استثنایی پرتاب نکند، یک دیکشنری برمیگرداند که برای هر گیرندهای که رد شده باشد، یک آیتم دارد. هر آیتم شامل یک تاپل از کد خطای SMTP و پیام خطای همراه ارسالشده از سوی سرور است.
اگر
SMTPUTF8در mail_options گنجانده شده باشد و سرور از آن پشتیبانی کند، from_addr و to_addrs میتوانند شامل نویسههای غیر ASCII باشند.این متد ممکن است استثناهای زیر را پرتاب کند:
SMTPRecipientsRefusedهمهی گیرندهها رد شدند. هیچکس ایمیل را دریافت نکرد.
SMTPHeloErrorسرور بهدرستی به سلام
HELOپاسخ نداد.SMTPSenderRefusedسرور from_addr را نپذیرفت.
SMTPDataErrorسرور با کد خطای غیرمنتظرهای پاسخ داد (غیر از رد یک گیرنده).
SMTPNotSupportedErrorSMTPUTF8در mail_options داده شده است، اما سرور از آن پشتیبانی نمیکند.
مگر اینکه خلاف آن ذکر شده باشد، اتصال حتی پس از پرتاب شدن یک استثنا باز خواهد بود.
تغییر یافته در نسخهی 3.2: ممکن است msg یک رشته بایتی باشد.
تغییر یافته در نسخهی 3.5: پشتیبانی از
SMTPUTF8اضافه شد، و اگرSMTPUTF8تعیین شده باشد اما سرور از آن پشتیبانی نکند، ممکن استSMTPNotSupportedErrorپرتاب شود.
- SMTP.send_message(msg, from_addr=None, to_addrs=None, mail_options=(), rcpt_options=())¶
این یک متد سهولتبخش برای فراخوانی
sendmail()با پیامی است که توسط یک شیءemail.message.Messageبازنمایی میشود. آرگومانها همان معنای خود درsendmail()را دارند، بهجز اینکه msg یک شیءMessageاست.اگر from_addr برابر
Noneیا to_addrs برابرNoneباشد،send_messageآن آرگومانها را با نشانیهای استخراجشده از سرآیندهای msg پر میکند، همانطور که در RFC 5322: مشخص شده است، from_addr در صورت وجود به فیلد Sender و در غیر این صورت به فیلد From تنظیم میشود. to_addrs مقدارهای فیلدهای To، Cc و Bcc را (در صورت وجود) از msg با هم ترکیب میکند. اگر دقیقاً یک مجموعه از سرآیندهای Resent-* در پیام وجود داشته باشد، سرآیندهای معمولی نادیده گرفته میشوند و در عوض از سرآیندهای Resent-* استفاده میشود. اگر پیام شامل بیش از یک مجموعه از سرآیندهای Resent-* باشد، یکValueErrorپرتاب میشود، زیرا هیچ راهی برای تشخیص بدون ابهام آخرین مجموعه از سرآیندهای Resent- وجود ندارد.send_messagemsg را با استفاده ازBytesGeneratorبا\r\nبهعنوان linesep سریالسازی میکند وsendmail()را فراخوانی میکند تا پیام حاصل ارسال شود. صرفنظر از مقادیر from_addr و to_addrs،send_messageهیچیک از سرآیندهای Bcc یا Resent-Bcc را که ممکن است در msg وجود داشته باشند، ارسال نمیکند. اگر هر یک از نشانیهای موجود در from_addr و to_addrs حاوی نویسههای غیر ASCII باشد و سرور پشتیبانی ازSMTPUTF8را اعلام نکند، استثنایSMTPNotSupportedErrorپرتاب میشود. در غیر این صورت،Messageبا یک نسخهی مشابه ازpolicyخود سریالسازی میشود که در آن ویژگیutf8رویTrueتنظیم شده است، وSMTPUTF8وBODY=8BITMIMEبه mail_options افزوده میشوند.اضافه شده در نسخهی 3.2.
اضافه شده در نسخهی 3.5: پشتیبانی از نشانیهای بینالمللیشده (
SMTPUTF8).
- SMTP.quit()¶
نشست SMTP را پایان میدهد و اتصال را میبندد. نتیجهی دستور
QUITSMTP را برمیگرداند.
متدهای سطح پایینی که متناظر با فرمانهای استاندارد SMTP/ESMTP یعنی HELP، RSET، NOOP، MAIL، RCPT و DATA هستند نیز پشتیبانی میشوند. معمولاً نیازی به فراخوانی مستقیم آنها نیست، بنابراین در اینجا مستند نشدهاند. برای جزئیات، به کد ماژول مراجعه کنید.
علاوه بر این، یک نمونه SMTP دارای ویژگیهای زیر است:
مثال SMTP¶
این مثال از کاربر میخواهد که نشانیهای مورد نیاز در پاکت پیام (نشانیهای 'To' و 'From') و پیامی را که باید تحویل داده شود وارد کند. توجه داشته باشید که سرآیندهایی که باید همراه پیام باشند، باید به همان شکلی که وارد شدهاند در پیام گنجانده شوند؛ این مثال هیچ پردازشی روی سرآیندهای RFC 822 انجام نمیدهد. بهویژه، نشانیهای 'To' و 'From' باید بهصراحت در سرآیندهای پیام گنجانده شوند:
import smtplib
def prompt(title):
return input(title).strip()
from_addr = prompt("From: ")
to_addrs = prompt("To: ").split()
print("Enter message, end with ^D (Unix) or ^Z (Windows):")
# Add the From: and To: headers at the start!
lines = [f"From: {from_addr}", f"To: {', '.join(to_addrs)}", ""]
while True:
try:
line = input()
except EOFError:
break
else:
lines.append(line)
msg = "\r\n".join(lines)
print("Message length is", len(msg))
server = smtplib.SMTP("localhost")
server.set_debuglevel(1)
server.sendmail(from_addr, to_addrs, msg)
server.quit()
توجه
بهطور کلی، شما میخواهید از قابلیتهای بستهی email برای ساخت یک پیام ایمیل استفاده کنید، که سپس میتوانید آن را از طریق send_message() ارسال کنید؛ email: مثالها را ببینید.