티스토리 뷰

개발/Linux

smtp 컴파일

Jaeyeon Baek 2015. 3. 20. 17:35


갑작스럽게 sendmail 을 컴파일하고 설치하게 된 이유는 python 에서 SMTP 를 사용해서 mail 을 전송하는데, 에러가 발생했고, 해당 에러의 원인이 localhostsendmail server 가 없었기 때문이었습니다.

Traceback (most recent call last):
  File "/usr/lib/python2.7/runpy.py", line 162, in _run_module_as_main
    "__main__", fname, loader, pkg_name)
  File "/usr/lib/python2.7/runpy.py", line 72, in _run_code
    exec code in run_globals
  File "/mnt/ramdisk/do/F3work/F3/nfw2/kctrl/mod_alert_mail.py", line 285, in 
    s = smtplib.SMTP(server)
  File "/usr/lib/python2.7/smtplib.py", line 249, in __init__
    (code, msg) = self.connect(host, port)
  File "/usr/lib/python2.7/smtplib.py", line 309, in connect
    self.sock = self._get_socket(host, port, self.timeout)
  File "/usr/lib/python2.7/smtplib.py", line 284, in _get_socket
    return socket.create_connection((port, host), timeout)
  File "/usr/lib/python2.7/socket.py", line 571, in create_connection
    raise err
socket.error: [Errno 111] Connection refused


늘상과 같이.. 패키지 설치가 아닌 오픈소스를 다운로드 받아서 진행을 했고, 아래와 같은 과정으로 진행이 되었습니다.


1. 소스 다운로드

  - https://www.sendmail.com/sm/open_source/download/

  - 위 링크에서 적당한 릴리즈 버전을 다운로드 받습니다.


2. 압축 해제

  - 받은 소스의 압축을 해제 합니다.


3. sh Build

  - 진행하게 되면 obj.Linux.(서버 버전) 디렉토리가 생성됩니다.

  - 해당 디렉토리는 smtp 관련 해서 개별 compile이 가능한 링크 폴더로 구성되어 있습니다.


4. cd cf/cf 

  - .mc 매크로 파일이 생성되어진 디렉토리


5. cp generic-linux.mc sendmail.mc

  - sendmail.mc 매크로 파일을 생성

  - m4라는 전처리기를 이용해 .mc 파일로 sendmail.cf 파일을 생성합니다

  - sh Build sendmail.cf


6. mkdir /etc/mail/

  - sendmail.cf 설치 경로

  - 경로 변경은 cf/cf/Makefile 내부 MAILDIR 변수를 수정해서 원하는 prefix 를 사용합니다.


7. sh Build install-cf

  - sendmail.cf파일과 submit.cf 파일이 생성되고 /etc/mail/디렉토리로 복사해 줍니다.

  - submit.cf 은 특정버전부터 생성이 안되는것 같음


8. ./devtools/OS/Linux 수정

  - 본인에게 필요한건 sendmail 이기 때문에 해당 폴더에서 make를 진행했습니다.

  - make 도중 아래와 같은 에러가 발생했고, Makefile을 생성하는 ./devtools/OS/Linux 내부에 confLIBS 을 수정했습니다. ( -lresolv -lcrypt -lnsl 추가 )

[oops@ sendmail]$ make
cc -o sendmail   main.o alias.o arpadate.o bf.o collect.o conf.o control.o convtime.o daemon.o deliver.o domain.o envelope.o err.o headers.o macro.o map.o mci.o milter.o mime.o parseaddr.o queue.o ratectrl.o readcf.o recipient.o sasl.o savemail.o sfsasl.o shmticklib.o sm_resolve.o srvrsmtp.o stab.o stats.o sysexits.o timers.o tls.o trace.o udb.o usersmtp.o util.o version.o      /home2/jyback/ramdisk/rootfs/x86_64/sendmail-8.15.1/obj.Linux.3.11.0-15-generic.x86_64/libsmutil/libsmutil.a /home2/jyback/ramdisk/rootfs/x86_64/sendmail-8.15.1/obj.Linux.3.11.0-15-generic.x86_64/libsm/libsm.a  -ldl 
domain.o: In function `getmxrr':
domain.c:(.text+0x1f0): undefined reference to `__res_search'
domain.c:(.text+0x200): undefined reference to `__res_query'
domain.c:(.text+0x2a5): undefined reference to `__dn_skipname'
domain.c:(.text+0x4f4): undefined reference to `__dn_expand'
domain.c:(.text+0x5be): undefined reference to `__dn_expand'
domain.o: In function `dns_getcanonname':
domain.c:(.text+0x1017): undefined reference to `__res_querydomain'
domain.c:(.text+0x10ab): undefined reference to `__dn_skipname'
domain.c:(.text+0x1213): undefined reference to `__dn_expand'
domain.c:(.text+0x12a1): undefined reference to `__dn_expand'
sm_resolve.o: In function `dns_lookup_int':
sm_resolve.c:(.text+0x217): undefined reference to `__res_search'
sm_resolve.c:(.text+0x308): undefined reference to `__dn_expand'
sm_resolve.c:(.text+0x424): undefined reference to `__dn_expand'
sm_resolve.c:(.text+0x58f): undefined reference to `__dn_expand'
sm_resolve.c:(.text+0x6d7): undefined reference to `__dn_expand'
sm_resolve.c:(.text+0x798): undefined reference to `__dn_expand'
sm_resolve.c:(.text+0x993): undefined reference to `__res_search'
collect2: ld returned 1 exit status
make: *** [sendmail] 오류 1

  - 수정 이후에 obj.Linux.(서버 버전) 디렉토리를 삭제하고 다시 3번 과정인 sh Build 를 수행합니다. 

  - 그래야 sendmail 폴더에 Makefile이 새로 생성 됩니다.


9. 필요한 파일 

  - /usr/sbin/sendmail

  - /etc/mail/sendmail.cf

  - touch /etc/mail/local-host-names

  - mkdir /var/spool/mqueue/


10. sendmail 실행

  - /usr/sbin/sendmail -L sm-mta -bd -q25m 

  - 각 Parameter 에 대한 설명은 http://www.computerhope.com/unix/usendmai.htm 이곳을 참고하도록 합니다.



그리고 python에서 정상적으로 메일이 전송되는것을 확인하면 됩니다.




PS

많은 내용들이 아래 링크에서 참조되었음을 밝힙니다.

https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=862







'개발 > Linux' 카테고리의 다른 글

mariadb mips cross-compile 문제  (0) 2015.08.22
PAM 연동을 위한 tacacs+ 서버 설치 및 설정  (0) 2015.07.22
ubuntu proftpd 오류  (0) 2015.02.23
mariaDB 설치 후 mysql client 접속 시 에러  (0) 2015.02.10
mariaDB 설치  (0) 2015.02.09
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
Total
Today
Yesterday