• python发送邮件心得体会


    利用本地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!
    How are you?
    Here is the link you wanted:
    http://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都能用的,但我发送失败了。尝试解决但失败了,原因不明。

  • 相关阅读:
    jQueryrocket
    jQueryrocket
    jQueryrocket
    jQueryrocket
    jQueryrocket
    SharePoint 2013 Workflow Manager 1.0 卸载
    SharePoint 2013 Workflow Manager 1.0 远程服务器返回错误: (400) 错误的请求。 不支持查询字符串中的 api-version
    SharePoint 2010 使用Install-SPSolution部署wsp包状态一直是”正在部署”
    SharePoint 2010管理中心服务器提示“需要升级”
    SharePoint 2010:“&”作为SharePoint账号密码引起的错误
  • 原文地址:https://www.cnblogs.com/tangxiaosheng/p/10752020.html
Copyright © 2020-2023  润新知