Java, asp, php를 활용한 메일보내기

Posted by 겨울에
2011. 2. 4. 05:16 scrap/ Java/JSP
질문 : 자바스크립트 메일보내기
2010.11.25 17:07

안녕하세요
제가 웹디자이너라 프로그래밍 쪽은 많이 약합니다.
다름이 아니오라 폼을 만들어서
send 버튼을 누르면 메일이 보내져야 하고, reset 버튼을 누르면 초기값이 되어야 합니다.
여러 검색을 해 본 결과 html 페이지 만으로는 메일을 보낼 수 가 없음을 알았습니다.
구체적으로 알려주시는 분께 감사드리겠습니다.

http://www.wydent.com/contact.html
위의 링크에서 보면 유저가 메일을 보낼 수 있게 되어 있습니다.
제가 위의 설명을 잘 못한것 같아서 수정합니다.
유저가 메일을 보내면 설정한 관리자에게 메일이 보내어지는 형식입니다.


답변 : re: 자바스크립트 메일보내기
2010.11.25 17:21

HTML 뿐만이 아니라 JavaScript 를 쓰시더라도 메일을 보내실 수 없습니다.
메일을 보내시려면 일단 메일 서버가 구축되 있으신 이후 발송이 가능하며
그 이후로 이메일 전송 프로토콜을 프로그래밍을 통해서 만드신 후 메일 서버로 발송을 하셔야 합니다.
그러니까 현재 만드신 부분은 껍데기에 지나지 않을뿐 내부적인 부분은 아무런 구현이 되있지 않으신겁니다.
만약 Java 로 메일을 구현 하신다고 하면 메일 서버쪽에 SendMail 이라는 Java 모듈을 이용하셔서
메일을 발송 하실 수 있습니다.


PHP를 사용한 SMTP 서버를 통한 이메일 발송
php 에는 mail이라는 함수가 있는데 window에서만 php.ini 안에서 smtp서버를 설정할수가 있다.
따라는 os가 window가 아닐 경우는 아래 함수를 직접 만들어서 이용한다. 포퍼먼스는 얼마나 좋은진 모르나...
다른 smtp 서버를 꼭 이용하여야 할 경우에는 유용하게 쓸 수 있다.
DATA 전까지는 꼭 fgets 을 해야한다.

<?
function sendmail($smtp_server, $smtp_user, $name, $from, $to, $subject, $message, $html_yn, $charset ) {
 if (!$smtp_sock = fsockopen("$smtp_server", 25)) {
  die ("Couldn't open mail connection to $smtp_server! \n");
 }
 fputs($smtp_sock, "HELO $smtp_server\n");
 fgets($smtp_sock,1024);
 //fputs($smtp_sock, "VRFY $stmp_user\n");
 fputs($smtp_sock, "MAIL FROM:$from\n");
 fgets($smtp_sock,1024);
 fputs($smtp_sock, "RCPT TO:$to\n");
 fgets($smtp_sock,1024);
 fputs($smtp_sock, "DATA\n");
 fputs($smtp_sock, "From: $name<$from>\n");
 fputs($smtp_sock, "X-Mailer: php\n");
 if ($html_yn) fputs($smtp_sock, "Content-Type: text/html;");
 else fputs($smtp_sock, "Content-Type: text/plain;");
 fputs($smtp_sock, "charset: $charset\n");
 fputs($smtp_sock, "MIME-Version: 1.0\n");
 fputs($smtp_sock, "Subject: $subject\n");
 fputs($smtp_sock, "To: $to\n");
 fputs($smtp_sock, "$message");
 fputs($smtp_sock, "\n.\nQUIT\n");
 fclose($smtp_sock);
}
// SMTP SERVER IP
$smtp_server = "xxx.xxx.xxx.xxx";
// SMTP SERVER USER
$smtp_user = "xxx";
// 보내는 사람 이름
$name = "류성훈";
// 보내는 사람 주소
$from = "xxx@xxx.xxx";
// 받는 사람 주소
$to = "yyy@yyy.yyy";
// 메일 제목
$subject = "제목";
// 메일 내용
$message = "메세지";
// 메일 형식
$html_yn = false;
// 캐릭터셋
$charset = "UTF-8";
sendmail($smtp_server, $smtp_user, $name, $from, $to, $subject, $message, $html_yn, $charset);
?>


ASP 를 이용한 외부 SMTP 서버를 통한 이메일 발송

<%
Function sendMail(strTo, strFrom, strSubject, strBody)
 On Error Resume Next
 
 Set iConf = Server.CreateObject("CDO.Configuration")
 Set Flds = iConf.Fields
 
  Flds("http://schemas.microsoft.com/cdo/configuration/smtpserver")= "mail.xxxx.com"     ' 메일서버 IP
  Flds("http://schemas.microsoft.com/cdo/configuration/smtpserverport")= 25                    ' 포트번호
Flds("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2                         ' cdoSendUsingPort
  Flds("http://schemas.microsoft.com/cdo/configuration/smtpaccountname")= "master@xxxx.com"  ' 계정이름
Flds("http://schemas.microsoft.com/cdo/configuration/sendemailaddress")= """관리자"" <master@xxxx.com>"
  Flds("http://schemas.microsoft.com/cdo/configuration/smtpuserreplyemailaddress")= """관리자"" <master@xxxx.com>"
  Flds("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1                'cdoBasic
  Flds("http://schemas.microsoft.com/cdo/configuration/sendusername") = "master@xxxx.com"  ' 계정ID
  Flds("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "xxxx"   ' 비밀번호
  Flds.Update
 
 Set Flds = Nothing
 Set iMsg =  Server.CreateObject("CDO.Message")
 With iMsg
  .Configuration = iConf
  .To       = strTo           ' 받는사람
  .From     = strFrom           ' 보내는사람
  .Subject  = strSubject              ' 제목      
  .HTMLBody = strBody              ' 내용
  .Send
 End With
 
 Set iMsg = Nothing
 
 Set iConf = Nothing
 If Err Then
     Response.Clear 
     Response.write "Error Number : " & Err.number & "<br>" & _
                "Error Source : " & Err.Source & "<br>" & _
                "Error Descryption : " & Err.Description 
     Response.End
 Else
     'Response.Write "메일이 정상적으로 발송되었습니다"
 End If
End Function
%>


JAVA 를 이용한 SMTP 이메일 발송

1. 자바메일 API 설정하기
다운로드 : http://java.sun.com/products/javamail/ 에 가셔서 다운받으세요
다운로드후 압축을 푸시면 mail.jar이라는 파일이 있는데 톰켓의 common\lib폴더 아래에 복사하여 주십시오.

2. JAF 설정하기
다운로드 : http://java.sun.com/products/javabeans/jaf/downloads/index.html 에 가셔서 다운 받으신 후
압축을 푸시면 activation.jar이라는 파일이 있는데 톰켓의 common\lib폴더 아래에 복사하여 주십시오.
그러면 모든 설정이 종료됩니다.

<%@page contentType = "text/html; charset=euc-kr" %>
<%@ page import="java.util.*,java.io.*,javax.mail.*,javax.mail.internet.*,javax.activation.*" %>

<% 


String host = "mail.xxx.com";//smtp 서버

String subject = "제목입니다";
String content = "내용입니다.";
String from = "aaa@abcd.com"; //보내는 사람
String to = "bbb@abcd.com"; //받는 사람 

try{

// 프로퍼티 값 인스턴스 생성과 기본세션(SMTP 서버 호스트 지정)
Properties props = new Properties();
props.put("mail.smtp.host", host);
Session sess= Session.getDefaultInstance(props, null);

Message msg = new MimeMessage(sess);
msg.setFrom(new InternetAddress(from));//보내는 사람 설정
InternetAddress[] address = {new InternetAddress(to)};

msg.setRecipients(Message.RecipientType.TO, address);//받는 사람설정


msg.setSubject(subject);//제목 설정
msg.setSentDate(new java.util.Date());//보내는 날짜 설정
msg.setContent(content,"text/html;charset=euc-kr"); // 내영 설정 (HTML 형식)


Transport.send(msg);//메일 보내기

} catch (MessagingException ex) {
out.println("mail send error : " + ex.getMessage());
}catch(Exception e){
out.println("error : " + e.getMessage());
}

%>

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

SMTP서버가 인증된 사용자만 메일을 보내게 되어 있는거 같습니다.
정확한 명칭은 모르겠지만요... ^^
 
암튼... 아래 소스를 참고 하세요.
 
public class MailUtil {
private static void sendMail (String mailServerName, 
  int mailServerPort,
  String subject,
  String to, 
  String from, 
  String messageText) 
  throws AddressException, MessagingException, UnsupportedEncodingException {
//   Setup mail server
  Authenticator auth = new PopupAuthenticator();

//     Create session
  Properties mailProps = new Properties();
  mailProps.put("mail.smtp.host", mailServerName);
  mailProps.put("mail.smtp.port", String.valueOf(mailServerPort));
  mailProps.put("mail.smtp.auth", "true");
  Session mailSession = Session.getInstance(mailProps, auth);
 
  InternetAddress toAddrs = new InternetAddress(to);
  InternetAddress fromAddr = new InternetAddress(from,"보내는 사람 이름");
 
 //     Create and initialize message
  Message message = new MimeMessage(mailSession);
  message.setFrom(fromAddr);
  message.setRecipient(Message.RecipientType.TO, toAddrs);
  message.setSubject(subject);
  message.setContent(messageText.toString(), "text/html; charset=euc-kr");
 //     Send message
  try {
   Transport.send(message);
  } catch(Exception ex) {
   ex.printStackTrace();
   throw new MessagingException(ex.getMessage());
  }
 }
 
 
static class PopupAuthenticator extends Authenticator {
        public PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("보내는 계정 아이디", "보내는 계정 패스워드");
        }
    }
 
}

그리고 아래와 같이 호출해서 쓰면 됩니다.

try {
   MailUtil.sendMail("메일서버ip",메일서버port," 메일 제목 ","받는 메일 계정","보내는 메일 계정 ", "보내는 내용");
  } catch (UnsupportedEncodingException e) {
   new MessagingException(e.toString());
  }

첨부파일은 요즘 메일 보안이 강화되어서 메일이 늦게 가는 수가 있어서
웹링크 방식으로 많이 하는거 같은던데요.
 
암튼...
 
보내는 메일에

message.setContent(messageText.toString(), "text/html; charset=euc-kr");

여기에서 알수 있듯이 html 로 보내면 됩니다.
광고 같은건 첨부파일보다 이렇게 보내는게 훨씬 효율적일 겁니다.
이미지나 기타 src 경로를 full path 그러니까 http://host/dir/filename.jpg 이런식으로 작성하시면됩니다.
 
 
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

import! javax.mail.*;
import! javax.mail.internet.*;
import! javax.activation.*;
import! java.io.*;
import! java.util.*;
/* 
* http://java.sun.com/products/javamail/downloads/index.html (JavaMail API download)
* http://java.sun.com/products/javabeans/jaf/downloads/index.html (JAF download)
* Windows SMTP 설치 후, 시작>프로그램>관리도구>인터넷 정보서비스(IIS)관리>기본SMTP가상서버
* >속성>액세스>릴레이>아래목록만>추가>127.0.0.1입력>확인>적용>확인
* SMTP 서버 시작
* 이 클래스를 컴파일 / 실행
* 메일 수신자 측에서 수신된 메일을 확인한다.
* 테스트 환경: Windows 2003 (SMTP서버 설치), JDK6.0
* 테스트 일자: 2007.06.07
*/
class JavaMail_Append {
 public static void main(String[] args)  {
  try{
   //set up the default parameters.
   Properties props = new Properties();
   props.put("mail.transport.protocol", "smtp");
   props.put("mail.smtp.host", "58.121.75.170");
   props.put("mail.smtp.port", "25");
   //create the session and create the new mail message
   Session mailSession = Session.getInstance(props);
   Message msg = new MimeMessage(mailSession);
   //set the FROM, TO, DATE and SUBJECT fields
   msg.setFrom(new InternetAddress("like3038@daum.net"));
   msg.setRecipients(Message.RecipientType.TO, InternetAddress.parse("like3038@daum.net"));
   msg.setSentDate(new Date());
   msg.setSubject("JavaMail 테스트");
   //create the body of the mail, 첨부파일 없이 메시지만 전송할 경우
   //msg.setText("Hello! from my first java e-mail...Testing!!/n");
   // Create the message part
   BodyPart messageBodyPart = new MimeBodyPart();
   // Fill the message
   messageBodyPart.setText("테스트용 메일의 내용입니다.");
   Multipart multipart = new MimeMultipart();
   multipart.addBodyPart(messageBodyPart);
   
   // Part two is attachment
   messageBodyPart = new MimeBodyPart();
   File file = new File("JavaMail_Append.java");
   FileDataSource fds = new FileDataSource(file);
   messageBodyPart.setDataHandler(new DataHandler(fds));
   messageBodyPart.setFileName(fds.getName());
   multipart.addBodyPart(messageBodyPart);
   // Put parts in message
   msg.setContent(multipart);
   // Send the message
   Transport.send(msg);
   //ask the Transport class to send our mail message
     System.out.println("E-mail successfully sent!!");
  }catch(Exception e){
   e.printStackTrace();
  }
 }
}
 





'scrap >  Java/JSP' 카테고리의 다른 글

JAVA설치 후, 환경변수 설정하기  (0) 2011.03.29
eclipse에서 JDK 소스 보기  (0) 2011.02.06
Java 에서의 SMTP  (0) 2011.02.04
google SMTP 를 이용해서 java 에서 Email 보내기  (0) 2011.02.04
Access modifiers  (0) 2011.02.03