Python 使用 smtp ssl 模式 发送邮件与附件

 

参考 :
        发送邮件简单入门 ( 以qq邮箱,163邮箱为例 ) :https://blog.csdn.net/qq_38661599/article/details/81013834
        smtp ssl 模式 发送邮件 与 附件:https://www.cnblogs.com/SunshineKimi/p/10629342.html
        Python3 使用 SMTP 发送带附件邮件:https://www.jb51.net/article/142231.htm

还可以使用 scrapy.mail 模块发送邮件:https://blog.csdn.net/you_are_my_dream/article/details/60868329

 

把代码中这个几设置成你自己的参数:

self._smtp_host = "smtp.mxhichina.com"    # 设置 服务器
self._smtp_port = 465                     # 设置 端口
self._email_address = "xxxxxxxx@xxx.com"  # 用户名
self._email_password = "xxxxxxxxxxxxxxx"  # 口令

完整代码( send_email_attach.py )

# -*- coding: utf-8 -*-
# @Author  : 
# @File    : temp.py
# @Software: PyCharm
# @description : XXX


import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
import optparse


class SendEmail(object):

    def __init__(self):
        super(SendEmail, self).__init__()

        # 第三方 SMTP 服务
        self._smtp_host = "smtp.mxhichina.com"  # 设置 服务器
        self._smtp_port = 465                   # 设置 端口

        # 默认的发送邮件的邮箱地址和密码。
        # 当没有传递发送者的邮箱地址和密码时,使用默认的邮箱地址和密码发送
        self._email_address = "xxxxxxxx@xxx.com"  # 用户名
        self._email_password = "xxxxxxxxxxxxxxx"     # 口令

        self.frm = None
        self.pwd = None
        self.to = None
        self.email_title = None
        self.email_content = None
        self.attach_path = None
        self.attach_path_list = None
        pass

    def set_args(self, frm=None, pwd=None, to=None, email_title=None, email_content=None, attach_path=None):
        """
            设置参数
        :param frm: 发送者邮箱地址
        :param pwd: 发送者邮箱密码
        :param to:  接收者邮箱地址,多个接收者时以逗号','分割
        :param email_title:  邮件标题
        :param email_content:邮件内容
        :param attach_path:  附件路径,多个附件时以逗号','分割
        :return:
        """
        if frm:
            self.frm = frm
            if not pwd:
                raise Exception('设置邮箱密码')
            else:
                self.pwd = pwd
        else:
            self.frm = self._email_address
            self.pwd = self._email_password
        self.to = to
        self.email_title = email_title
        self.email_content = email_content
        self.attach_path = attach_path

        # 把逗号分割的附件路径变成 list
        if self.attach_path is not None:
            self.attach_path_list = self.attach_path if ',' not in self.attach_path else self.attach_path.split(',')

    def send_email(self):
        multi_part = MIMEMultipart()
        multi_part['From'] = self.frm
        multi_part['To'] = self.to
        multi_part['Subject'] = Header(self.email_title, "utf-8")

        # 添加 邮件 内容
        msg = self.email_content
        email_body = MIMEText(msg, 'plain', 'utf-8')
        multi_part.attach(email_body)

        # 添加附件
        if isinstance(self.attach_path_list, str):
            # 只有一个附件
            attach = MIMEText(open(self.attach_path, 'rb').read(), 'base64', 'utf-8')
            attach["Content-Type"] = 'application/octet-stream'

            # filename not strict
            attach_file_name = self.attach_path_list.split('/')[-1]
            attach["Content-Disposition"] = 'attachment; filename="{0}"'.format(attach_file_name)
            multi_part.attach(attach)
        elif isinstance(self.attach_path_list, list):
            # 多个附件
            for item in self.attach_path_list:
                attach = MIMEText(open(item, 'rb').read(), 'base64', 'utf-8')
                attach["Content-Type"] = 'application/octet-stream'

                # filename not strict
                attach_file_name = item.split('/')[-1]
                attach["Content-Disposition"] = 'attachment; filename="{0}"'.format(attach_file_name)
                multi_part.attach(attach)

        # ssl 协议安全发送
        smtp_server = smtplib.SMTP_SSL(host=self._smtp_host, port=self._smtp_port)
        try:
            smtp_server.login(self.frm, self.pwd)
            smtp_server.sendmail(self.frm, self.to, multi_part.as_string())
        except smtplib.SMTPException as e:
            print("send fail", e)
        else:
            print("send success")
        finally:
            try:
                smtp_server.quit()
            except smtplib.SMTPException:
                print("quit fail")
            else:
                print("quit success")


if __name__ == '__main__':
    parse = optparse.OptionParser(
        usage='"usage : %prog [options] arg1,arg2"', version="%prog 1.2"
    )
    parse.add_option(
        '-t', '--to', dest='to', action='store', type=str, metavar='to',
        help='接收者的邮箱地址, 多个接收者时以逗号 "," 分隔'
    )
    parse.add_option(
        '-f', '--from', dest='frm', type=str, metavar='from',
        help='发送者的邮箱地址'
    )
    parse.add_option(
        '-p', '--pwd', dest='pwd', type=str, metavar='pwd',
        help='发送者的邮箱密码'
    )
    parse.add_option(
        '-T', '--title', dest='email_title', type=str, metavar='title',
        help='邮件标题'
    )
    parse.add_option(
        '-C', '--content', dest='email_content', type=str, metavar='content',
        help='邮件内容'
    )
    parse.add_option(
        '-A', '--attach', dest='attach_path', type=str, metavar='attach',
        help='邮件的附件路径, 多个附件时以逗号 "," 分隔'
    )
    parse.add_option('-v', help='help')

    options, args = parse.parse_args()

    temp_send = SendEmail()
    temp_send.set_args(
        frm=options.frm, pwd=options.pwd, to=options.to,
        email_title=options.email_title,
        email_content=options.email_content,
        attach_path=options.attach_path
    )
    temp_send.send_email()

可以执行 :python3 send_email_attach.py -h 查看帮助

发送邮件:

邮箱截图

 

 

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
//初始化邮件类 void InitEmail(C01waSendMail* m_globalEmail,String sendermail,String sender,String senderpwd,String srv,int port = 25,bool bSsl = false) { m_globalEmail->m_Auth = CPJNSMTPConnection::AuthenticationMethod::AUTH_AUTO; m_globalEmail->m_bAutoDial = true; m_globalEmail->m_bSSL = bSsl; m_globalEmail->m_sUsername = sender.c_str(); m_globalEmail->m_sAddress = sendermail.c_str(); m_globalEmail->m_sPassword = senderpwd.c_str(); m_globalEmail->m_sHost = srv.c_str(); m_globalEmail->m_nPort = port; m_globalEmail->m_sEncodingFriendly = _T("Chinese Simplified (GB2312)"); m_globalEmail->m_sEncodingCharset = _T("gb2312"); m_globalEmail->m_bMime = 1; m_globalEmail->m_bHTML = 1; m_globalEmail->m_Priority = CPJNSMTPMessage::PRIORITY::NormalPriority; m_globalEmail->m_bDSN = FALSE; m_globalEmail->m_bDSNSuccess = FALSE; m_globalEmail->m_bDSNFailure = FALSE; m_globalEmail->m_bDSNDelay = FALSE; m_globalEmail->m_bDSNHeaders = FALSE; m_globalEmail->m_bDNSLookup = FALSE; } //发送邮件 void SendEmail(const char* recvemail,const char* subject,const char* body,const char * sCC=NULL,const char * bCC = NULL,const char * attach = NULL) { //初始化邮箱 //注意释放内存 C01waSendMail *m_globalEmail = new C01waSendMail; if(strlen(m_con1.m_eamil)>0&&strlen(m_con1.m_pwd)&&strlen(m_con1.m_smtpsrv)&&m_con1.port>0) { char * p = strdup(m_con1.m_eamil); char * pp = strstr(p,"@"); if(pp>0) pp[0] = '\0'; InitEmail(m_globalEmail,m_con1.m_eamil,p,m_con1.m_pwd,m_con1.m_smtpsrv,m_con1.port,m_con1.ssl); free(p); if(subject>0) m_globalEmail->m_sSubject.Format("%s",subject); if(sCC>0) m_globalEmail->m_sCC.Format("%s",sCC); if(bCC>0) m_globalEmail->m_sBCC.Format("%s",bCC); if(body>0) m_globalEmail->m_sBody.Format("%s",body); if(attach>0) m_globalEmail->m_sFile.Format("%s",attach); if(recvemail>0) m_globalEmail->m_sTo.Format("%s",recvemail); m_globalEmail->SendEmail(); } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值