MailPad開発記 DAY 7 - SMTP認証とメール送信
1.アカウント作成
2.送信用MHファイル作成
3.(POP3で認証)-----現在ここまで
4.(SMTP認証+)送信
いよいよ送信の部分を作ります(っても改変コピペですが)。
/* こんなんでいいのか?と思う人もいるかと思いますが、
まずは自分の作ったプログラムでメールが送れるという体験をして欲しいと思います。
そして、完全に自分仕様の、自分が作らなかったらこの世界には存在しなかったソフトを作ってみてください。
その中で理解もさらに深まると思います。*/
今日参考にするのはlibsylph-send.cです。
#include
callbacks.cvoid
send_message(const PrefsAccount *ac, const gchar *to, const gchar *file)
{
Session *session;
GSList *to_list;
FILE *fp;g_return_if_fail(ac != NULL);
g_return_if_fail(ac->address != NULL);g_print("from: %s\nto: %s\n", ac->address, to);
if ( (fp = g_fopen(file, "rb") ) == NULL) {
FILE_OP_ERROR(file, "fopen");
return;
}/* create session */
session = smtp_session_new();
SMTP_SESSION(session)->from = g_strdup(ac->address);
to_list = g_slist_append(NULL, g_strdup(to));
SMTP_SESSION(session)->to_list = to_list;
SMTP_SESSION(session)->cur_to = to_list;
SMTP_SESSION(session)->send_data_fp = get_outgoing_rfc2822_file(fp);
SMTP_SESSION(session)->send_data_len =
get_left_file_size(SMTP_SESSION(session)->send_data_fp);fclose(fp);
/* connect */
if (session_connect(session, ac->smtp_server, ac->smtpport) < 0) {
goto finish;
}/* start session */
g_print("SMTP session start\n");while (session_is_connected(session))
g_main_iteration(TRUE);if (session->state == SESSION_ERROR ||
session->state == SESSION_EOF ||
session->state == SESSION_TIMEOUT ||
SMTP_SESSION(session)->state == SMTP_ERROR ||
SMTP_SESSION(session)->error_val != SM_OK)
{
if (SMTP_SESSION(session)->error_msg){
g_warning("error occurred: %s\n", SMTP_SESSION(session)->error_msg);
} else {
g_warning("error occurred\n");
}
}finish:
session_destroy(session);
slist_free_strings(to_list);
g_slist_free(to_list);
}
- PrefsAccountを引数に取る
- defineされていたポート番号ではなく、ac内のsmtpportメンバを使用
- if else文に{}を追加 ^^;
callbacks.cvoid
on_button_clicked (GtkButton *button, gpointer user_data)
{
syl_init();
set_debug_mode(TRUE);GtkEntry *entry_to = (GtkEntry*)lookup_widget((GtkWidget*)button, (gchar *)"entry_to");
GtkEntry *entry_subject = (GtkEntry*)lookup_widget((GtkWidget*)button, (gchar *)"entry_subject");
GtkTextView *textview = (GtkTextView*)lookup_widget((GtkWidget*)button, (gchar *)"textview");gchar *to = (gchar*)gtk_entry_get_text(entry_to);
gchar *subject = (gchar*)gtk_entry_get_text(entry_subject);GtkTextBuffer *textbuffer = gtk_text_view_get_buffer(textview);
GtkTextIter start, end;
gtk_text_buffer_get_start_iter(textbuffer,&start);
gtk_text_buffer_get_end_iter(textbuffer,&end);
gchar *body = gtk_text_buffer_get_text(textbuffer, &start, &end, TRUE);PrefsAccount *ac = set_account((GtkWidget *)button);
do_compose(ac, to, subject, body);
if(ac->pop_before_smtp) pop_message(ac);
send_message(ac, to, "mail.txt");
syl_cleanup();
}
ちなみに、まだCcBccの機能も作ってないです。(くどいですがSSLも未対応)
さあ〜、これでいよいよメールを送信できます。
細心の注意を払いつつ、実験してみてください。