SMTP 서버 + 보안연결 메일 보내기

출처: http://www.codeproject.com/Articles/98355/SMTP-Client-with-SSL-TLS

공개된 CSmtp 라이브러리를 사용하여.. 메일 보내기..

CSmtp_v2_3_ssl.zip

아래는 MinGW를 사용하여 gmail의 TLS 보안 연결로 메일 보내는 예제..
OpenSSL 라이브러리 필요하며, 리눅스에서도 사용 가능..

#include "CSmtp.h"
#include <iostream>

int main()
{
	bool bError = false;

	try
	{
		CSmtp mail;

#define test_gmail_tls

#if defined(test_gmail_tls)
		mail.SetSMTPServer("smtp.gmail.com",587);
		mail.SetSecurityType(USE_TLS);
#elif defined(test_gmail_ssl)
		mail.SetSMTPServer("smtp.gmail.com",465);
		mail.SetSecurityType(USE_SSL);
#elif defined(test_hotmail_TLS)
		mail.SetSMTPServer("smtp.live.com",25);
		mail.SetSecurityType(USE_TLS);
#elif defined(test_aol_tls)
		mail.SetSMTPServer("smtp.aol.com",587);
		mail.SetSecurityType(USE_TLS);
#elif defined(test_yahoo_ssl)
		mail.SetSMTPServer("plus.smtp.mail.yahoo.com",465);
		mail.SetSecurityType(USE_SSL);
#endif

		mail.SetLogin("user_id");
		mail.SetPassword("user_password");
  		mail.SetSenderName("User");
  		mail.SetSenderMail("user@domain.com");
  		mail.SetReplyTo("user@domain.com");
  		mail.SetSubject("The message");
  		mail.AddRecipient("friend@domain2.com");
  		mail.SetXPriority(XPRIORITY_NORMAL);
  		mail.SetXMailer("The Bat! (v3.02) Professional");
  		mail.AddMsgLine("Hello,");
		mail.AddMsgLine("");
		mail.AddMsgLine("...");
		mail.AddMsgLine("How are you today?");
		mail.AddMsgLine("");
		mail.AddMsgLine("Regards");
		mail.ModMsgLine(5,"regards");
		mail.DelMsgLine(2);
		mail.AddMsgLine("User");

  		//mail.AddAttachment("../test1.jpg");
  		//mail.AddAttachment("c:\\test2.exe");
		//mail.AddAttachment("c:\\test3.txt");
		mail.Send();
	}
	catch(ECSmtp e)
	{
		std::cout << "Error: " << e.GetErrorText().c_str() << ".\n";
		bError = true;
	}
	if(!bError)
		std::cout << "Mail was send successfully.\n";
	return 0;
}

libcurl 을 이용하여 웹페이지 긁어오기

MingW용 libcurl을 빌드후에.. http 페이지 긁어오는 걸 테스트해 봄..
static 빌드시에.. curl.h 파일 include 전에 CURL_STATICLIB define 필요.

#include <stdlib.h>
#include <stdio.h>
#define CURL_STATICLIB
#include <curl/curl.h>

struct url_data {
    size_t size;
    char* data;
};

size_t write_data(void *ptr, size_t size, size_t nmemb, struct url_data *data) {
    size_t index = data->size;
    size_t n = (size * nmemb);
    char* tmp;

    data->size += (size * nmemb);

#ifdef DEBUG
    fprintf(stderr, "data at %p size=%ld nmemb=%ld\n", ptr, size, nmemb);
#endif
    tmp = realloc(data->data, data->size + 1); /* +1 for '\0' */

    if(tmp) {
        data->data = tmp;
    } else {
        if(data->data) {
            free(data->data);
        }
        fprintf(stderr, "Failed to allocate memory.\n");
        return 0;
    }

    memcpy((data->data + index), ptr, n);
    data->data[data->size] = '\0';

    return size * nmemb;
}

char *handle_url(char* url) {
    CURL *curl;

    struct url_data data;
    data.size = 0;
    data.data = malloc(4096); /* reasonable size initial buffer */
    if(NULL == data.data) {
        fprintf(stderr, "Failed to allocate memory.\n");
        return NULL;
    }

    data.data[0] = '\0';

    CURLcode res;

    curl = curl_easy_init();
    if (curl) {
        curl_easy_setopt(curl, CURLOPT_URL, url);
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &data);
        res = curl_easy_perform(curl);
        if(res != CURLE_OK) {
                fprintf(stderr, "curl_easy_perform() failed: %s\n",  
                        curl_easy_strerror(res));
        }

        curl_easy_cleanup(curl);

    }
    return data.data;
}

int main(int argc, char* argv[]) {
    char* data;
    data = handle_url("http://www.findip.kr");

    if(data) {
        printf("%s\n", data);
        free(data);
    }

    return 0;
}
$ gcc http.c -o http.exe -I/workspace/ETC/tclpackages/3rdparty/lib/curl-7.42.1/release/win32/include -L/workspace/ETC/tclpackages/3rdparty/lib/libssh2-1.4.4-20140926/release/win32/lib -L/workspace/ETC/tclpackages/3rdparty/lib/curl-7.42.1/release/win32/lib -L/workspace/ETC/tclpackages/3rdparty/lib/openssl-1.0.2a/release/win32/lib -lcurl -lws2_32 -lcrypt32 -lssh2 -lssl -lcrypto -lws2_32 -lgdi32	-lcrypt32 -lwldap32 /workspace/ETC/tclpackages/3rdparty/lib/zlib-1.2.8/release/win32/lib/libz.a

Qt Patcher

이건.. 뭐하는 프로그램이냐하면..
이미 설치된 Qt 라이브러리를.. 다른 폴더로 옮기면.. 동작하지 않는데..
이는 Qt 라이브러리내의 특정 파일들이.. 설치된 패스로 고정이 되어 있어서 그럼.
이 프로그램을 사용하여 새로 옮긴 폴더를 지정하면 새로이 패스를 적용하여 줌.
일단 Qt 4.8 버전에서는 테스트 되었음.

qtpatcher

QtPatcher.7z
QtPatche_src.7z

mintty 컬러 셋팅

msys의 home 디렉토리내 .mintty 파일에 다음을 추가.

ForegroundColour    =   197,200,198
BackgroundColour    =   39,40,34
CursorColour        =   253,157,79
Blue                =   102,217,239
BoldYellow          =   244,191,117
BoldWhite           =   249,248,245
BoldCyan            =   18,207,192
Green               =   166,226,46
Magenta             =   174,129,255
BoldMagenta         =   225,163,238
BoldBlue            =   111,194,239
Red                 =   251,159,177
BoldBlack           =   56,56,48
Black               =   39,40,34
BoldGreen           =   172,194,103
BoldRed             =   222,175,143
Yellow              =   253,151,31
White               =   245,244,241
Cyan                =   161,239,228

아래와 같이 변경됨.

mintty

msys – tput 함수 구현

msys2에는.. tput이 있으나.. msys에는 없다..
아래와 같이.. /etc/proflile 파일에 넣어두고..

if ! which tput 2> /dev/null ; then
	tput () {
		case "$1" in
			bold)
				echo -ne "\033[1m" ;;
			setaf)
				echo -ne "\033[0;3$2m" ;;
			sgr0)
				echo -ne "\033(\033[m" ;;
		esac
	}
fi

아래와 같이 프롬프트를 셋팅해본다..

export PS1="\[\e]0;$(gcc -dumpmachine) $(gcc -dumpversion) : \w\a\]\n\[$(tput bold)\]\[$(tput setaf 1)\][\[$(tput setaf 3)\]\u\[$(tput setaf 2)\]@\[$(tput setaf 4)\]\h \[$(tput setaf 5)\]\W\[$(tput setaf 1)\]]\[$(tput setaf 7)\]\\$ \[$(tput sgr0)\]"

아래와 같이 나온다..

tput

Duktape

홈페이지: http://duktape.org/

cropped-w212-h212

자바는 현재.. 웹부라우저 영역이 아닌.. 서버 사이드, 임베디드등 다양한 분야에 사용되고 있음.
Duktape은 C/C++ 코드에 Java 스크립트 코드를 실행하기 위한 엔진(인터프리터) 제공을 목적으로 함.

/* test.c */
#include "duktape.h"

int main(int argc, char *argv[]) {
  duk_context *ctx = duk_create_heap_default();
  duk_eval_string(ctx, "print('Hello world!');");
  duk_destroy_heap(ctx);
  return 0;
}
$ gcc -std=c99 -o test test.c duktape.c -lm
$ ./test
Hello world!

Duktape는 Ecmascript E5 / E5.1과 호환되는 소형 JavaScript 엔진.
유니 코드 지원, 정규 표현 엔진탑재, GC도 탑재되어 있음.

yum을 통한 rpm만 다운로드 받기

그니까.. 설치는 필요 없고.. rpm 파일만 다운로드 받고자 하는 경우가 있음.

% yum install yum-plugin-downloadonly
% yum install --downloadonly --downloaddir=/tmp memcached
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package memcached.x86_64 0:1.4.4-3.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================
 Package                           Arch                           Version                             Repository                    Size
===========================================================================================
Installing:
 memcached                         x86_64                         1.4.4-3.el6                         base                          68 k

Transaction Summary
===========================================================================================
Install       1 Package(s)

Total download size: 68 k
Installed size: 147 k
Is this ok [y/N]: y
Downloading Packages:
memcached-1.4.4-3.el6.x86_64.rpm                                                                                  |  68 kB     00:01


exiting because --downloadonly specified

RHEL 공식 repository 대신 CentOS repository 사용하기

yum을 통한 패키지 설치시..
RHEL 공식 repository에 접근할수 없는 경우..
RHEL의 쌍둥이.. CentOS의 repository를 이용하는 방법이 있음.

% cd /etc/yum.repos.d
% cp rhel.repo centos.repo
% vim centos.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://mirror.centos.org/centos/6/os/$basearch/
gpgcheck=1
 
[update]
name=CentOS-$releasever - Updates
baseurl=http://mirror.centos.org/centos/6/updates/$basearch/
gpgcheck=1

% rpm --import http://mirror.centos.org/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6
% yum list

Pydio 설치

설치형 오픈소스 웹하드 프로그램 Pydio 설치방법..
아파치/PHP/MySQL이 설치되어있어야함.

PHP 업로드 용량 변경

% vim /etc/php.ini
upload_max_filesize = 10G
post_max_size = 10G

MySQL 디비 생성

% mysql -u root -p
# in mode mysql>_
% create database pydio
% create user pydio@localhost identified by '패스워드'
% grant all privileges on pydio.* to pydio@localhost identified by '패스워드' with grant option

다운로드 및 설치

% wget http://jaist.dl.sourceforge.net/project/ajaxplorer/pydio/stable-channel/6.0.6/pydio-core-6.0.6.tar.gz
% su
% mv pydio-core-6.0.6.tar.gz /var/www/html
% tar xvfz pydio-core-6.0.6.tar.gz
% mv pydio-core-6.0.6 pydio
% cd pydio
% chmod -R 777 data

httpd.conf 수정

# 아래를 추가
% vim /etc/httpd/conf/httpd.conf
<Directory "/var/www/html/pydio">
       AllowOverride All
</Directory>

웹부라우저로 접속하여 설치

http://127.0.0.1/pydio/ 

데이타 저장소 변경하는 방법

% vim /var/www/html/pydio/conf/bootstrap_repositories.php
"PATH"                        =>      "AJXP_DATA_PATH/personal/AJXP_USER",
를 아래와 같이 변경 (AJXP_USER를 유지 해야함)
"PATH"                  =>      "/home/pydio/personal/AJXP_USER",

다음 사용자 저장소 폴더를 지정한 폴더로 이동

% cd /home
% mkdir pydio
% cd pydio
% cp -rp /var/www/html/pydio/data/personal .

pydio