MailPad開発記 DAY 6 - POP3認証

1.アカウント作成
2.送信用MHファイル作成-----現在ここまで
3.(POP3で認証)
4.(SMTP認証+)送信

3.のPOP3認証はカッコ付きですが、(理屈からいうと、送信には必要ない)
SSLを使用しない場合、たいていPOP before SMTPをすることになっているので、今日は3.の部分を記述します。
(くどいですが、今はSSL無しで進めています)


libsylphのexamplesにあるlibsylph-pop.cを見てみると、
drop_message関数とpop_message関数があります。
drop_messageの方はファイル・フォルダ操作と思われます。
今回はPOP3で認証さえ出来れば良いので、大事なのはpop_messageです。
そこで、これをコピペしてアカウントの構造体を渡すようにちょちょっと改造します。
#include を追加


callbacks.c

void
pop_message(const PrefsAccount *ac)
{
Session *session;

g_return_if_fail(ac != NULL);
g_return_if_fail(ac->recv_server != NULL);
g_return_if_fail(ac->userid != NULL);
g_return_if_fail(ac->passwd != NULL);

g_print("Receiving from %s\n", ac->recv_server);

/* create session */
session = pop3_session_new(ac);
POP3_SESSION(session)->user = g_strdup(ac->userid);
POP3_SESSION(session)->pass = g_strdup(ac->passwd);
POP3_SESSION(session)->auth_only = TRUE; /* 追加 */

/* connect */
if (session_connect(session, ac->recv_server, ac->popport) < 0) {
session_destroy(session);
return;
}

/* start session */
g_print("POP3 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 ||
POP3_SESSION(session)->state == POP3_ERROR ||
POP3_SESSION(session)->error_val != PS_SUCCESS) {
if (POP3_SESSION(session)->error_msg)
g_warning("error occurred: %s\n",
POP3_SESSION(session)->error_msg);
else
g_warning("error occurred\n");
}
session_destroy(session);
}

ほとんどコピペ。変更点は

  • PrefsAccountを引数に取るようにした
  • pop.hのstruct _Pop3Sessionにgboolean auth_onlyというメンバがあったので、それをTRUEにするようにした
  • drop_message関連の処理は削除
  • ポート番号はdefineではなくacのpopportメンバを使用

といったところです。 (たいした事してないな...)


on_button_clicked関数への変更は以下のとおり。


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);
syl_cleanup();
}

今日から、実際にメールサーバにアクセスすることになります。
大切なメールデータを消失しないように、細心の注意を払いつつ進めてください。


これで、送信可能になる一歩手前まで来ました。
明日はいよいよメール送信です。