MailPad開発記 DAY 7 - SMTP認証とメール送信

1.アカウント作成
2.送信用MHファイル作成
3.(POP3で認証)-----現在ここまで
4.(SMTP認証+)送信
いよいよ送信の部分を作ります(っても改変コピペですが)。
/* こんなんでいいのか?と思う人もいるかと思いますが、
まずは自分の作ったプログラムでメールが送れるという体験をして欲しいと思います。
そして、完全に自分仕様の、自分が作らなかったらこの世界には存在しなかったソフトを作ってみてください。
その中で理解もさらに深まると思います。*/

今日参考にするのはlibsylph-send.cです。
#include を追加


callbacks.c

void
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.c

void
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も未対応)

さあ〜、これでいよいよメールを送信できます。
細心の注意を払いつつ、実験してみてください。