📢 Loạt tính năng mới: Kết nối tài khoản Diễn Đàn với toàn bộ Thư Viện (Truyện/Thơ/Nhạc/Phim/Ẩm Thực)
Xin chào cả nhà!


Ban quản trị vừa hoàn tất một loạt tính năng mới, kết nối tài khoản Diễn Đàn với toàn bộ các khu vực Truyện, Thơ, Nhạc, Phim và Ẩm Thực. Xin tổng kết lại để mọi người tiện theo dõi và sử dụng:

1. Đăng nhập dùng chung toàn site
Chỉ cần 1 tài khoản Diễn Đàn, đăng nhập một lần là dùng được ở mọi khu vực. Nút "Đăng nhập / Đăng ký" đã thay cho "Giới thiệu / Trợ giúp" cũ ở đầu mỗi trang.

2. Thảo luận ngay dưới tác phẩm
Mỗi truyện, bài thơ, bài hát, phim, món ăn giờ có khung bình luận riêng ngay trên trang đọc/nghe/xem - không cần qua diễn đàn mới góp ý được. Bình luận đầu tiên sẽ tự tạo 1 chủ đề trong mục "💬 Thảo Luận Tác Phẩm Thư Viện" để mọi người cùng trao đổi.

3. Theo dõi tác phẩm
Bấm "🔔 Theo dõi tác phẩm" để nhận thông báo qua email ngay khi truyện có chương mới.

4. Yêu thích & Lịch sử đọc
Đánh dấu "⭐ Yêu thích" các tác phẩm ưng ý, và hệ thống tự ghi lại "🕘 Lịch sử đọc" mỗi khi bạn ghé đọc/nghe/xem - đồng bộ theo tài khoản, xem lại bất cứ lúc nào trong menu thành viên.

5. Huy hiệu hoạt động
Một vài huy hiệu nhỏ (bình luận viên, người theo dõi, người sưu tầm, thành viên kỳ cựu...) sẽ tự xuất hiện trên hồ sơ khi bạn hoạt động tích cực - hoàn toàn không phải hệ thống điểm/tiền thưởng, chỉ mang tính ghi nhận cho vui.

6. Ghi công người đóng góp
Tên người đăng nội dung (đánh máy, sưu tầm...) giờ sẽ tự động liên kết về hồ sơ Diễn Đàn nếu trùng với một tài khoản đang có trên diễn đàn.

7. Báo lỗi nội dung
Phát hiện lỗi chính tả, thiếu nội dung, ảnh hỏng... trong lúc đọc? Bấm "🚩 Báo lỗi nội dung" ngay trên trang, không cần rời khỏi tác phẩm đang xem.

8. Cải thiện giao diện trên điện thoại
Đầu trang và khu vực diễn đàn đã được chỉnh lại cho gọn gàng hơn trên màn hình nhỏ.

Rất mong nhận được góp ý thêm từ cả nhà để hoàn thiện dần. Cảm ơn mọi người đã luôn đồng hành cùng Việt Nam Thư Quán!

Diễn Đàn » Hướng Dẫn Lập trình

Gửi mail có kèm theo file

1 trả lời, 796 lượt xem — Trang 1 / 1
Bạn muốn gửi một mail có kèm theo file nhưng chưa biết cách viết code cho nó như thế nào. Sau đây là doạn code giúp bạn làm được điều đó.                          
   import java.io.*;
   import java.net.*;
   public class testMailMIME
   {
      static  int SMTPport =  25;
      static  Socket  socket;
      static  DataInputStream in;
      static  DataOutputStream out;
      static  PrintStream prout;
      /* Tên file sẽ được gửi */
      String FileName = "gumby.gif";
      public static void main(String s[])
      {
          /*
         ** testMAILMIME [server] [destinataire]
         */
          testMailMIME t = new testMailMIME();
         t.sendMail(s[0], s[1]);
      }
       public void sendMail(String mailServer, String recipient)
      {
         System.out.println("Send mail with attached file");
          try
         {
             Socket s = new Socket(mailServer, 25);
              BufferedReader in = new BufferedReader
                 (new InputStreamReader(s.getInputStream(), "8859_1"));
             BufferedWriter out = new BufferedWriter
                 (new OutputStreamWriter(s.getOutputStream(),
                                             "8859_1"));
             String boundary = "DataSeparatorString";
             // Giả sử lúc này bạn đã gửi username
              sendln(in, out, "HELO theWorld");
             // Cảnh báo: một số mail server có kiểm chứng địa chỉ gửi
             //  trong lệnh FROM command, đặt địa chỉ thật sự ở đây
             sendln(in, out,
                    "MAIL FROM: <Elvis.Presley@jailhouse.rock>");
             sendln(in, out, "RCPT TO: <" + recipient + ">" );
             //   Nếu có hơn 1 người nhận thì lặp lại các câu lệnh sau
              //     sendln(in, out, "RCPT TO: <" + recipient2 + ">" );
             //     sendln(in, out, "RCPT TO: <" + recipient3 + ">" );
             //      ...
             sendln(in, out, "DATA");
              sendln(out, "MIME-Version: 1.0");
              sendln(out, "Subject: remember me");
             sendln(out,
                 "From: Elvis Presley <Elvis.Presley@jailhouse.rock>");
             sendln(out,
                 "Content-Type: multipart/mixed; boundary=\"" +
                 boundary + "\"");
             sendln(out, "\r\n--" + boundary);
             // Gửi nội dung
              sendln(out,
                 "Content-Type: text/plain; charset=\"us-ascii\"\r\n");
             sendln(out, "I'm alive. Help me!\r\n\r\n");
             sendln(out, "\r\n--" +  boundary );
              // Gửi file
              sendln(out, "Content-Type:image/gif; name=" + FileName);
             sendln(out,
              "Content-Disposition: attachment;filename=\"" + FileName + "\"");
             sendln(out, "Content-transfer-encoding: base64\r\n");
             MIMEBase64.encode(FileName, out);
              sendln(out, "\r\n--" + boundary);
             sendln(out, "\r\n\r\n--" + boundary + "--\r\n");
             sendln(in, out, ".");
              sendln(in, out, "QUIT");
             s.close();
         }
          catch (Exception e)
         {
             e.printStackTrace();
          }
      }
      public void sendln(  BufferedReader in, BufferedWriter out, String s)
      {
          try
         {
             out.write(s + "\r\n");
              out.flush();
              // System.out.println(s);
              s = in.readLine();
              // System.out.println(s);
         }
         catch (Exception e)
          {
              e.printStackTrace();
         }
      }
      public void sendln(BufferedWriter out, String s)
      {
          try
          {
             out.write(s + "\r\n");
             out.flush();
              System.out.println(s);
          }
         catch (Exception e)
         {
              e.printStackTrace();
          }
      }
   }
Class MIMEBase64:
   import java.io.*;
   public class MIMEBase64
   {
       /*********************************************************
      ** Base64 sử dụng tập hợp ký tự con 65 của bảng mã US-ASCII,
      ** Cho phép 1 ký tự được mã hóa chỉ với 6 bits, vì vậy ký tự
      ** "m" với Base64 có giá trị 38, khi chuyển sang dạng nhị phân
      ** là 100110.
      **
      ** Với chuỗi ký tự, giả sử "men" được mã hóa, sẽ xảy ra điều gì:
      ** Chuỗi được chuyển sang giá trị US-ASCII của nó.
      **
      ** Ký tự "m" có giá trị thập phân là 109
      ** Ký tự "e" có giá trị thập phân là 101
      ** Ký tự "n" có giá trị thập phân là 110
      **
      **     Khi chuyển sang dạng nhị phân nó có dạng sau:
      **
      ** m   01101101
      ** e   01100101
      ** n   01101110
      **
      ** 3 ký tự "8-bits" được nối vói nhau để tạo thành dòng 24 bits
      ** 011011010110010101101110
      **
      ** Dòng 24 bit này sau đó được chia sang 4 phần 6-bit
      ** 011011 010110 010101 101110
      **
      ** Bây giờ chúng ta có 4 giá trị. Những gí trị nhị phân này
       ** được chuyển sang dạng thập phân:
      ** 27     22     21     46
      **
      ** Và tương ứng với các ký tự Base64:
      ** b      W       V     u
      **
      ** Mã hóa luôn dựa trên 3 ký tự
      ** (Để có một tập hợp các ký tự Base64). Để mã hóa 1 hoặc 2 ký
       ** tự, chúng ta sử dụng ký tự đặc biệt "=" để thêm vào cho đến
       ** khi đủ 4 ký tự base64
      ** Ví dụ. encode "me"
      **
      **        01101101  01100101
      **        0110110101100101
      **        011011 010110 0101
      **        111111    (để thêm vào các bits bị bỏ lỡ)
      **        011011 010110 010100
      **            b     W      U
      **            b     W      U     =  ("=" là ký tự thêm vào)
      **
      **        vì thế "bWU="  tương ứng với mã hóa Base64.
      **
      **        encode "m"
      **
      **            01101101
      **            011011 01
      **            111111        
      **            011011 010000
      **            b     Q     =  =   (2 ký tự được thêm vào)
      **/
      static String BaseTable[] =
      {
          "A","B","C","D","E","F","G","H","I","J","K","L","M","N","O",
          "P","Q","R","S","T","U","V","W","X","Y","Z","a","b","c","d",
          "e","f","g","h","i","j","k","l","m","n","o","p","q","r","s",
          "t","u","v","w","x","y","z","0","1","2","3","4","5","6","7",
          "8","9","+","/"
      };
      public static void encode(String filename, BufferedWriter out)
      {
         try
          {
             File f = new File(filename);
             FileInputStream fin = new FileInputStream(filename);
 
              // Đọc toàn bộ file sang mảng byte
             byte bytes[] = new byte[(int)(f.length())];
             int n = fin.read(bytes);   
              // Không có bytes nào được mã hóa!?!
              if (n < 1) return;         
              // Mảng của những ký tự base64
             byte buf[] = new byte[4];   
             int n3byt      = n / 3;     // Nhóm 3 byte
             int nrest      = n % 3;     // Những byte còn lại từ nhóm
             int k          = n3byt * 3;
             int linelength = 0;        
             int i          = 0;        
              // Tạo nhóm 3 byte...
             while ( i < k )
             {
                 buf[0] = (byte)(( bytes   & 0xFC) >> 2);
                 buf[1] = (byte)(((bytes   & 0x03) << 4) |
                                  ((bytes[i+1] & 0xF0) >> 4));
                 buf[2] = (byte)(((bytes[i+1] & 0x0F) << 2) |
                                  ((bytes[i+2] & 0xC0) >> 6));
                 buf[3] = (byte)(  bytes[i+2] & 0x3F);
                send(out, BaseTable[buf[0]]);
                 send(out, BaseTable[buf[1]]);
                 send(out, BaseTable[buf[2]]);
                 send(out, BaseTable[buf[3]]);
                 /*****************************************************
                ** Đoạn mã trên có thể được viết theo cách tối ưu hơn.
                 ** Tuy khó hiểu nhưng gọn hơn.
                 **
                 ** buf[0]= (byte)(b >> 2);
                 ** buf[1]= (byte)(((b & 0x03)  << 4)|(b[i+1]>> 4));
                ** buf[2]= (byte)(((b[i+1] & 0x0F)<< 2)|(b[i+2]>> 6));
                 ** buf[3]= (byte)(b[i+2] & 0x3F);
                 ** send(out, BaseTable[buf[0]] + BaseTable[buf[1]] +
                 **     BaseTable[buf[2]] + BaseTable[buf[3]]);
                 **/
                if ((linelength += 4) >= 76)
                 {
                     send(out, "\r\n");
                    linelength = 0;
                }
                 i += 3;
              }
             // Các ký tự thêm vào...
             if (nrest == 2)
              {
                 // 2 bytes còn lại
                 buf[0] = (byte)(( bytes[k] & 0xFC)   >> 2);
                 buf[1] = (byte)(((bytes[k] & 0x03)   << 4) |
                                  ((bytes[k+1] & 0xF0) >> 4));
                 buf[2] = (byte)(( bytes[k+1] & 0x0F) << 2);
             }
              else if (nrest == 1)
              {
                 // 1 byte còn lại
                 buf[0] = (byte)((bytes[k] & 0xFC) >> 2);
                buf[1] = (byte)((bytes[k] & 0x03) << 4);
             }
              if (nrest > 0)
              {
                 // Gửi ký tự thêm vào
                 if ((linelength += 4) >= 76)
                    send(out, "\r\n");
                 send(out, BaseTable[buf[0]]);
                 send(out, BaseTable[buf[1]]);
                 if (nrest == 2)
                 {
                    send(out, BaseTable[buf[2]]);
                 }
                 else
                 {
                    send(out, "=");
                }
                 send(out, "=");
              }
             out.flush();
         }
          catch (Exception e)
         {
             e.printStackTrace();
          }
      } 
      public static void send(BufferedWriter out, String s)
      {
          try
         {
             out.write(s);
              System.out.print(s);
          }  
         catch (Exception e)
         {
              e.printStackTrace();
          }
      }
   }
Nếu muốn gửi file gif và file text, bạn phải thay đổi hàm sendMail
() lại một chút.
   ...
   /* Tên của các file được gửi. */
   String FileName1 = "gumby.gif";
   String FileName2 = "gumby.txt";
   ...
   public void sendMail(String mailServer, String recipient)
   {
       System.out.println("Send mail with attached file");
       try
       {
          Socket s = new Socket(mailServer, 25);
          BufferedReader in = new BufferedReader
                 (new InputStreamReader(s.getInputStream(), "8859_1"));
          BufferedWriter out = new BufferedWriter
                 (new OutputStreamWriter(s.getOutputStream(),"8859_1"));
          String boundary = "DataSeparatorString";
          // Giả sử lúc này bạn đã gửi username
          sendln(in, out, "HELO world");
          sendln(in, out, "MAIL FROM: <real@gagnon.com>");
          sendln(in, out, "RCPT TO: <" + recipient + ">" );
          sendln(in, out, "DATA");
          sendln(out, "MIME-Version: 1.0");
          sendln(out, "Subject: remember me");
          sendln(out,
                 "From: Elvis Presley <Elvis.Presley@jailhouse.rock<");
          sendln(out,
                 "Content-Type: multipart/mixed; boundary=\"" +
                 boundary + "\"");
          sendln(out, "\r\n--" + boundary);
          // Gửi file GIF
          sendln(out,
                 "Content-Type: text/plain; charset=\"us-ascii\"\r\n");
          sendln(out, "I'm alive. Help me!\n\n");
          sendln(out, "\r\n" + "--" +  boundary );
          sendln(out, "Content-Type:image/gif; name=" + FileName1);
          sendln(out, "Content-Disposition: attachment;filename=\"" +
                 FileName1 + "\"");
          sendln(out, "Content-transfer-encoding: base64\r\n");
          MIMEBase64.encode(FileName1, out);
          sendln(out, "\r\n--" + boundary);
 
          // File text
          sendln(out, "Content-Type: text/plain; name=" + FileName2);
          sendln(out, "Content-Disposition: inline;filename=\"" + FileName2 + "\"");
          // Để gửi kèm file thay vì gửi trong mail:
          // sendln(out, "Content-Type: text/plain; name=" +
          //     FileName2);
          // sendln(out,
          //     "Content-Disposition: attachment;filename=\""+
          //     FileName2+"\"");
          sendln(out, "Content-Transfer-Encoding: base64\r\n");
          MIMEBase64.encode(FileName2, out);
          sendln(out, "\r\n\r\n--" + boundary + "--\r\n");
          // ok
          sendln(in, out,".");
          sendln(in, out, "QUIT");
          s.close();
       }
       catch (Exception e)
       {
          e.printStackTrace();
       }
   }
   ...
 
Trích từ  “Thủ thuật lập trình Java“
 
Đăng nhập để trả lời
0
Chào bạn!
Mình mong bạn giúp mình vấn đề này với nha.
Mình hay nhắn tin sms qua chương trình Mobi portal.
Nếu mình muốn nt đến 1 số thì bắt buộc phải nhập là :
8490,8493 số nt đến là mạng 090 và 7 số đt sau là mình nhập theo ý mình.
8491,8494 số nt đến là mạng 091.
8498,8497 số nt đến là mạng vietel
Ví dụ số dt của mình là 0903123456 mình muốn nt đến số 0903882288 thì mình phải nhập là 84903882288 thì lúc đó số 0903882288 mới nhận được tn của mình.
Khi mình muốn gởi tn đến nhiểu số cùng 1 lúc thì mình phài nhập từng số một rất tốn thời gian và hay sai sót.
Mình mong bạn chỉ cho mình 1 chương trình giúp mình k phải nhập lại từng số mà mình chỉ cần nhập 1 số và chỉ cần enter là nó sẽ xuất hiện dãy số mình mong muốn.
Mình cho ví dụ để bạn dể hình dung nhé.Mình có số 0903123456 mình sẽ nt đến tất cả các số có 6 số đuôi giống số của mình chỉ khác số đầu mình sẽ phải nhập từng số là 84902123456,84904123456,84905123456,84906123456,84907123456,84908123456,84909123456,84912123456,84913123456,84914123456,84915123456,84973123456...Bạn có thấy nhập số rất tốn thời gian và hay sai nữa.
Bạn có cách nào giúp mình nhập nhanh dãy số này nhé.Rất cám ơn bạn ,mình rất mong tin.
 
 
Một nửa vầng trăng một khối tình
Nửa lòng giá buốt nửa kiên trinh
Trăng tròn lại khuyết dài năm tháng
Khuyết mấy mùa trăng vẫn một mình

(Nửa Vầng Trăng - Hương Việt)

Nửa Vầng Trăng
Đăng nhập để trả lời
0