萬盛學電腦網

 萬盛學電腦網 >> 網絡編程 >> 編程語言綜合 >> Python基於smtplib實現異步發送郵件服務

Python基於smtplib實現異步發送郵件服務

   這篇文章主要介紹了Python基於smtplib實現異步發送郵件服務,需要的朋友可以參考下

  基於smtplib包制作而成,但在實踐中發現一個不知道算不算是smtplib留的一個坑,在網絡斷開的情況下發送郵件時會拋出一個socket.gaierror的異常,但是smtplib中並沒有捕獲這個異常,導致程序會因這個異常終止,因此代碼中針對這部分的異常進行處理,確保不會異常終止。

  ?

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 #!/usr/bin/env python # -*- coding: utf-8 -*-   __author__ = 'Zoa Chou' # see http://www.mudoom.com/Article/show/id/29.html for detail   import logging import smtplib import mimetypes import socket from email import encoders from email.header import Header from email.mime.text import MIMEText, MIMENonMultipart from email.mime.base import MIMEBase from email.utils import parseaddr, formataddr     class Mailer(object): def __init__(self): pass   def send_mail(self, smtp_server, from_address, to_address, subject, body, files=None): """ 發送郵件主程序 :param smtp_server: dict 郵件服務器設置 :keyword host: string smtp服務器地址 :keyword port: int smtp服務器端口號 :keyword user: string 用戶名 :keyword passwd: string 密碼 :keyword ssl: bool 是否啟用ssl,默認False :keyword timeout: int 超時時間,默認10s :param from_address: 發件人郵箱 :param to_address: 收件人郵箱 :param subject: 郵件標題 :param body: 郵件內容 :param files: 附件 :raise: NetworkError/MailerException """ # 格式化郵件內容 body = self._encode_utf8(body) # 郵件類型 content_type = 'html' if body.startswith('<html>') else 'plain' msg = MIMENonMultipart() if files else MIMEText(body, content_type, 'utf-8') # 格式化郵件數據 msg['From'] = self._format_address(from_address) msg['To'] = ', '.join(self._format_list(to_address)) msg['subject'] = self._encode_utf8(subject)   # 構造附件數據 if files: msg.attach(MIMEText(body, content_type, 'utf-8')) cid = 0 for file_name, payload in files: file_name = self._encode_utf8(file_name) main_type, sub_type = self._get_file_type(file_name) if hasattr(payload, 'read'): payload = payload.read() f_name = self._encode_header(file_name) mime = MIMEBase(main_type, sub_type, filename=f_name) mime.add_header('Content-Disposition', 'attachment', filename=f_name) mime.add_header('Content-ID', '<%s>' % cid) mime.add_header('X-Attachment-Id', '%s' % cid) mime.set_payload(payload) encoders.encode_base64(mime) msg.attach(mime) cid += 1   host = smtp_server.get('host') port = smtp_server.get('port') user = smtp_server.get('user') passwd = smtp_server.get('passwd') ssl = smtp_server.get('ssl', False) time_out = smtp_server.get('timeout', 10)   # 沒有輸入端口則使用默認端口 if port is None or port == 0: if ssl: port = 465 else: port = 25   logging.debug('Send mail form %s to %s' % (msg['From'], msg['To']))   try: if ssl: # 開啟ssl連接模式 server = smtplib.SMTP_SSL('%s:%d' % (host, port), timeout=time_out) else: server = smtplib.SMTP('%s:%d' % (host, port), timeout=time_out) # 開啟調試模式 # server.set_debuglevel(1)   # 如果存在用戶名密碼則嘗試登錄 if user and passwd: server.login(user, passwd)  
copyright © 萬盛學電腦網 all rights reserved