发送email ======== 使用python发送邮件。 思路 ----- 申请邮箱,发送邮件python代码,生成exe 依赖 ----- - python3 - smtplib(邮箱模块) - argparse(命令行解析) - pyinstaller(生成windows平台的exe) 代码 ----- ``` #!/usr/bin/python3 import smtplib from email.mime.text import MIMEText from email.header import Header import argparse def send_mail(mail_host, mail_user, mail_pass, sender, receiver, subject, contents): """ 发送邮件 :param mail_host: smtp地址,例如smtp.139.com :param mail_user: 用户名 :param mail_pass: 邮箱密码 :param sender: 发送人,例如xxx@139.com :param receiver: 接收人,例如xxx@139.com :param subject: 主题 :param contents: 内容 :return: 是否发送成功 """ mail_user = str(mail_user) mail_pass = str(mail_pass) subject = str(subject) contents = str(contents) message = MIMEText(contents, 'plain', 'utf-8') message['From'] = Header(sender, 'utf-8') message['To'] = Header(receiver, 'utf-8') message['Subject'] = Header(subject, 'utf-8') try: smtp_obj = smtplib.SMTP() smtp_obj.connect(mail_host, 25) # 25 为 SMTP 端口号 smtp_obj.login(mail_user, mail_pass) smtp_obj.sendmail(sender, receiver, message.as_string()) print('Send Success') return True except smtplib.SMTPException: print('Send False') return False if __name__ == '__main__': parser = argparse.ArgumentParser(description='发送邮件') parser.add_argument('--mail_host', help='smtp地址,例如smtp.139.com', type=str) parser.add_argument('--mail_user', help='用户名', type=str) parser.add_argument('--mail_pass', help='邮箱密码', type=str) parser.add_argument('--sender', help='发送人,例如xxx@139.com', type=str) parser.add_argument('--receiver', help='接收人,例如xxx@139.com', type=str) parser.add_argument('--subject', help='主题', type=str) parser.add_argument('--contents', help='内容', type=str) args = parser.parse_args() send_mail(args.mail_host, args.mail_user, args.mail_pass, args.sender, args.receiver, args.subject, args.contents) ``` 编译 ---- ``` C:\Anaconda3\Scripts>pyinstaller.exe -F -c send_email.py ``` -F作用是生成的exe不需要其他依赖。 最后生成send_email.exe 使用 ---- ``` C:\Anaconda3\Scripts\dist>send_email.exe --help ``` 可以得到帮助 其他问题 -------- 如果使用fire模块解析命令行参数,pyinstaller编译出来的exe特别大200MB+。故使用argparse。 中文乱码问题。如果使用批处理调用send_email且批处理包含中文,批处理文件的格式应该改为ANSI格式。 有时不在常用地登陆139邮箱需要验证。需要在该个地方用电脑或者手机登陆过后,再运行该程序。