├── Send2SN ├── mail_setting.c ├── renren_setting.c ├── send2sn.h ├── about.c ├── Makefile ├── mail.py ├── README ├── renren.py ├── main_window.c └── send2sn.c /Send2SN: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mthli/Send2SN/master/Send2SN -------------------------------------------------------------------------------- /mail_setting.c: -------------------------------------------------------------------------------- 1 | #include "send2sn.h" 2 | 3 | void mail_setting(GtkWidget *widget, gpointer parents) 4 | { 5 | system("kwrite mail.py"); 6 | } 7 | -------------------------------------------------------------------------------- /renren_setting.c: -------------------------------------------------------------------------------- 1 | #include "send2sn.h" 2 | 3 | void renren_setting(GtkWidget *widget, gpointer parents) 4 | { 5 | system("kwrite renren.py"); 6 | } 7 | -------------------------------------------------------------------------------- /send2sn.h: -------------------------------------------------------------------------------- 1 | #ifndef __SEND2SN__ 2 | #define __SEND2SN__ 3 | 4 | #include 5 | #include 6 | #include 7 | #include 8 | 9 | typedef struct _Item { 10 | GtkWidget *mail_button; 11 | GtkWidget *weixin_button; 12 | GtkWidget *renren_button; 13 | GtkTextBuffer *buffer; 14 | } 15 | Item; 16 | 17 | #endif 18 | -------------------------------------------------------------------------------- /about.c: -------------------------------------------------------------------------------- 1 | #include "send2sn.h" 2 | 3 | void about(GtkWidget *widget, gpointer parents) 4 | { 5 | GtkWidget *dialog; 6 | 7 | dialog = gtk_about_dialog_new(); 8 | gtk_about_dialog_set_name(GTK_ABOUT_DIALOG(dialog), "Send2SN"); 9 | gtk_about_dialog_set_version(GTK_ABOUT_DIALOG(dialog), "0.9"); 10 | gtk_about_dialog_set_copyright(GTK_ABOUT_DIALOG(dialog), "(c) Matthew Lee"); 11 | gtk_about_dialog_set_comments(GTK_ABOUT_DIALOG(dialog), 12 | "Send2SN是一款简易的班级信息推送应用,可以将班级信息发送至班级成员邮箱、微信公众平台和人人网。\n采用GTK+2.24、C语言以及Python2开发。\n请参考以下网址配置程序。"); 13 | gtk_about_dialog_set_website(GTK_ABOUT_DIALOG(dialog), 14 | "https://github.com/newmlee/Send2SN"); 15 | 16 | gtk_dialog_run(GTK_DIALOG(dialog)); 17 | gtk_widget_destroy(dialog); 18 | } 19 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | Send2SN: main_window.o \ 2 | mail_setting.o \ 3 | renren_setting.o \ 4 | about.o \ 5 | send2sn.o 6 | gcc -o Send2SN \ 7 | main_window.o \ 8 | mail_setting.o \ 9 | renren_setting.o \ 10 | about.o \ 11 | send2sn.o \ 12 | `pkg-config --cflags --libs gtk+-2.0` 13 | main_window.o: main_window.c send2sn.h 14 | gcc -c main_window.c `pkg-config --cflags --libs gtk+-2.0` 15 | mail_setting.o: mail_setting.c send2sn.h 16 | gcc -c mail_setting.c `pkg-config --cflags --libs gtk+-2.0` 17 | renren_setting.o: renren_setting.c send2sn.h 18 | gcc -c renren_setting.c `pkg-config --cflags --libs gtk+-2.0` 19 | about.o: about.c send2sn.h 20 | gcc -c about.c `pkg-config --cflags --libs gtk+-2.0` 21 | send2sn.o: send2sn.c send2sn.h 22 | gcc -c send2sn.c `pkg-config --cflags --libs gtk+-2.0` 23 | 24 | clean: 25 | rm main_window.o \ 26 | mail_setting.o \ 27 | renren_setting.o \ 28 | about.o \ 29 | send2sn.o 30 | 31 | -------------------------------------------------------------------------------- /mail.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/python2 2 | # Filename: mail.py 3 | # Come from: https://github.com/levisantony/python_email 4 | # Coding: utf-8 5 | 6 | from smtplib import SMTP_SSL 7 | from email.header import Header 8 | from email.mime.text import MIMEText 9 | import datetime 10 | 11 | # Gmail is default mail sender's system. 12 | # If you want to use another mail system, see "menubar"-"help"-"guide" 13 | # sender = 'your mail count' 14 | # passwd = 'your mail password' 15 | # classid = 'your class number' 16 | sender = '' 17 | passwd = '' 18 | classid = '' 19 | 20 | # follow this form to add your receivers: 21 | # receivers = ( 22 | # 'aaaaaa@gmail.com', 23 | # 'bbbbbb@gmail.com', 24 | # ... 25 | # 'zzzzzz@gmail.com' 26 | # ) 27 | receivers = ( 28 | '', 29 | '' 30 | ) 31 | 32 | infile = open('message.txt') 33 | content = infile.read() 34 | content = content.rstrip() 35 | infile.close() 36 | message = MIMEText(content, _charset = 'utf-8') 37 | message['Subject'] = Header(classid + ' ' + str(datetime.datetime.now()) + ' Notice', 'utf-8') 38 | 39 | smtp = SMTP_SSL('smtp.gmail.com', 465, timeout = 10) 40 | 41 | try: 42 | smtp.login(sender, passwd) 43 | smtp.sendmail(sender, receivers, message.as_string()) 44 | finally: 45 | smtp.quit() 46 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | 班级信息推送小应用,可以将班级信息发送到班级成员的邮箱、微信公众平台和人人网。 2 | 采用GTK+2.24、C语言和Python2开发。 3 | 使用平台:Linux 4 | 5 | 2014.01.11 创立项目 6 | 2014.01.12 完成界面 7 | 2014.01.12 完成“群发邮件”部分和“人人网”部分 8 | 2014.01.13 基本完成 9 | 10 | 同时微信公众平台暂时不做。 11 | 12 | 本程序虽然是采用GTK+开发的,但却是在KDE桌面环境下编写的,所以我调用的是KDE的KWrite程序对一些配置文件进行编辑。如果在Gnome桌面环境或者其他桌面环境可以在mail_setting.c和renren_setting.c中修改kwrite为你的文件编辑器,当然这些文本编辑器必须能够从命令行直接启动。 13 | 另外本程序适当修改即可移植到Windows平台以及Mac平台,如有需要可自行修改。 14 | 15 | 邮箱设置: 16 | 1. 基本设置: 17 | 推荐使用Gmail,不推荐使用其他邮箱,如有需要请自行参考其他文档进行配置。 18 | 同时无论你是使用Gmail还是其他邮箱,都需要打开邮箱的SMTP功能,否则将发送失败。 19 | 2. 发信人设置: 20 | 1) 在sender = ''的两个单引号之间填写你的Gmail帐号, 21 | 比如你的Gmail是xxxxxx@gmail.com,我就应该这样填写: 22 | sender = 'xxxxxx@gmail.com' 23 | 2) 在passwd = ''的两个单引号之间填写你的Gmail密码, 24 | 比如你的密码是123456,你就应该这样填写: 25 | passwd = '123456' 26 | 3) 在classid = ''的两个单引号之间填写你的班级号, 27 | 比如你的班级号是031212,你就应该这样填写: 28 | classid = '031212' 29 | 3. 收信人设置: 30 | 在 31 | receivers = ( 32 | '', 33 | '' 34 | ) 35 | 的两个单引号之间添加你要发送到的邮箱帐号, 36 | 比如你有很多个帐号要填写,你就应该按照这样的格式设置: 37 | receivers = ( 38 | 'aaaaaa@gmail.com', 39 | 'bbbbbb@gmail.com', 40 | ... 41 | 'zzzzzz@gmail.com' 42 | ) 43 | 44 | 人人网设置: 45 | 同理,只需要在sender = ''和passwd = ''的两个单引号之间分别填上你的帐号和密码即可。 46 | -------------------------------------------------------------------------------- /renren.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/python2 2 | # Filename: renren.py 3 | # Come from: https://github.com/jsl9208/renrenStatus 4 | # Coding: utf-8 5 | 6 | import urllib 7 | import urllib2 8 | import re 9 | import cookielib 10 | 11 | # sender = 'your renren id' 12 | # passwd = 'your renren password' 13 | sender = '' 14 | passwd = '' 15 | 16 | def login(sender, passwd): 17 | data = {'email': sender, 'password': passwd} 18 | url_data = urllib.urlencode(data); 19 | cj = cookielib.CookieJar() 20 | handler = urllib2.HTTPCookieProcessor(cj) 21 | opener = urllib2.build_opener(handler) 22 | urllib2.install_opener(opener) 23 | res = opener.open('http://www.renren.com/ajaxLogin/login', url_data) 24 | res = opener.open('http://www.renren.com/home') 25 | html = res.read() 26 | uid = re.search("'ruid':'(\d+)'", html).group(1) 27 | return (opener, uid) 28 | 29 | def status(sender, passwd): 30 | l = login(sender, passwd) 31 | opener = l[0] 32 | uid = l[1] 33 | res = opener.open("http://www.renren.com/home") 34 | html = res.read() 35 | rt = re.search("requesttoken=(\S+)", html).group(1) 36 | rtk = re.search("get_check_x:'(\w+)'", html).group(1) 37 | infile = open('message.txt') 38 | message = infile.read() 39 | message = message.rstrip() 40 | infile.close() 41 | data = {"content": message, "hostid": uid, "requestToken": rt, "_rtk": rtk, "channel": "renren"} 42 | url_data = urllib.urlencode(data) 43 | res = opener.open("http://shell.renren.com/"+uid+"/status", url_data) 44 | 45 | status(sender, passwd) 46 | -------------------------------------------------------------------------------- /main_window.c: -------------------------------------------------------------------------------- 1 | #include "send2sn.h" 2 | 3 | /* 回调函数 */ 4 | void mail_setting(GtkWidget *widget, gpointer parents); 5 | void renren_setting(GtkWidget *widget, gpointer parents); 6 | void about(GtkWidget *widget, gpointer parents); 7 | void send2sn(GtkWidget *widget, Item *parents); 8 | 9 | int main(int argc, char **argv) 10 | { 11 | GtkWidget *main_window; 12 | 13 | GtkWidget *vbox; 14 | GtkWidget *hbox; 15 | 16 | GtkWidget *menubar, *menubar_item, *menu, *menu_item; 17 | 18 | GtkWidget *scrolled_window; 19 | GtkWidget *text_view; 20 | GtkWidget *ok_button; 21 | 22 | Item *item; 23 | item = (Item *)malloc(sizeof(Item)); 24 | 25 | gtk_init(&argc, &argv); 26 | 27 | /* 创建主窗口 */ 28 | main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); 29 | gtk_window_set_title(GTK_WINDOW(main_window), " Send2SN"); 30 | gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER); 31 | gtk_widget_set_size_request(GTK_WIDGET(main_window), 400, 240); 32 | /* 连接信号 */ 33 | g_signal_connect(G_OBJECT(main_window), "destroy", G_CALLBACK(gtk_main_quit), NULL); 34 | 35 | /* 创建菜单栏 */ 36 | menubar = gtk_menu_bar_new(); 37 | /* 创建“选项”菜单 */ 38 | menubar_item = gtk_menu_item_new_with_label("选项"); 39 | menu = gtk_menu_new(); 40 | menu_item = gtk_menu_item_new_with_label("邮箱设置"); 41 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 42 | g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(mail_setting), main_window); 43 | /* 暂时不做微信公众平台的选项 44 | * menu_item = gtk_menu_item_new_with_label("微信设置"); 45 | * gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 46 | * 注意添加相应的回调函数 47 | */ 48 | menu_item = gtk_menu_item_new_with_label("人人网设置"); 49 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 50 | g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(renren_setting), main_window); 51 | menu_item = gtk_separator_menu_item_new(); 52 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 53 | menu_item = gtk_menu_item_new_with_label("退出"); 54 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 55 | g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(gtk_main_quit), NULL); 56 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(menubar_item), menu); 57 | gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menubar_item); 58 | /* 创建“帮助”菜单 */ 59 | menubar_item = gtk_menu_item_new_with_label("帮助"); 60 | menu = gtk_menu_new(); 61 | menu_item = gtk_menu_item_new_with_label("指南"); 62 | g_signal_connect(G_OBJECT(menu_item), "activate", G_CALLBACK(about), main_window); 63 | gtk_menu_shell_append(GTK_MENU_SHELL(menu), menu_item); 64 | gtk_menu_item_set_submenu(GTK_MENU_ITEM(menubar_item), menu); 65 | gtk_menu_shell_append(GTK_MENU_SHELL(menubar), menubar_item); 66 | 67 | /* 创建主窗口框架 */ 68 | vbox = gtk_vbox_new(FALSE, 0); 69 | hbox = gtk_hbox_new(FALSE, 0); 70 | /* 将菜单栏和主体控件组装进vbox */ 71 | gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(menubar), 72 | FALSE, FALSE, 0); 73 | /* 创建text_view并获取其缓冲区 */ 74 | text_view = gtk_text_view_new(); 75 | (*item).buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(text_view)); 76 | /* 创建文本框部分 */ 77 | scrolled_window = gtk_scrolled_window_new(NULL, NULL); 78 | gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_window), 79 | GTK_POLICY_AUTOMATIC, 80 | GTK_POLICY_AUTOMATIC); 81 | gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(scrolled_window), 82 | text_view); 83 | /* 将scrolled_window放置于vbox之中 */ 84 | gtk_box_pack_start(GTK_BOX(vbox), scrolled_window, 85 | TRUE, TRUE, 0); 86 | /* 创建选项按钮 */ 87 | (*item).mail_button = gtk_check_button_new_with_label("群发邮件"); 88 | gtk_widget_set_size_request(GTK_WIDGET((*item).mail_button), 100, 25); 89 | gtk_box_pack_start(GTK_BOX(hbox), (*item).mail_button, 90 | TRUE, TRUE, 0); 91 | /* 暂时不做微信公众平台的选项 92 | * (*item).weixin_button = gtk_check_button_new_with_label("微信平台"); 93 | * gtk_widget_set_size_request(GTK_WIDGET((*item).weixin_button), 100, 25); 94 | * gtk_box_pack_start(GTK_BOX(hbox), (*item).weixin_button, 95 | * TRUE, TRUE, 0); 96 | * 注意添加相应的回调函数 97 | */ 98 | (*item).renren_button = gtk_check_button_new_with_label("人人网"); 99 | gtk_widget_set_size_request(GTK_WIDGET((*item).renren_button), 100, 25); 100 | gtk_box_pack_start(GTK_BOX(hbox), (*item).renren_button, 101 | TRUE, TRUE, 0); 102 | ok_button = gtk_button_new_with_label("发送"); 103 | gtk_widget_set_size_request(GTK_WIDGET(ok_button), 100, 25); 104 | 105 | // gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER((*item).buffer), start); 106 | // gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER((*item).buffer), end); 107 | // text = gtk_text_buffer_get_text(GTK_TEXT_BUFFER((*item).buffer), start, end, TRUE); 108 | // printf("%s\n", text); 109 | 110 | g_signal_connect(G_OBJECT(ok_button), "clicked", G_CALLBACK(send2sn), (Item *)item); 111 | gtk_box_pack_start(GTK_BOX(hbox), ok_button, 112 | TRUE, TRUE, 0); 113 | gtk_box_pack_start(GTK_BOX(vbox), hbox, 114 | FALSE, FALSE, 0); 115 | 116 | /* 将vbox组装进main_window中 */ 117 | gtk_container_add(GTK_CONTAINER(main_window), vbox); 118 | 119 | gtk_widget_show_all(main_window); 120 | gtk_main(); 121 | 122 | free(item); 123 | 124 | return 0; 125 | } 126 | 127 | -------------------------------------------------------------------------------- /send2sn.c: -------------------------------------------------------------------------------- 1 | #include "send2sn.h" 2 | 3 | void send2sn(GtkWidget *widget, Item *parents) 4 | { 5 | GtkWidget *dialog; 6 | 7 | GtkTextIter start, end; 8 | gchar *text; 9 | 10 | gboolean tof_mail = FALSE, tof_renren = FALSE; 11 | 12 | FILE *fp; 13 | 14 | int mail_return = 0, renren_return = 0; 15 | 16 | /* 获取当前文本区域的起始位置和终止位置 */ 17 | gtk_text_buffer_get_start_iter(GTK_TEXT_BUFFER((*parents).buffer), &start); 18 | gtk_text_buffer_get_end_iter(GTK_TEXT_BUFFER((*parents).buffer), &end); 19 | /* 从文本缓冲区中获取文本, 设置为TRUE则不返回不可见的字符,比如制表符等等 */ 20 | text = gtk_text_buffer_get_text(GTK_TEXT_BUFFER((*parents).buffer), &start, &end, TRUE); 21 | tof_mail = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON((*parents).mail_button)); 22 | tof_renren = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON((*parents).renren_button)); 23 | 24 | if (strlen(text) == 0) { 25 | g_free(text); 26 | dialog = gtk_message_dialog_new(NULL, 27 | GTK_DIALOG_DESTROY_WITH_PARENT, 28 | GTK_MESSAGE_ERROR, 29 | GTK_BUTTONS_OK, 30 | "没有输入任何信息"); 31 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 32 | gtk_dialog_run(GTK_DIALOG(dialog)); 33 | gtk_widget_destroy(GTK_WIDGET(dialog)); 34 | } else { 35 | /* 首先把text写入message.txt */ 36 | fp = fopen("message.txt", "w"); 37 | fputs(text, fp); 38 | fclose(fp); 39 | g_free(text); 40 | /* 接着开始发送操作 */ 41 | if (tof_mail == TRUE && tof_renren == FALSE) { 42 | mail_return = system("python2 mail.py"); 43 | if (mail_return < 0) { 44 | dialog = gtk_message_dialog_new(NULL, 45 | GTK_DIALOG_DESTROY_WITH_PARENT, 46 | GTK_MESSAGE_ERROR, 47 | GTK_BUTTONS_OK, 48 | "群发邮件失败 :("); 49 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 50 | gtk_dialog_run(GTK_DIALOG(dialog)); 51 | gtk_widget_destroy(GTK_WIDGET(dialog)); 52 | } else { 53 | dialog = gtk_message_dialog_new(NULL, 54 | GTK_DIALOG_DESTROY_WITH_PARENT, 55 | GTK_MESSAGE_INFO, 56 | GTK_BUTTONS_OK, 57 | "群发邮件成功 :)"); 58 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 59 | gtk_dialog_run(GTK_DIALOG(dialog)); 60 | gtk_widget_destroy(GTK_WIDGET(dialog)); 61 | } 62 | } else if (tof_mail == FALSE && tof_renren == TRUE) { 63 | renren_return = system("python2 renren.py"); 64 | if (renren_return < 0) { 65 | dialog = gtk_message_dialog_new(NULL, 66 | GTK_DIALOG_DESTROY_WITH_PARENT, 67 | GTK_MESSAGE_ERROR, 68 | GTK_BUTTONS_OK, 69 | "发送到人人网失败 :("); 70 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 71 | gtk_dialog_run(GTK_DIALOG(dialog)); 72 | gtk_widget_destroy(GTK_WIDGET(dialog)); 73 | } else { 74 | dialog = gtk_message_dialog_new(NULL, 75 | GTK_DIALOG_DESTROY_WITH_PARENT, 76 | GTK_MESSAGE_INFO, 77 | GTK_BUTTONS_OK, 78 | "成功发送到人人网 :)"); 79 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 80 | gtk_dialog_run(GTK_DIALOG(dialog)); 81 | gtk_widget_destroy(GTK_WIDGET(dialog)); 82 | } 83 | } else if (tof_mail == TRUE && tof_renren == TRUE) { 84 | mail_return = system("python2 mail.py"); 85 | renren_return = system("python2 renren.py"); 86 | if (mail_return < 0 || renren_return < 0) { 87 | dialog = gtk_message_dialog_new(NULL, 88 | GTK_DIALOG_DESTROY_WITH_PARENT, 89 | GTK_MESSAGE_ERROR, 90 | GTK_BUTTONS_OK, 91 | "发送到失败 :("); 92 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 93 | gtk_dialog_run(GTK_DIALOG(dialog)); 94 | gtk_widget_destroy(GTK_WIDGET(dialog)); 95 | } else { 96 | dialog = gtk_message_dialog_new(NULL, 97 | GTK_DIALOG_DESTROY_WITH_PARENT, 98 | GTK_MESSAGE_INFO, 99 | GTK_BUTTONS_OK, 100 | " 发送成功 :)"); 101 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 102 | gtk_dialog_run(GTK_DIALOG(dialog)); 103 | gtk_widget_destroy(GTK_WIDGET(dialog)); 104 | } 105 | } else { 106 | dialog = gtk_message_dialog_new(NULL, 107 | GTK_DIALOG_DESTROY_WITH_PARENT, 108 | GTK_MESSAGE_ERROR, 109 | GTK_BUTTONS_OK, 110 | "未选择发送目标"); 111 | gtk_window_set_title(GTK_WINDOW(dialog), "信息"); 112 | gtk_dialog_run(GTK_DIALOG(dialog)); 113 | gtk_widget_destroy(GTK_WIDGET(dialog)); 114 | } 115 | } 116 | } 117 | --------------------------------------------------------------------------------