用python发带附件的邮件用来定时备份mysql数据库
最近迁移了wordpress,系统升级为CentOS 6,很奇怪的一个问题,在原来CentOS 5.8下用的很正常的定时备份数据库并通过邮件发送的脚本不能发送附件,其他都正常,邮件内容也是uuencode生成的文件编码,但是就是不产生附件.而且找不出原因,望有知道的不吝赐教. 为了解
最近迁移了wordpress,系统升级为CentOS 6,很奇怪的一个问题,在原来CentOS 5.8下用的很正常的定时备份数据库并通过邮件发送的脚本不能发送附件,其他都正常,邮件内容也是uuencode生成的文件编码,但是就是不产生附件.而且找不出原因,望有知道的不吝赐教.
为了解决这一问题,我用Python写了一个mail客户端,可以发送附件,是一个命令行程序.废话不多说.贴代码:
#!/usr/bin/env python #-*- coding: utf8 -*- ''' #============================================================================= # FileName: mail.py # Desc: To send email # Author: cold # Email: wh_linux@126.com # HomePage: http://www.linuxzen.com # Version: 0.0.1 # LastChange: 2012-04-21 16:37:20 # History: #============================================================================= ''' ''' 用于发送邮件,可以发送附件 命令行程序 ''' import smtplib from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart import sys # 打印帮助信息 def helpinfo(): print ''' Useage: pymail -u user@domain -p passwd -h smtp server host -t to who [-a attachment file path] [-n attachment name] Useage: email content use . to end -h specify smtp server host -u which user you login the smtp server,and must with it domain -p the password of the smtp user -t The email recipient,multiple addresses can use ',' split -a Add attachment -n Secify attachment name in the email Author:cold(wh_linux@126.com) Homepge:http://www.linuxzen.com ''' # 所有选项 options = ['-t', '-a', '-n', '-h', '-u', '-p', '-s'] # 获取选项长度 argvnum = len(sys.argv) # 检测命令行参数 for i in range(argvnum): if ( i %2 != 0): if (sys.argv[i] not in options): print 'Unknow option ', sys.argv[i] , ', Please use -h see help!' sys.exit(3) # 如果是-h或者没有命令行参数则显示帮助 try: if sys.argv[1] == '-h' or len(sys.argv) == 0: helpinfo() except: helpinfo() # 检测-n参数 if ('-n' in sys.argv) and ('-a' not in sys.argv): print 'Error:option "-n" must use after -a' sys.exit(2) # 下面则是获取各个参数内容 try: tmpmailto = sys.argv[sys.argv.index('-t') + 1] if ',' in tmpmailto: mailto = tmpmailto.split(',') else: mailto = [tmpmailto,] except ValueError: print 'Error: need Mail Recipient' sys.exit(1) haveattr=True try: attrpath = sys.argv[sys.argv.index('-a') + 1] try: attrname = sys.argv[sys.argv.index('-n') +1 ] except ValueError: attrname = attrpath.split('/')[-1] except: attrname = None haveattr = False attrpath = None try: mail_host = sys.argv[sys.argv.index('-h') +1] except ValueError: print 'Waring: No specify smtp server use 127.0.0.1' mail_host = '127.0.0.1' try: mail_useremail = sys.argv[sys.argv.index('-u') +1] except ValueError: print 'Waring: No specify user, use root' mail_useremail = 'root@localhost' try: mail_sub = sys.argv[sys.argv.index('-s') + 1] except: mail_sub = 'No Subject' mail_user = mail_useremail.split('@')[0] mail_postfix = mail_useremail.split('@')[1] try: mail_pass = sys.argv[sys.argv.index('-p') +1] except ValueError: mail_pass = '' # 定义邮件发送函数 def send_mail(to_list, sub, content, haveattr, attrpath, attrname): me = mail_user + "" # 判断是否有附件 if (haveattr): if (not attrpath): print 'Error : no input file of attachments' return False # 有附件则创建一个带附件的实例 msg = MIMEMultipart() # 构造附件 att = MIMEText(open(attrpath, 'rb').read(),'base64', 'utf8') att["Content-Type"] = 'application/octest-stream' att["Content-Disposition"] = 'attachment;filename="'+ attrname +'"' msg.attach(att) msg.attach(MIMEText(content)) else: # 无责创建一个文本的实例 msg = MIMEText(content) # 邮件头 msg['Subject'] = sub msg['From'] = me msg['To'] = ";".join(to_list) try: # 发送邮件 s = smtplib.SMTP() s.connect(mail_host) if (mail_host != '127.0.0.1'): s.login(mail_user, mail_pass) s.sendmail(me, to_list, msg.as_string()) s.close() return True except Exception, e: print str(e) return False if __name__ == '__main__': try: content = '' while True: c = raw_input('') if c == '.': break content += c + '\n' except EOFError: for line in sys.stdin: content += line if send_mail(mailto, mail_sub, content, haveattr, attrpath, attrname): print "Success" else: print "Failed"
将这个脚本保存为pymail放到/usr/bin/下,并赋予其执行权限:
chmod +x /usr/bin/pymail
可以使用 -h指定smtp发件服务器,默认认为指定-h需要认证, 所以就需要smtp服务器支持认证,同时需要-u指定用户名(需加"@域名"),-p指定密码. 如果不指定-h就会使用本地smtp服务器,默认不需要认证,所以本地的smtp服务器就不能支持认证,同时不需指定-u,-p参数
-t 指定收件人多个可用,号分割. -a 指定附件路径 -n 指定附件名(可省略) -h 显示帮助信息. -s 指定邮件主题
执行后会要求输入邮件内容,写完用.结束 也可以用管道下面给出几个实例:
#使用本地smtp服务发送 echo 'linuxzen.com backup' | pymail -s "Linuxzen backup" -t 123456@qq.com -a /tmp/linuxzen.tar.gz # 使用126邮箱发送 echo 'linuxzen.com backup' | pymail -u linuxzen@126.com -p linuxzen.com -h smtp.126.com -s 'Linuxzen backup " -t 123456@qq.com -a /tmp/linuxzen.tar.gz # 不使用管道发送 pymail -u linuxzen@126.com -p linuxzen.com -h smtp.126.com -s 'hello world' -t 123456@qq.com -a /tmp/linuxzen.tar.gz Hello this is a test mail .
下面之前使用的mysql定时备份的脚本:
#!/bin/bash export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin DATE=`date +%Y%m%d` mysqldump -u root blogdata > /tmp/blogdate."$DATE".sql cd /tmp tar -zcf blogdata."$DATE".sql.tar.gz blogdata."$DATE".sql uuencode blogdata."$DATE".sql.tar.gz blogdata."$DATE".sql.tar.gz | mail -s 'MySQL Backup' 123456@qq.com
没有命令uuencode安装sharutils包即可
yum -y install sharutils
然后使用crontab调用这个脚本定时执行,前面说了 这个脚本在CentOS5.x下正常工作,但是放到CentOS6下就不带附件,所以使用我们自己编写的python脚本脚本内容如下:
#!/bin/bash export PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin DATE=`date +%Y%m%d` mysqldump -u root blogdata > /tmp/myblog."$DATE".sql cd /tmp tar -zcf blogdata."$DATE".sql.tar.gz myblog."$DATE".sql echo 'MySQL backup' | pymail -u linuzen@126.com -p linuxzen.com -h smtp.126.com -s 'MySQL backup' -a /tmp/blogdata."$DATE".sql.tar.gz -t 123456@qq.com
我们使用126邮箱来发送 这样就可以把自带的sendmail 停掉:
service sendmail stop chkonfig --del sendmail
原文地址:用python发带附件的邮件用来定时备份mysql数据库, 感谢原作者分享。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

ルートとしてMySQLにログインできない主な理由は、許可の問題、構成ファイルエラー、一貫性のないパスワード、ソケットファイルの問題、またはファイアウォール傍受です。解決策には、構成ファイルのBind-Addressパラメーターが正しく構成されているかどうかを確認します。ルートユーザー許可が変更されているか削除されてリセットされているかを確認します。ケースや特殊文字を含むパスワードが正確であることを確認します。ソケットファイルの許可設定とパスを確認します。ファイアウォールがMySQLサーバーへの接続をブロックすることを確認します。

データ統合の簡素化:AmazonrdsmysqlとRedshiftのゼロETL統合効率的なデータ統合は、データ駆動型組織の中心にあります。従来のETL(抽出、変換、負荷)プロセスは、特にデータベース(AmazonrdsmysQlなど)をデータウェアハウス(Redshiftなど)と統合する場合、複雑で時間がかかります。ただし、AWSは、この状況を完全に変えたゼロETL統合ソリューションを提供し、RDSMYSQLからRedshiftへのデータ移行のための簡略化されたほぼリアルタイムソリューションを提供します。この記事では、RDSMysQl Zero ETLのRedshiftとの統合に飛び込み、それがどのように機能するか、それがデータエンジニアと開発者にもたらす利点を説明します。

1.正しいインデックスを使用して、データの量を削減してデータ検索をスピードアップしました。テーブルの列を複数回検索する場合は、その列のインデックスを作成します。あなたまたはあなたのアプリが基準に従って複数の列からのデータが必要な場合、複合インデックス2を作成します2。選択した列のみを避けます。必要な列のすべてを選択すると、より多くのサーバーメモリを使用する場合にのみサーバーが遅くなり、たとえばテーブルにはcreated_atやupdated_atやupdated_atなどの列が含まれます。

MySQLは、複数の同時接続を処理し、マルチスレッド/マルチプロセスを使用して、各クライアントのリクエストに独立した実行環境を割り当てて、邪魔されないことを確認できます。ただし、同時接続の数は、システムリソース、MySQL構成、クエリパフォーマンス、ストレージエンジン、ネットワーク環境の影響を受けます。最適化では、コードレベル(効率的なSQLの書き込み)、構成レベル(MAX_Connectionの調整)、ハードウェアレベル(サーバー構成の改善)などの多くの要因を考慮する必要があります。

MySQLがテーブル構造を変更すると、メタデータロックが通常使用され、テーブルがロックされる可能性があります。ロックの影響を減らすために、次の測定値をとることができます。1。オンラインDDLでテーブルを使用できます。 2。バッチで複雑な変更を実行します。 3.小規模またはオフピーク期間中に操作します。 4. PT-OSCツールを使用して、より細かい制御を実現します。

MySQLはAndroidで直接実行できませんが、次の方法を使用して間接的に実装できます。Androidシステムに構築されたLightWeight Database SQLiteを使用して、別のサーバーを必要とせず、モバイルデバイスアプリケーションに非常に適したリソース使用量が少ない。 MySQLサーバーにリモートで接続し、データの読み取りと書き込みのためにネットワークを介してリモートサーバー上のMySQLデータベースに接続しますが、強力なネットワーク依存関係、セキュリティの問題、サーバーコストなどの短所があります。

MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。
