Sabtu, 28 Mei 2016

Membuat Program C untuk Mengirim Email dengan libquickmail


Senang sekali mengingat masa lalu. Dulu saya sering iseng membuat virus, worm dan program jahat lainnya, termasuk keylogger. Namun sayangnya, kesemuanya itu belum ada yang sukses berada di papan atas, seperti Sality dan Conficker.

Jadi, saya ingin mengulaingi masa lalu saya. Dan untuk saat ini, saya berencana membuat satu lagi program jahat, yang lebih jahat. Ya, keylogger. Program keylogger pertama saya sudah saya sebarkan di salah satu situs download software. Jika ingin mencobanya, carilah program bernama “SpyC” di www.brothersoft.com.

Sekarang, saya akan mengembangkan keylogger tersebut dari awal, dengan menambahkan kemampuan mengirimkan email hasil pencurian data korban ke email milik kita. Tapi, yang jadi masalah adalah, bagaimana mengirimkan email dari program yang kita buat?

Sebenarnya ada banyak cara, salah satu yang berhasil saya uji adalah dengan memanfatkan bantuan libquickmail. Tak perlu repot-repot mengetahui istilah teknis dalam mekanisme komunikasi email. Cukup memodifikasi sedikit sampel program yang disediakan dalam source libquickmail, saya pun berhasil mengirimkan sebuah email dari progam saya. Prinsipnya, program kita akan memanggil serangkaian API dari library tersebut untuk mengirimkan email, semua mekanismenya kita tak perlu tahu, karena libquickmail sendirilah yang akan mengurusnya. Sederhana, bukan?

Selama ini, komunikasi dengan email dapat dilakukan melalui beberapa jenis mekanisme protokol, seperti SMTP, POP3 dan IMAP. Gmail adalah salah satu layanan email yang mendukung ketiga jenis protokol tersebut. Sementara itu, libquickmail hanya mendukung protokol SMTP. Selebihnya, anda bisa meluangkan sedikit waktu untuk mengetahui lebih lanjut tentang ketiga protokol tersebut.

Lalu, apa itu libquickmail?
Menurut penciptanya sendiri, libquickmail adalah: “C library intended to give C/C++ developers a quick and easy way to send e-mail from their applications. Supports multiple To/Cc/Bcc recipients and multiple attachments without size limitation. For the actual SMTP communication either libcurl can be used or the built in SMTP support. The library can also be used to just create a multipart MIME message body.
Also comes with a command line application for sending mails (with optional attachments).”

NB: Jika tak mengerti artinya, anda bisa menggunakan Google translate. Hehehe

Library ini mendukung platform Unix-like dan Windows. Namun pada kesempatan kali ini, saya hanya menjelaskan tata caranya dalam persepektif pengguna Linux. Mungkin tutorial khusus untuk penggunaan libquickmail di Windows akan dibahas lebih jauh di waktu lain, ya.

Baik, langsung saja kita mulai.
1. Sayangnya libquickmail belum tersedia di repository utama Ubuntu. Saya tidak tahu untuk repository lain. Untuk itu kita perlu melakukan compile, build dan instalasi secara manual. Namun, jika repo anda sudah menyediakannya, anda cukup menginstalnya sesuai prosedur biasanya, dan melewati tahapan ini. Pertama, kita download source code libquickmail dulu.
https://sourceforge.net/projects/libquickmail

2. Ekstrak file

3. Build
Pertama masuk ke direktori source code
cd /home/it/libquickmail-0.1.23

Lakukan konfigurasi otomatis dengan menjalankan script 'configure'. Tambahkan parameter --prefix/usr.
./configure --prefix=usr

Setelah build selesai, nantinya semua file dimasukkan sekitar folder /usr/local. Umumnya program masih bisa berjalan jika library berada dalam lingkup /usr/local, tapi nyatanya percobaan saya sebelumnya gagal. Jadi, akhirnya saya memilih lokasi prefix /usr.

Compile dan link source code yang telah dikonfigurasi dengan perintah:
make
Install hasilnya ke sistem
sudo make install



5. Buat program
Berikut adalah source code untuk mengirim email melalui protokol SMTP gmail. Alamat server dan port SMTP saya peroleh dari link berikut.
https://support.google.com/a/answer/176600?hl=id

/*
    This file is part of libquickmail.

    libquickmail is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    libquickmail is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with libquickmail.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "quickmail.h"
#include <stdio.h>

#define FROM        "irvan.herz@gmail.com"
#define TO          "irvan.herz@gmail.com"
//#define CC          "otheruser@domain.com"
//#define BCC         "otheruser@domain.com"
#define SMTPSERVER  "smtp.gmail.com"
#define SMTPPORT    587
#define SMTPUSER    "irvan.herz@gmail.com"
#define SMTPPASS    "XXXXXXXXXXX"

void list_attachment_callback (quickmail mailobj, const char* filename, quickmail_attachment_open_fn email_info_attachment_open, quickmail_attachment_read_fn email_info_attachment_read, quickmail_attachment_close_fn email_info_attachment_close, void* callbackdata)
{
  printf("[%i]: %s\n", ++*(int*)callbackdata, filename);
}

int main ()
{
  printf("libquickmail %s\n", quickmail_get_version());
  quickmail_initialize();
  quickmail mailobj = quickmail_create(FROM, "libquickmail test e-mail");
#ifdef TO
  quickmail_add_to(mailobj, TO);
#endif
#ifdef CC
  quickmail_add_cc(mailobj, CC);
#endif
#ifdef BCC
  quickmail_add_bcc(mailobj, BCC);
#endif
  quickmail_add_header(mailobj, "Importance: Low");
  quickmail_add_header(mailobj, "X-Priority: 5");
  quickmail_add_header(mailobj, "X-MSMail-Priority: Low");
  quickmail_set_body(mailobj, "This is a test e-mail.\nThis mail was sent using libquickmail.");
  //quickmail_add_body_memory(mailobj, NULL, "This is a test e-mail.\nThis mail was sent using libquickmail.", 64, 0);
  quickmail_add_body_memory(mailobj, "text/html", "This is a <b>test</b> e-mail.<br/>\nThis mail was sent using <u>libquickmail</u>.", 80, 0);
/**/
  quickmail_add_attachment_file(mailobj, "test_quickmail.c", NULL);
  quickmail_add_attachment_file(mailobj, "test_quickmail.cbp", NULL);
  quickmail_add_attachment_memory(mailobj, "test.log", NULL, "Test\n123", 8, 0);
/**/
/*/
  quickmail_fsave(mailobj, stdout);

  int i;
  i = 0;
  quickmail_list_attachments(mailobj, list_attachment_callback, &i);

  quickmail_remove_attachment(mailobj, "test_quickmail.cbp");
  i = 0;
  quickmail_list_attachments(mailobj, list_attachment_callback, &i);

  quickmail_destroy(mailobj);
  return 0;
/**/

  const char* errmsg;
  quickmail_set_debug_log(mailobj, stderr);
  if ((errmsg = quickmail_send(mailobj, SMTPSERVER, SMTPPORT, SMTPUSER, SMTPPASS)) != NULL)
    fprintf(stderr, "Error sending e-mail: %s\n", errmsg);
  quickmail_destroy(mailobj);
  return 0;
}

Awalnya saya mencoba konfigurasi server=aspmx.l.google.com dan port=25, tapi gagal. Begitu pula dengan server=smtp.gmail.com dan port=465. Konfigurasi yang berhasil saya uji dan dapat diproses oleh program adalah server=smtp.gmail.com dan port=587. Untuk konfigurasi lain, saya belum sempat mencobanya.

6. Build program
gcc test_quickmail.c -lquickmail -o test_quickmail

7. Jalankan, lalu cek inbox



Oyeee, berhasil. Kira-kira, program apa yang akan anda buat, ya?
Load disqus comments

0 comments