[질문]smtp를 이용한 메일 보내기 간단한 소스입니다.

0huni의 이미지

리눅스 명령줄에 " telnet 메일호스트 25 " 이렇게 하고서

MAIL FROM: hoonizm@hananet.net 이런식으로 FROM, RECT TO, DATA등을 작성하면 리눅스에서 메일 보내는게 가능하잖아요?

이걸 간단하게 C로 구현중인데 아래 코드를 실행하면

메일서버에 접속하자 마자 아래 화면 출력 메시지처럼
바로 connection close가 됩니다.
왜 이러는건가요?

---------------------------------------------------------

#include <stdio.h>

#define COMMAND     "telnet 메일호스트 25"
#define MAILHOST    "mail.xxxxxxx.com"

int
main()
{
   FILE *fd;
    char command_buf[100];
    strcpy(command_buf, COMMAND);

    if ((fd = popen(command_buf, "w")) == NULL) {
        printf("error");
    }   

    fprintf(fd, "HELO localhost");  // 1

  
    pclose(fd);

    return 0;

}

화면 출력 메시지입니다.

Escape character is '^]'.
220 mail.dreamedianet.com SMTP MailEdge; Tue Dec 09 12:51:46 KST 2003
Connection closed by foreign host.
서지훈의 이미지

    if ((fd = popen(command_buf, "w")) == NULL) { 
        printf("error"); 
    }    

    fprintf(fd, "HELO localhost");  // 1 

  
    pclose(fd);

여기서 pipe가 닫히니깐 당연히 접속이 끊히네요...-_-ㅋ
pclose()는 여기선 별로 쓸모가 없을거 같구요...
loop() 를 돌리세요...
계속해서 새로운 명령을 받거나 입력을 하실려면...?

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

0huni의 이미지

답변 감사합니다.
그런데 pclose(fd)를 빼버려도 connection이 close가 됩니다.
helo localhost까지 되야 되는거 아닌가요?

그리고 loop()를 돌리라고 하신거에 대해서 좀더 자세한 답변 부탁드립니다. 플리즈~~~

서지훈의 이미지

fread() 로 응답을 받아 오셔야죠...-_-ㅋ
그러면 어떻겐 될거 같긴 한데...
그리고 메일 보내는 것까지 원하신다면 단계를...
잘 보시길...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

0huni의 이미지

fread()로 응답을 받아서 정상 응답인게 확인만 되면 다음 단계(mail from, rcpt to등...)를 진행하면 되는건가요?

서지훈의 이미지

아마도...

그렇게해서 진행을 하시면은 될것 같군요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

0huni의 이미지

정말 죄송한데요.
잘 안되서 그러는데 제가 올린 소스부분에서
어떤식으로 fread()를 해야되는지 조금만 첨가해 주실 수는 없는지요?
C를 한지 얼마 안되다보니 어려움이 많네요... 지송..

추신:
서명이 참 재밌네요...^^

서지훈의 이미지

#include <stdio.h> 

#define COMMAND     "telnet 메일호스트 25" 
#define MAILHOST    "mail.xxxxxxx.com" 

int 
main() 
{ 
   FILE *fd; 
    char command_buf[100]; 
    char temp[128];
    strcpy(command_buf, COMMAND); 

    if ((fd = popen(command_buf, "w")) == NULL) { 
        printf("error"); 
    }    

    fprintf(fd, "HELO localhost");  // 1 

    fread(temp, sizeof(char), 128, fd); <============
   
    pclose(fd); 

    return 0; 

}

위와 같은 형식으로 해보세요...

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

0huni의 이미지

위의 소스 그대로 해서 임의의 메일서버로 테스트를 해봐도 여전히 안되네요.

뭐가 문제인가요?
그대로 했는데...ㅠ.ㅠ

서지훈의 이미지

위 소스대로 한 다음...
temp 내용이 null 인가요?

직접 실행하신 소스와 결과를 다시 한 번 올려 주세요.

<어떠한 역경에도 굴하지 않는 '하양 지훈'>

#include <com.h> <C2H5OH.h> <woman.h>
do { if (com) hacking(); if (money) drinking(); if (women) loving(); } while (1);

0huni의 이미지

아래와 같이 했습니다.
메일호스트명은 보안상 xxxxxxxxx 표시를 한거구요.
buf의 값을 찍어보니 null이더라구요.

------------------------------------------------------------------

#include <stdio.h>

#define COMMAND     "telnet mail.xxxxxxxxxx.com 25"

int
main()
{
    FILE *fd;
    char command_buf[100];
    char buf[1024];
    strcpy(command_buf, COMMAND);

    if ((fd = popen(command_buf, "w")) == NULL) {
        printf("error");
    }

    fprintf(fd, "HELO localhost\n");  // 여기를 주석처리하고도 해봤지만 마찬가지입니다.
    fread(buf, sizeof(char), 128, fd);
//  printf("BUF= %s \n", buf);

/*
    fprintf(fd, "MAIL FROM: hoonizm@hananet.net");
    fprintf(fd, "RCPT TO: hoonizm@hananet.net");
*/
    //pclose(fd);

    return 0;

}
cdpark의 이미지

telnet을 popen하지 말고 그냥 소켓 프로그래밍을 직접 하시죠? telnet을 통하는 것보다 더 쉬울겁니다.

0huni의 이미지

cdpark님 죄송한데요...
제가 C초보라서 그러는데
소켓으로 하는 거에 대한 예제를 간단하게 들어주셨으면 고맙겠습니다.

myreas의 이미지

#define SENDMAIL_PATH "/usr/lib/sendmail -bs > /dev/null"

rp = fopen (buffer, "r");
memset (des, 0, sizeof (des));
while (fgets (des, Standardlength, rp) != NULL) {
trims (des);
if ((fin = fopen (textfile ,"r")) == NULL) return (ERROR);
if ((fp = popen (SENDMAIL_PATH, "w")) != NULL) {
fprintf (fp, "HELO %s\n", Domain);
fprintf (fp, "MAIL FROM: %s@%s\n", 보내는 사람);
fprintf (fp, "RCPT TO: %s\n", des);
fprintf (fp, "DATA\n");
fprintf (fp, "Subject: %s\n", 제목);
fprintf (fp, "TO: %s\n", first);
if (cc == ON) fprintf (fp, "CC: %s\n", 참조);
fprintf (fp, "MIME-Version: 1.0\n");
fprintf (fp, "Content-Type: text/html; charset=euc-kr\n");
fprintf (fp, "Content-Transfer-Encoding: 8bit\n");
i = 0;
while ((ch = getc (fin)) != EOF) {
if (ch == '\n') {
rmCtrlChar (buf);
fprintf (fp, "%s\n", buf);
memset (buf, 0, sizeof (buf));
i = 0;
}
else buf [i++] = ch;
}
fprintf (fp, ".\n");
fprintf (fp, "QUIT\n");
retval = pclose (fp);
fclose (fin);
}
_UNLINK (textfile);
}
fclose (rp);

음... 조금 적어 보았는데 도움이 되길 바라며. ~~

더 필요 한 부분이나 오류가 있으면 .. 답글 남겨 주세요.

Rock will never die

0huni의 이미지

myreas님 sendmail이 아니라 telnet을 이용해야 되거든요.
telnet 메일호스트 25를 이용해서 소켓통신을 하거나 아님 popen()함수를 사용해서요...ㅠ.ㅠ

dk의 이미지

직접 소켓여는 것이 더 확실합니다.
telnet이 단방향으로 통신하는 가상터미널을 사용하다보니..
입력을 받기 전에 몇 초 대기해야 하는 상황도 발생합니다.
telnet을 통해 서버와 통신하면
서버측에서 쓰기 전에 적절히(?) 대기하지 않고 읽기를 시도하거나
서버측에서 받기 전에 대기하지 않고 쓰기 시작하면 중간에 데이터 손실이 발생할 수 있습니다.

0huni의 이미지

아~~
그래서 fread()를 이용해서 응답메시지를 읽어오려해도 안 읽혀지고 null이 나오는게 그래서 그런거군요.

감사합니다....^^

그런데 소케 사용하는 예제 좀 부탁드려도 될까요?
C로 프로그램 해본게 얼마 안되서리..

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.