zoukankan      html  css  js  c++  java
  • smtp outlook邮件发送非授权码模式

    1.起因:send fail SMTP AUTH extension not supported by server. 使用端口25 和587均失效出现此问题

    首先前往outlook修改设置pop和IMAP开启,允许第三方调用:https://outlook.live.com/owa/?path=/options/popandimap

    【在使用QQ邮箱IOS端的APP添加outlook邮箱时,显示IMAP没有开启】是否意指当您在iOS手机设备中进行配置微软帐户至第三方域名邮箱(QQ邮箱)时,

    系统提示Outlook邮箱中的IMAP并未开启?

    1. 请您前往网页版Outlook邮箱的【POP和IMAP】;
    2. 接着,请您在【POP选项】选择【是】;
    3. 在【使用POP的设备和应用可以设置为删除重Outlook下载的邮件】中,我们建议您点选【不允许设备和应用删除来自Outlook的邮件。它会将邮件移动到特殊的POP文件夹】,这是为了防止您的邮件丢失的情况;
    4. 请完成以上步骤后,单击【保存】即可。

    查询原因:版本使用python3.7,官网做出如下变动:server_hostname cannot be an empty string or start with a leading dot.

    也就是说现在对于3.7需要对非ssl模式传入smtp server对象传入str模式的host地址再进行server对象创建连接

    或者:

    在github有人曾给出如下修复针对ssl,非ssl

    https://github.com/tp4a/teleport/commit/dea9c48d825e7bac5bbc41006bc993713e4b516f

    尝试修复:服务器不支持SMTP AUTH扩展。

     最终及解决代码如下:

    #!/usr/bin/python3
    import os
    import smtplib
    from email.mime.text import MIMEText
    from email.mime.multipart import MIMEMultipart
    from email.header import Header
    from email.mime.image import MIMEImage
    
    def main():
    
        sender='chen1054@outlook.com'
        receiverList=['chen1054@outlook.com']
        user='chen1054@outlook.com'
        emailPwd='youroutlookpwd'#用户邮箱密码无需开通授权码
        smtpServer=r'smtp-mail.outlook.com'
        commonPort=587 # 25也有效
        emailTitle='Hello,World!'
        htmlPath=r'F:/eclipse/readme/readme_eclipse.html'
        attachPathList=[r'C:\Users\Administrator\PycharmProjects\Supro\src\logs\Info\20190330.log',r'C:\Users\Administrator\PycharmProjects\Supro\src\logs\Info\testpc.png']
        emailChanel(sender,receiverList,user,emailPwd,smtpServer,commonPort,emailTitle,htmlPath,attachPathList)
    
    
    def emailChanel(sender,receiverList,user,emailPwd,smtpServer,commonPort,emailTitle,htmlPath=None,attachPathList=None):
        multiPart=MIMEMultipart()
        multiPart['From']=sender
        multiPart['To']=','.join(receiverList)
        subject=emailTitle
        multiPart['Subject']=Header(subject,"utf-8")
        if os.path.isfile(htmlPath):
            if os.path.exists(htmlPath):
                pass
            else:
                raise IOError("htmlPath not exist")
        else:
            raise IOError("html path is not file..")
        emailBody=MIMEText(_text=open(htmlPath,'rb').read(),_subtype='html',_charset="utf-8")
        multiPart.attach(emailBody)
        if isinstance(attachPathList,list):
                for attachPath in attachPathList:
                    if os.path.exists(attachPath):
                        pass
                    else:
                        raise  IOError("attachPath not exist")
        else:
            raise TypeError("expected type is list,but get {}".format(type(attachPathList).__name__))
        for attachPath in attachPathList:
            if os.path.splitext(attachPath)[-1]==".log":
                attach=MIMEText(open(attachPath, 'rb').read(), 'base64', 'utf-8')
                attach["Content-Type"] = 'application/octet-stream'
                attach["Content-Disposition"] = 'attachment; filename="dailyLog.log"' # filename not strict
                multiPart.attach(attach)
            if os.path.splitext(attachPath)[-1]==".png":
                fp = open(attachPath, 'rb')
                msgImage = MIMEImage(fp.read(),_subtype='octet-stream')
                fp.close()
                msgImage.add_header('Content-Disposition', 'attachment', filename="attach.png")
                multiPart.attach(msgImage)
        # https://github.com/tp4a/teleport/commit/dea9c48d825e7bac5bbc41006bc993713e4b516f
        smtp=smtplib.SMTP("{}:{}".format(smtpServer,commonPort))
        try:
            smtp.ehlo()
            smtp.starttls()
            smtp.login(user,emailPwd)
            smtp.sendmail(sender,receiverList,multiPart.as_string())
        except smtplib.SMTPException as e:
            print("send fail",e)
        else:
            print("success")
        finally:
            try:
                smtp.quit()
            except smtplib.SMTPException:
                print("quit fail")
            else:
                print("quit success")
    if __name__ == '__main__':
        main()
    

      

     如果你对上面问题还有疑问可以加群咨询我:

  • 相关阅读:
    兴趣标签体系告诉我,闲鱼的95后是这样的...
    重磅报告 | 《中国企业2020:人工智能应用实践与趋势》
    this指针和类的继承 C++快速入门16
    构造器和析构器 C++快速入门15
    构造器和析构器 C++快速入门15
    鱼油账号记录程序(续) 零基础入门学习Delphi39
    鱼C扫描器 零基础入门学习Delphi40
    鱼油账号记录程序(续) 零基础入门学习Delphi39
    PEInfo编程思路讲解02 工具篇02|解密系列
    PEInfo编程思路讲解02 工具篇02|解密系列
  • 原文地址:https://www.cnblogs.com/SunshineKimi/p/10629368.html
Copyright © 2011-2022 走看看