1*9c5db199SXin Liimport os, email, smtplib 2*9c5db199SXin Li 3*9c5db199SXin Li 4*9c5db199SXin Lidef send(from_address, to_addresses, cc_addresses, subject, message_body): 5*9c5db199SXin Li """ 6*9c5db199SXin Li Send out a plain old text email. It uses sendmail by default, but 7*9c5db199SXin Li if that fails then it falls back to using smtplib. 8*9c5db199SXin Li 9*9c5db199SXin Li Args: 10*9c5db199SXin Li from_address: the email address to put in the "From:" field 11*9c5db199SXin Li to_addresses: either a single string or an iterable of 12*9c5db199SXin Li strings to put in the "To:" field of the email 13*9c5db199SXin Li cc_addresses: either a single string of an iterable of 14*9c5db199SXin Li strings to put in the "Cc:" field of the email 15*9c5db199SXin Li subject: the email subject 16*9c5db199SXin Li message_body: the body of the email. there's no special 17*9c5db199SXin Li handling of encoding here, so it's safest to 18*9c5db199SXin Li stick to 7-bit ASCII text 19*9c5db199SXin Li """ 20*9c5db199SXin Li # addresses can be a tuple or a single string, so make them tuples 21*9c5db199SXin Li if isinstance(to_addresses, str): 22*9c5db199SXin Li to_addresses = [to_addresses] 23*9c5db199SXin Li else: 24*9c5db199SXin Li to_addresses = list(to_addresses) 25*9c5db199SXin Li if isinstance(cc_addresses, str): 26*9c5db199SXin Li cc_addresses = [cc_addresses] 27*9c5db199SXin Li else: 28*9c5db199SXin Li cc_addresses = list(cc_addresses) 29*9c5db199SXin Li 30*9c5db199SXin Li message = email.Message.Message() 31*9c5db199SXin Li message["To"] = ", ".join(to_addresses) 32*9c5db199SXin Li message["Cc"] = ", ".join(cc_addresses) 33*9c5db199SXin Li message["From"] = from_address 34*9c5db199SXin Li message["Subject"] = subject 35*9c5db199SXin Li message.set_payload(message_body) 36*9c5db199SXin Li 37*9c5db199SXin Li server = smtplib.SMTP("localhost") 38*9c5db199SXin Li server.sendmail(from_address, to_addresses + cc_addresses, message.as_string()) 39*9c5db199SXin Li server.quit() 40