利用本地smtp server发送
windows下尝试装了两个smtp server大概配置了下,发现没法生效,也没时间仔细研究了。装上foxmail发现以前可以本地发送的选项已经无法找到。
不带附件的这样发送。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import smtplib
from email.mime.text import MIMEText
from email.header import Header
sender = 'tangjian@tangjian.dell'
# receivers = ['tangxiaosheng@yeah.net'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
receivers = ['jian.tang@zongmutech.com'] # 接收邮件,可设置为你的QQ邮箱或者其他邮箱
# 三个参数:第一个为文本内容,第二个 plain 设置文本格式,第三个 utf-8 设置编码
message = MIMEText('Python 邮件发送测试...', 'plain', 'utf-8')
message['From'] = Header("菜鸟教程", 'utf-8') # 发送者
message['To'] = Header("测试", 'utf-8') # 接收者
subject = 'Python SMTP 邮件测试'
message['Subject'] = Header(subject, 'utf-8')
try:
smtpObj = smtplib.SMTP('localhost')
smtpObj.sendmail(sender, receivers, message.as_string())
print "邮件发送成功"
except smtplib.SMTPException:
print "Error: 无法发送邮件"
利用smtp服务器发送
#!/usr/bin/python
#coding: utf-8
import os
import sys
import smtplib
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
from email.mime.multipart import MIMEMultipart
def sendMail(receiver, subject, content, attachment=None):
sender = 'tangxiaosheng@21cn.com'
#定义邮件主题和正文
content ='<html><h1>' + content + '</h1></html>'
#定义邮箱服务器和邮箱账户
smtpserver = 'smtp.21cn.com'
username = 'tangxiaosheng@21cn.com'
password = 'xxxx'
#定义邮件三大主题
#如果一封邮件中含有附件,那邮件的Content-Type域中必须定义multipart/mixed类型
msgRoot = MIMEMultipart('mixed')
msgRoot['Subject'] = subject
msgRoot['From'] = sender
msgRoot['To'] = receiver
#构造邮件正文
msgText = MIMEText(content,'html','utf-8')
msgRoot.attach(msgText)
if attachment:
fp = open(attachment, 'rb')
baseName = os.path.basename(attachment)
msgAtt = MIMEText(fp.read(),'base64','utf-8')
msgAtt["Content-Type"] = 'application/octet-stream'
msgAtt["Content-Disposition"] = 'attachment; filename=%s' % baseName
msgRoot.attach(msgAtt)
smtp = smtplib.SMTP()
smtp.connect('smtp.21cn.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()
if __name__=='__main__':
subject = '这是邮件主题'
content = 'this mail has attachmet'
# sendMail(subject, content, './mailatt.py')
if len(sys.argv) >= 5:
sendMail(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])
else:
sendMail(sys.argv[1], sys.argv[2], sys.argv[3])
#!/usr/bin/python 这一行要有。方便从命令行调用 mailatt.py .....,如果是 #!/usr/bin/evn python 更合适,适合多个python的版本。
用公司提供的邮箱发送时,碰到问题,修改后解决。原因不明。
msgRoot['To'] 一定需要是字符串类型的,不能是列表。
import os
import smtplib
from email.mime.text import MIMEText
from email.header import Header
from email.mime.multipart import MIMEMultipart
def sendMail():
host = '192.168.5.10'
# host = '42.159.161.202'
sender = 'beitest_reporter@zongmutech.com'
receiver = 'jian.tang@zongmutech.com'
subject = '这是邮件主题' #定义邮件主题
content = u'这是邮件内容'
# content = 'this is content'
username = 'beitest_reporter' #定义登录邮箱账户
password = '' #定义登录邮箱密码
msg = MIMEText(content.encode('utf-8'),'plain','utf-8' ) #第二个参数使用'plain',如果使用'text'发送内容为空,不知道为什么
msg['From']=sender #一定要指定'From'属性,否则会报554
msg['To']=receiver #多个邮件接收人时,如果报错,可以不指定
msg['Subject'] = Header(subject, 'utf-8')
try:
smtp = smtplib.SMTP(host, 25)
# smtp = smtplib.SMTP_SSL(host, 25)
# print 'aaa'
# smtp.set_debuglevel(True)
# smtp.ehlo()
# smtp.starttls()
# smtp.ehlo()
# status = smtp.login(username, password)
# print status
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
except:
print("邮件发送失败!")
def sendmail1():
file = '/home/tangjian/work/analyze_python/data/result/report.html'
print "mail_file = " + file
receiver = 'jian.tang@zongmutech.com'
sender = 'beitest_reporter@zongmutech.com'
msgRoot = MIMEMultipart('mixed')
msgRoot['Subject'] = "Test Report"
msgRoot['From'] = sender
msgRoot['To'] = receiver
htmlfile = open(file)
htmlbody = htmlfile.read()
msgText = MIMEText(htmlbody,'html','utf-8')
msgRoot.attach(msgText)
fp = open(file, 'rb')
msgAtt = MIMEText(fp.read(),'base64','utf-8')
msgAtt["Content-Type"] = 'application/octet-stream'
filename = os.path.basename(file)
msgAtt["Content-Disposition"] = 'attachment; filename=%s' % filename
msgRoot.attach(msgAtt)
smtp = smtplib.SMTP('192.168.5.10')
smtp.sendmail(sender, receiver, msgRoot.as_string())
smtp.quit()
# SMTP AUTH extension not supported by server
if __name__=='__main__':
# sendMail()
sendmail1()
两个函数都能work,先前第一个函数是用21cn做位smtp服务器可以work的代码。公司的服务器,没有密码。
content = u'这是邮件内容' #这一行前面对于中文要加 “u”。另外
msg = MIMEText(content.encode('utf-8') #加上encode(...)
尝试yeah发送的时候,
smtp = smtplib.SMTP(host, 25)
# smtp = smtplib.SMTP_SSL(host, 25)
# smtp.set_debuglevel(True)
# smtp.ehlo()
smtp.starttls()
# smtp.ehlo()
status = smtp.login(username, password)
print 'status', status
smtp.sendmail(sender, receiver, msg.as_string())
原先用smtplib.SMTP_SSL(host, 25),无论如何都不行。yahoo也是无论如何都不行,无论是用 SSL还是不用SSL。 比yeah还要差些。
Python中发邮件(明文/SSL/TLS三种方式)
#!/usr/bin/python
# coding:utf-8
import smtplib
from email.MIMEText import MIMEText
from email.Utils import formatdate
from email.Header import Header
import sys
#设置默认字符集为UTF8 不然有些时候转码会出问题
default_encoding = 'utf-8'
if sys.getdefaultencoding() != default_encoding:
reload(sys)
sys.setdefaultencoding(default_encoding)
#发送邮件的相关信息,根据你实际情况填写
smtpHost = 'smtp.126.com'
smtpPort = '25'
sslPort = '587'
fromMail = 'zhangsan@126.com'
toMail = 'funame@126.com'
username = 'zhangsan'
password = '123456'
#邮件标题和内容
subject = u'[Notice]hello'
body = u'hello,this is a mail from ' + fromMail
#初始化邮件
encoding = 'utf-8'
mail = MIMEText(body.encode(encoding),'plain',encoding)
mail['Subject'] = Header(subject,encoding)
mail['From'] = fromMail
mail['To'] = toMail
mail['Date'] = formatdate()
try:
#连接smtp服务器,明文/SSL/TLS三种方式,根据你使用的SMTP支持情况选择一种
#普通方式,通信过程不加密
smtp = smtplib.SMTP(smtpHost,smtpPort)
smtp.ehlo()
smtp.login(username,password)
#tls加密方式,通信过程加密,邮件数据安全,使用正常的smtp端口
#smtp = smtplib.SMTP(smtpHost,smtpPort)
#smtp.set_debuglevel(True)
#smtp.ehlo()
#smtp.starttls()
#smtp.ehlo()
#smtp.login(username,password)
#纯粹的ssl加密方式,通信过程加密,邮件数据安全
#smtp = smtplib.SMTP_SSL(smtpHost,sslPort)
#smtp.ehlo()
#smtp.login(username,password)
#发送邮件
smtp.sendmail(fromMail,toMail,mail.as_string())
smtp.close()
print 'OK'
except Exception as e:
print e
各种元素都包含的邮件
#!/usr/bin/env python3
#coding: utf-8
import smtplib
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from email.mime.image import MIMEImage
sender = 'xxxx@163.com'
receiver = 'xxxx@126.com'
subject = '这是邮件主题'
smtpserver = 'smtp.163.com'
username = 'xxxx@163.com'
password = '****'
# Create message container - the correct MIME type is multipart/alternative.
msg = MIMEMultipart('alternative')
msg['Subject'] = subject
msg['From'] = sender
msg['To'] = receiver
# Create the body of the message (a plain-text and an HTML version).
text = "Hi!\nHow are you?\nHere is the link you wanted:\nhttp://www.python.org"
html = """\
<html>
<head></head>
<body>
<p>Hi!<br>
How are you?<br>
Here is the <a href="http://www.python.org">link</a> you wanted.
</p>
</body>
</html>
"""
# Record the MIME types of both parts - text/plain and text/html.
part1 = MIMEText(text, 'plain')
part2 = MIMEText(html, 'html')
# Attach parts into message container.
# According to RFC 2046, the last part of a multipart message, in this case
# the HTML message, is best and preferred.
msg.attach(part1)
msg.attach(part2)
#构造附件
att = MIMEText(open('h:\\python\\1.jpg', 'rb').read(), 'base64', 'utf-8')
att["Content-Type"] = 'application/octet-stream'
att["Content-Disposition"] = 'attachment; filename="1.jpg"'
msg.attach(att)
if __name__=='__main__':
smtp = smtplib.SMTP()
smtp.connect('smtp.163.com')
smtp.login(username, password)
smtp.sendmail(sender, receiver, msg.as_string())
smtp.quit()
群发邮件技巧:
# 实践发现需要将msg['To'] = receiver修改为以下形式
msg["To"] = ",".join(receiver)
receiver是收件人列表。
用outlook邮箱发送(仅在windows下有效)
同事写的代码,
#coding=utf-8
import warnings
import os
import sys
import lib.util as util
import platform
if not platform.system() == 'Linux':
import win32com.client as win32
import pythoncom
reload(sys)
sys.setdefaultencoding('utf8')
warnings.filterwarnings('ignore')
DEFAULT_TEMPLATE = os.path.join(os.path.dirname(os.path.dirname(__file__)), "data","result","report.html")
def sendmail():
print "mail_file = " + DEFAULT_TEMPLATE
receiver = util.get_mail_conf("recevicer")
htmlfile = open(DEFAULT_TEMPLATE)
sub="Test Report"
htmlbody = htmlfile.read()
outlook = win32.Dispatch('outlook.application')
mail = outlook.CreateItem(0)
mail.BodyFormat = 2
mail.To = receiver
mail.Subject = sub.decode('utf-8')
mail.HTMLBody = htmlbody.decode("utf-8")
mail.Attachments.Add(DEFAULT_TEMPLATE)
mail.Send()
exchangelib应该是windows和Linux都能用的,但我发送失败了。尝试解决但失败了,原因不明。