(4) E-mail 보내기

7760 단어 socketmail
E-mail을 보내려면 포트 25(SMTP 포트)에 소켓 연결을 설정해야 합니다.간단한 메일 전송 프로토콜은 E-mail 메시지를 설명하는 형식입니다.SMTP 서비스를 제공하는 모든 서버에 연결할 수 있지만 서버가 요청을 받아들일지 확인해야 합니다.SMTP 서버는 일반적으로 누구에게나 전자 메일을 보내기를 원하지만, 스팸메일이 범람하기 때문에 대부분의 서버에는 검사 기능이 내장되어 있으며, 신뢰하는 사용자나 IP 주소의 요청만 받아들인다.서버에 연결되면 SMTP 형식으로 메일 헤더를 보낼 수 있습니다.그 다음은 메일 메시지다.조작의 상세한 과정: 1.호스트에 대한 소켓을 엽니다.
    Socket socket = new Socket("mail.mailserver.com", 25);
    PrintWriter out = new PrintWriter(socket.getOutputStream());
 
2. 출력 흐름 HELO sending host MAIL FROM: RCPT TO: DATA mail message (any number of lines).    QUIT e.g.
    OutputStream outStream = socket.getOutputStream();
    PrintWriter out = new PrintWriter(new OutputStreamWriter(outStream, "utf-8"), true);
    String hostName = InetAddress.getLocalHost().getHostName();
    out.print("HELO " + hostName + "\r
"); out.print("MAIL FROM: <" + from.getText() + ">\r
"); out.print("RCPT TO: <" + to.getText() + ">\r
"); out.print("DATA\r
"); out.print(("the mail message...
").replaceAll("
", "\r
")); out.print(".\r
"); out.print("QUIT\r
"));
 
3. SMTP 사양(RFC 821)은 행마다\r로 한 줄 더 따라가야 한다고 규정합니다.4. 일부 SMTP 서버는 정보의 진실성을 검사하지 않고 원하는 발송자의 이름을 마음대로 작성할 수 있습니다.5. 현재 대부분의 SMTP 서버는 수신 IP를 검사합니다. 다른 서버는 "SMTP 이전 팝업"규범을 사용합니다. 즉, 메시지를 보내기 전에 전자 메일을 다운로드하고 비밀번호를 요구합니다.
 
 
DEMO
import java.awt.EventQueue;

import javax.swing.JFrame;

public class MailTest {
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable(){
			public void run(){
				JFrame frame = new MailTestFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setVisible(true);
			}
		});
	}
}

 
/**
 *  SMTP IP , 
 */
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.util.Scanner;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingWorker;

public class MailTestFrame extends JFrame {
	
	private Scanner in;
	private PrintWriter out;
	private JTextField from;
	private JTextField to;
	private JTextField smtpServer;
	private JTextArea message;
	private JTextArea comm;
	
	public static final int DEFAULT_WIDTH = 300;
	public static final int DEFAULT_HEIGHT = 300;
	
	public MailTestFrame(){
		setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
		setTitle("MailTest");
		
		setLayout(new GridBagLayout());
		
		add(new JLabel("From:"), new GBC(0,0).setFill(GBC.HORIZONTAL));
		
		from = new JTextField(20);
		add(from, new GBC(1, 0).setFill(GBC.HORIZONTAL).setWeight(100, 0));
		
		add(new JLabel("TO:"), new GBC(0, 1).setFill(GBC.HORIZONTAL));
		
		to = new JTextField(20);
		add(to, new GBC(1, 1).setFill(GBC.HORIZONTAL).setWeight(100, 0));
		
		add(new JLabel("SMTP server:"), new GBC(0, 2).setFill(GBC.HORIZONTAL));
		
		smtpServer = new JTextField(20);
		add(smtpServer, new GBC(1, 2).setFill(GBC.HORIZONTAL).setWeight(100, 0));
		
		message = new JTextArea();
		add(new JScrollPane(message), new GBC(0, 3, 2, 1).setFill(GBC.BOTH).setWeight(100, 100));
		
		comm = new JTextArea();
		add(new JScrollPane(comm), new GBC(0, 4, 2, 1).setFill(GBC.BOTH).setWeight(100, 100));
		
		JPanel buttonPanel = new JPanel();
		add(buttonPanel, new GBC(0, 5, 2, 1));
		
		JButton sendButton = new JButton("Send");
		buttonPanel.add(sendButton);
		sendButton.addActionListener(new ActionListener(){

			@Override
			public void actionPerformed(ActionEvent e) {
				new SwingWorker<Void, Void>(){
					protected Void doInBackground() throws Exception{
						comm.setText("");
						sendMail();
						return null;
					}
				}.execute();
			}
			
		});
	}
	
	public void sendMail(){
		try{
//			Socket socket = new Socket(smtpServer.getText(), 25);
			Socket socket = new Socket();
			socket.connect(new InetSocketAddress(smtpServer.getText(), 25), 2000);
			try{
				InputStream inStream = socket.getInputStream();
				OutputStream outStream = socket.getOutputStream();
				
				in = new Scanner(inStream);
				out = new PrintWriter(new OutputStreamWriter(outStream, "utf-8"), true);
				
				String hostName = InetAddress.getLocalHost().getHostName();
				
				receive();
				send("HELO " + hostName);
				receive();
				send("MAIL FROM: <" + from.getText() + ">");
				receive();
				send("RCPT TO: <" + to.getText() + ">");
				receive();
				send("DATA");
				receive();
				send(message.getText());
				send(".");
				receive();
			}finally{
				socket.close();
			}
		}catch(IOException e){
			comm.append("Error: " + e);
		}
	}

	private void send(String str) throws IOException{
		comm.append(str);
		comm.append("
"); out.print(str.replaceAll("
", "\r
")); out.flush(); } private void receive() { String line = in.nextLine(); comm.append(line); comm.append("
"); } }
 
import java.awt.GridBagConstraints;
import java.awt.Insets;

public class GBC extends GridBagConstraints{
	
	public GBC(int gridx, int gridy){
		this.gridx = gridx;
		this.gridy = gridy;
	}
	
	public GBC(int gridx, int gridy, int gridwidth, int gridheight){
		this.gridx = gridx;
		this.gridy = gridy;
		this.gridwidth = gridwidth;
		this.gridheight = gridheight;
	}
	
	public GBC setAnchor(int anchor){
		this.anchor = anchor;
		return this;
	}
	
	public GBC setFill(int fill){
		this.fill = fill;
		return this;
	}
	
	public GBC setWeight(double weightx, double weighty){
		this.weightx = weightx;
		this.weighty = weighty;
		return this;
	}
	
	public GBC setInsets(int distance){
		this.insets = new Insets(distance, distance, distance, distance);
		return this;
	}
	
	public GBC setInsets(int top, int left, int bottom, int right){
		this.insets = new Insets(top, left, bottom, right);
		return this;
	}
	
	public GBC setIpad(int ipadx, int ipady){
		this.ipadx = ipadx;
		this.ipady = ipady;
		return this;
	}
}
 

좋은 웹페이지 즐겨찾기