Hatena::ブログ(Diary)

初心者だけどPerlが大好き このページをアンテナに追加 RSSフィード

2011-02-21

xamppでメール5 MercuryMailを使おう

| 21:35 | xamppでメール5 MercuryMailを使おう - 初心者だけどPerlが大好き を含むブックマーク xamppでメール5 MercuryMailを使おう - 初心者だけどPerlが大好き のブックマークコメント

それでは Xamppのコントロールネルで MercuryMail をStart させましょう

簡単なサンプルコードは こちら

testmail.cgi

#!C:/xampp/perl/bin/perl
use CGI;
my $q = CGI->new();
print $q->header(-charset => 'utf-8'),
$q->start_html(-title=>"TestMail"),
$q->h1('TestMail Form'),
$q->start_form(-action=>"sendmail.cgi"),
$q->em("What's your name?"),
$q->br,
$q->br,
$q->textfield('name'),
$q->checkbox('Not my real name'),
$q->br,
$q->em("What's your e-mail?"),
$q->br,
$q->br,
$q->textfield('email'),
$q->br,
$q->em("What's your subject?"),
$q->br,
$q->br,
$q->textfield('subject'),
$q->br,
$q->em('Any parting comments?'),
$q->br,
$q->br,
$q->textarea(-name=>'comments',-rows=>3,-columns=>50),
$q->reset,
$q->submit(-name =>'Action', -value =>'送信'),
$q->submit(-name =>'Action', -value =>'Scream'),
$q->end_form,
$q->end_html;

sendmail.cgi

#!C:/xampp/perl/bin/perl
use utf8;
use CGI;
use Encode;
use MIME::Base64;
my $q = CGI->new();
$name= $q->param('name');
$email= $q->param('email');
$subject= $q->param('subject');
$comments= $q->param('comments');
$mailto='trinity@nagoya.jp';
# 汚染チェックとして改行を取り除く
$name=~ s/\r|\n//g;
$email=~ s/\r|\n//g;
$subject=~ s/\r|\n//g;
$comments=~ s/\r|\n//g;
my $bound='wq5se3d1ew';
$mail_name= encode('MIME-Header-ISO_2022_JP',$name);
$mail_email=encode('MIME-Header-ISO_2022_JP',$email);
$mail_to=encode('MIME-Header-ISO_2022_JP',$mailto);
$mail_subject=encode('MIME-Header-ISO_2022_JP',$subject);
$mail_comments=encode('ISO_2022_JP', decode('utf-8', $comments));
# Sendmailのパスの指定
$sendmail = 'C:/xampp/sendmail/sendmail.exe';
# Sendmailのファイルを開いてデータを書き込む
open(MAIL,"| $sendmail -t")|| &error(150," 送信に失敗しました");
# mailのヘッダー
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-Type: Multipart/Mixed; boundary=$bound\n";
print MAIL "From: $mail_name <$mail_email>\n";
print MAIL "To: $mail_to\n";
print MAIL "Name: $mail_name\n";
print MAIL "Subject:$mail_subject\n";
print MAIL "--$bound\n";
print MAIL "Content-Type: text/plain; charset=ISO-2022-JP\n";
print MAIL "\n";
# mailの本文
$mail_comments =~s/\r\n/\n/g;
print MAIL "$mail_comments\n";
close(MAIL);
print $q->header(-charset => 'utf-8'),
$q->start_html('Mail Form'),
$q->h1('settings in this form'),
$q->p('メールを送信しました。'),
$q->end_html;

2011-02-20

xamppでメール4 Windows Liveメールの設定

| 20:25 | xamppでメール4 Windows Liveメールの設定 - 初心者だけどPerlが大好き を含むブックマーク xamppでメール4 Windows Liveメールの設定 - 初心者だけどPerlが大好き のブックマークコメント

この設定は

http://localhost/ 以下に メール送信プログラムをおいたとき

テストとして Windows Live メールに届く という設定です。

windows Outlookでも 同じように設定できます


f:id:trinity777:20110220202538p:image

f:id:trinity777:20110220202537p:image

f:id:trinity777:20110220202536p:image

Xamppでメール3 MERCURYのConfiguration

| 20:14 | Xamppでメール3 MERCURYのConfiguration - 初心者だけどPerlが大好き を含むブックマーク Xamppでメール3 MERCURYのConfiguration - 初心者だけどPerlが大好き のブックマークコメント

XamppコントロールパネルのMERCURYの Adminをクリックしてください

f:id:trinity777:20110220210141p:image

Configuration をクリックしてください

f:id:trinity777:20110220202328p:image

f:id:trinity777:20110220202319p:image



f:id:trinity777:20110220202325p:image

f:id:trinity777:20110220202320p:image




最後に コマンドプロンプトを右クリック

管理者として実行で開き キャッシュフラッシュしておきましょう

f:id:trinity777:20110220202318j:image

xamppでメール2 MercuryMailの中のMERCURY.INI

| 20:01 | xamppでメール2 MercuryMailの中のMERCURY.INI - 初心者だけどPerlが大好き を含むブックマーク xamppでメール2 MercuryMailの中のMERCURY.INI - 初心者だけどPerlが大好き のブックマークコメント

Xamppコントロールパネルの画面をいじると 下記の結果になります。

直接 MERCURY.INI を書き換えても同じです

Xamppの中の MercuryMailの中の MERCURY.INI


# MERCURY.INI generated by Mercury Setup

#

#

# Sample Bindery Mode MERCURY.INI file (in fact, the one I use on

# my production server). This one implements most of the possible

# switches for each module, but you can edit it to do less if you

# wish. All the fields shown below are described in the file

# MGUIDE.HLP which is supplied in the Mercury archive.

#

# Anything after a '#' to the end of the line is a comment and

# is stripped out before parsing. Trailing and leading whitespace

# is also stripped before parsing. Many sample commands have been

# left in this file commented out for reference purposes.

#

[General]

myname: nagoya.jp # Canonical name for this server

timezone: +0000 # Time Zone to add to date fields

file_api: 1 # Use the file api instead of queues

mailqueue: C:\XAMPP\MERCURYMAIL\QUEUE # Where mail should be put for delivery

smtpqueue: C:\XAMPP\MERCURYMAIL\QUEUE # Where the SMTP client should look for mail

newmail_path: C:\XAMPP\MERCURYMAIL\MAIL\~N # Where to find the users' WinPMail mailboxes.

[Protocols]

C:\xampp\MERCURYMAIL\mercurys.dll

C:\xampp\MERCURYMAIL\mercurye.dll

C:\xampp\MERCURYMAIL\mercuryp.dll

C:\xampp\MERCURYMAIL\mercuryd.dll

C:\xampp\MERCURYMAIL\mercuryx.dll

C:\xampp\MERCURYMAIL\mercuryf.dll

C:\xampp\MERCURYMAIL\mercuryh.dll

C:\xampp\MERCURYMAIL\mercuryw.dll

C:\xampp\MERCURYMAIL\mercuryi.dll

C:\xampp\MERCURYMAIL\mercuryb.dll


[Mercury]

failfile: C:\xampp\MERCURYMAIL\Mercury\FAILURE.MER # Delivery failure notification template

confirmfile: C:\xampp\MERCURYMAIL\Mercury\CONFIRM.MER # Delivery confirmation template

aliasfile: C:\xampp\MERCURYMAIL\Mercury\ALIAS.MER # System-wide alias file

synfile: C:\xampp\MERCURYMAIL\Mercury\SYNONYM.MER # User synonym database

listfile: C:\xampp\MERCURYMAIL\Mercury\LISTS.MER # List of lists

logwidth: 30 # Width of address fields in logfile

retpath: 1 # Do/Don't use 'return-path' for errors

maxhops: 30 # Used to detect mailing loops

gullible: 0 # If NZ, don't validate 'From' fields

bitnethost: cunyvm.cuny.edu # Relay host for '.bitnet' rewrites

poll: 10 # Seconds between queue polling cycles

scratch: C:\xampp\MERCURYMAIL\Scratch # Where we can write temp files

returnlines: 15 # How many lines of failed messages to return

postmaster: Admin # NetWare UIC of postmaster

broadcast: 1 # Yes, we want broadcast notifications, but

receipts: 0 # ... no broadcasts for receipt confirmations

PM_notify: 1 # Do/Don't send errors to the postmaster

change_owner: 1 # Change message ownership to recipient

auto_tzone: 1 # If NZ, obtain timezone information from OS

LogLevel: 15 # System message reporting level

LogMax: 100 # Maximum number of system messages to store

RetryPeriod: 30 # Period between job retries (minutes)

MaxRetries: 16 # Maximum number of times a job can fail

TwoPasses: 1 # If NZ, process submission queue in 2 passes

Autoaddress: 0 # If NZ, auto-generate user addresses based on name

Daily_exit: 0 # If NZ, auto-restart each day after maintenance

No_Areply: 0 # If NZ, disable automatic replies system-wide

Alt_Forward: 0 # If NZ, allow alternate forwarding specification

Maint_hour: 2 # Hour for daily maintenance (24-hour clock)

Maint_min: 0 # Minute for daily maintenance

Retry_Mode: 0 # If NZ, use progressive backoff for queue retries

Local_DSNs: 1 # If NZ generate Delivery Status for local users only

DSN_time1: 10800 # Seconds deferred before first DSN is sent

DSN_time2: 86400 # Seconds deferred before second DSN is sent

DSN_time3: 259200 # Seconds deferred before third DSN is sent

Host_in_title: 0 # If NZ, show hostname in system tray and taskbar

Lingering: 0 # Enable or disable 'lingering mailboxes'

Linger_Timeout: 60 # Seconds before a lingering mailbox is shut down

Alert_Host: notify.pmail.com # Host to check for licensee advisories

Alert_Interval: 720 # Frequency in minutes (min 240) for checks

Alert_Flags: 3 # Flags controlling advisory checks

[MercuryC]

# Session_logging: G:\ # Directory to write session transcripts

host: # mail mail host which relays for us

scratch: C:\xampp\MERCURYMAIL\Mercury # Where we can write temp files

poll: 30 # Seconds between queue polling cycles

returnlines: 15 # How many lines of failed messages to return

failfile: C:\xampp\MERCURYMAIL\Mercury\FAILURE.MER # Delivery failure template

esmtp: 1 # Yes, we want to use ESMTP extensions

[MercuryE]

Poll : 15

Timeout : 60

# Session_logging : o:\mail\mercury\melogs

# Session_logmode : 1

# Nameservers : 139.80.64.1

[MercuryD]

scratch : C:\xampp\MERCURYMAIL\Mercury

# Timeout : 30

# Poll : 120 # How often to check hosts for new mail (seconds)

[MercuryS]

# Session_logging: G:\ # Directory to write session transcripts

debug: 1 # Whether or not to show session progress

# allow: 192.156.225.2 # A machine we WILL permit to connect

# refuse: 192.156.225.0 # A group of machines we WON'T permit.

logfile: C:\xampp\MERCURYMAIL\Logs\MERCURYS.LOG

# size: 1500000

Relay : 0 # Control non-local relaying



[MercuryP]

Scratch : C:\xampp\MERCURYMAIL\Mercury

Stack : 32768

Mark_Read : 1

SSL_Mode : 0

Login_Disabled : 0

UIDL_nul_list : 1

New_UIDs : 0

No_NUL_passwords : 1

Timeout : 60

[MercuryX]

# Cmd_Delay: 10

# Cmd_Wait: 1

# IE4_Dialling: 0

# Use_ETRN: 1

# Clients_only: 1

# Sunday: 0800,1800,3,15,30,60

# Monday: 0830,2100,5,15,60,60

# Tuesday: 0830,2100,5,15,60,60

# Wednesday: 1500,1900,2,30,5,30

# Thursday: 0900,1900,2,30,0,0

# Friday: 0830,2100,5,15,60,60

# Saturday: 1031,1035,2,45,-1,0

# [Groups]

# testgroup : TESTGRP

[Domains]

localhost: localhost

localhost: localhost.net

localhost: localhost.org

localhost: localhost.com

localhost: nagoya.jp

[Maiser]

Maiser: Maiser # 'Username' of mail server account

Helpfile: C:\xampp\MERCURYMAIL\Mercury\MAISER.HLP # Help sent on failed maiser requests

Lookupfile: C:\xampp\MERCURYMAIL\Mercury\MAISER.LKP # Format file for the 'lookup' command

Send_dir: C:\xampp\MERCURYMAIL\Mercury\SENDABLE # Directory for the 'send' command

Logfile: C:\xampp\MERCURYMAIL\Logs\MAISER.LOG # Mail server log file

Notify: C:\xampp\MERCURYMAIL\Mercury\TMP # Dir. for pending 'notify' commands

NoList: N # If 'Y', disable the 'list' command

Local_only: Y # If 'Y', local 'notify' commands only

[MercuryH]

Logfile : C:\xampp\MERCURYMAIL\Logs\MERCURYH.LOG

# Addressbook : \\CLIO\SYS\SYSTEM\MERCURY\PH.PMR

# MOTD : \\CLIO\SYS\SYSTEM\MERCURY\PH-MOTD.TXT

# Administrator : postmaster@clio.pmail.gen.nz

Timeout : 30

[MercuryI]

Scratch : C:\xampp\MERCURYMAIL\SCRATCH

Timeout : 120

Server_Port : 143

Idle_Timeout : 1800

SSL_Mode : 0

Login_Disabled : 0

[MercuryB]

Scratch : C:\xampp\MERCURYMAIL\SCRATCH

# Logfile : o:\mail\tmp\mercuryb.log

Timeout : 120

Server_Port : 2224

# Session_logging : o:\mail\mercury\mblogs

# Session_logmode : 0

Idle_Timeout : 1800

# URL_Base : enter_your_domain_here

[Groups]

[Rewrite]

[Statistics]

StatFlags: 0 # Statistical reporting settings

STF_Hours: 24 # How often to write stat log files

STM_Hours: 24 # How often to e-mail stat log files

Xamppでメール1 sendmailの中の sendmail.ini

| 20:00 | Xamppでメール1 sendmailの中の sendmail.ini - 初心者だけどPerlが大好き を含むブックマーク Xamppでメール1 sendmailの中の sendmail.ini - 初心者だけどPerlが大好き のブックマークコメント

まず Xampp でメールを設定するにあたり

サーバー localhost

アカウント trinity

パスワード 777

ドメイン nagoya.jp 

という設定で話をすすめていきます

ここで 注意

下記の

pop3_server=nagoya.jp

pop3_username=trinity

pop3_password=777

とすると WindowsLiveメール から新規メールがサーーバーに行き

そのメールがツバメ返しで WindowsLiveメール に戻ってくるようになります。

その代わりサーバーからの新規メールが WindowsLiveメール に届かなくなります

;pop3_server=nagoya.jp

;pop3_username=trinity

;pop3_password=777

ですから コメントアウトのまま放置しましょう


Xamppの中の sendmailの中の sendmail.ini


; configuration for fake sendmail

; if this file doesn't exist, sendmail.exe will look for the settings in

; the registry, under HKLM\Software\Sendmail

[sendmail]

; you must change mail.mydomain.com to your smtp server,

; or to IIS's "pickup" directory. (generally C:\Inetpub\mailroot\Pickup)

; emails delivered via IIS's pickup directory cause sendmail to

; run quicker, but you won't get error messages back to the calling

; application.

smtp_server=localhost

; smtp port (normally 25)

smtp_port=25

; the default domain for this server will be read from the registry

; this will be appended to email addresses when one isn't provided

; if you want to override the value in the registry, uncomment and modify

default_domain=nagoya.jp

; log smtp errors to error.log (defaults to same directory as sendmail.exe)

; uncomment to enable logging

error_logfile=error.log

; create debug log as debug.log (defaults to same directory as sendmail.exe)

; uncomment to enable debugging

debug_logfile=debug.log

; if your smtp server requires authentication, modify the following two lines

auth_username=trinity

auth_password=777

; if your smtp server uses pop3 before smtp authentication, modify the

; following three lines

;pop3_server=nagoya.jp

;pop3_username=trinity

;pop3_password=777

; to force the sender to always be the following email address, uncomment and

; populate with a valid email address. this will only affect the "MAIL FROM"

; command, it won't modify the "From: " header of the message content

force_sender=trinity@nagoya.jp

; sendmail will use your hostname and your default_domain in the ehlo/helo

; smtp greeting. you can manually set the ehlo/helo name if required

hostname=localhost

2010-06-12

さくらからNet::SMTPでヤフーに添付メールを飛ばす

| 07:32 | さくらからNet::SMTPでヤフーに添付メールを飛ばす - 初心者だけどPerlが大好き を含むブックマーク さくらからNet::SMTPでヤフーに添付メールを飛ばす - 初心者だけどPerlが大好き のブックマークコメント

メールは確かに飛びますので 構文は正しいと思います。

ただし SMTPを叩くせいか 連続して送信ができません。

DOS攻撃に備えて さくらサーバー

同じIPアドレスから連続送信できないようになっているのか???不明

フォームは 以前のものを 丸ごと使います。

POP before SMTPというのに さくらのメールサーバーが対応しています

SMTP自体に 認証機能が無いので

use Net::POP3;(コアモジュールです)

さきに POPで サーバー

$pop = Net::POP3->new('メールホスト名');

POPメールサーバー名と POPメールサーバーパスワードを送ります。

フォームから データを受け取って メールするcgiです

mail777.cgiとします


#!/usr/bin/perl     #さくらレンタルサーバーのPerlのパス
use utf8;
use CGI;
use Encode;
use MIME::Base64;
use File::Basename;
use Net::SMTP;
use Net::POP3;
my $q = CGI->new();
$name= $q->param('name');
$email= $q->param('email');
$subject= $q->param('subject');
$comments= $q->param('comments');
$mailto='trinity777@yahow.co.jp';       #あなたのヤフーメルアド
my $mailhost ='なんとかかんとか.sakura.ne.jp'; #あなたの契約のホスト名
# ファイルネーム取得
my $filename = $q->param('uploaded_file');
# ファイルシステムの設定(デフォルト:Unix)
fileparse_set_fstype('MSWin32');
my $basename= basename($filename,"");
# ファイルハンドル取得
my $fh = $q->upload('uploaded_file');
# バイナリデータとして読み込む
binmode $fh;
my $data ='';
while (read $fh,$buf,60*57){$data.=$buf;}
close $fh;
#バイナリデータをBASE64することでメール添付するためのASCIIテキストにする
$base64filebody = encode_base64($data,'');
#本文を出力する前に$base64filebodyの改行を\nに置換
#Windowsの改行コードは\r\nでMacの改行コードは\rですから全て\nに置換
$base64filebody=~ s/\r\n/\n/g;
$base64filebody=~ s/\r/\n/g;
# 汚染チェックとして改行を取り除く
$name=~ s/\r|\n//g;
$email=~ s/\r|\n//g;
$subject=~ s/\r|\n//g;
$comments=~ s/\r|\n//g;
my $bound='wq5se3d1ew';
$mail_name= encode('MIME-Header-ISO_2022_JP',$name);
$mail_subject=encode('MIME-Header-ISO_2022_JP',$subject);
$mail_comments=encode('ISO_2022_JP', decode('utf-8', $comments));
$mail_filename=encode('MIME-Header-ISO_2022_JP',$basename);
#POPします
$pop3= Net::POP3->new($mailhost) or die "error!!\n";
$pop3->login("メールサーバー名","メールサーバーパスワード");
$pop3->quit();
#SMTPします
my $smtp = Net::SMTP->new($mailhost) or die "error!!\n";
$smtp->mail($email);     #フォームで入力されたメルアドにする
$mail_email=encode('MIME-Header-ISO_2022_JP',$email);
$smtp->to($mailto);      #ヤフーに設定したのでヤフーにいきます
$mail_to=encode('MIME-Header-ISO_2022_JP',$mailto);
$smtp->data();
$smtp->datasend("MIME-Version: 1.0\n");
$smtp->datasend("Content-Type: Multipart/Mixed; boundary=$bound\n");
$smtp->datasend("Content-Transfer-Encoding: base64\n");
$smtp->datasend("From: $mail_email\n");
$smtp->datasend("To: $mail_to\n");
$smtp->datasend("Subject:$mail_subject\n");
$smtp->datasend("--$bound\n");
$smtp->datasend("Content-Type: text/plain; charset=ISO-2022-JP\n");
$smtp->datasend("\n");
$smtp->datasend("$mail_comments\n");
$smtp->datasend("--$bound\n");
$smtp->datasend("Content-Type: application/octet-stream; name=$filename\n");
$smtp->datasend("Content-Transfer-Encoding: base64\n");
$smtp->datasend("Content-Disposition: attachment; filename=$mail_filename\n");
$smtp->datasend("\n");
$smtp->datasend("$base64filebody\n");
$smtp->datasend("--$bound--\n");
$smtp->dataend();
$smtp->quit;
print $q->header(-charset => 'utf-8'),
$q->start_html('Mail Form'),
$q->h1('settings in this form'),
$q->p('メールを送信しました。'),
$q->end_html;

2010-06-05

Perlでメールの仕組み

| 07:50 | Perlでメールの仕組み - 初心者だけどPerlが大好き を含むブックマーク Perlでメールの仕組み - 初心者だけどPerlが大好き のブックマークコメント

メールの文字コードには決まりごとがあり

メールヘッダ内の日本語は

ISO-2022-JP (いわゆる JIS コード)の文字列にしてから更にBASE64にエンコードしたものにしなくてはなりません。

本文はISO-2022-JP (いわゆる JIS コード)にします。


メールヘッダの中で日本語が出てくるのは、差出人名、サブジェクト、コメント、添付ファイルのファイル名です。

ヘッダ部にマルチバイト文字の使用が許されていなので

ISO-2022-JP (いわゆる JIS コード)に変換したうえで さらにBASE64エンコードして7bit通信用にして送ります。

これは encode.pm が うまくやってくれます。

7bit通信路でもデータを壊されない様にするためにMIMEエンコード(Base64に変換する)のです。MIMEエンコードはMultipurpose Internet Mail Extensions です。


メール本文は

ISO-2022-JP (いわゆる JIS コード)に変換するだけ。

BASE64エンコードして7bit通信用にして送る必要はありません。


添付ファイルの内容は、

ISO-2022-JP (いわゆる JIS コード)に変換する必要はありません。

base64 でエンコードする。


メールの決まりとして、ヘッダ部と本文の境界には改行だけの行を使います。

ヘッダ部にはそういった行が存在してはいけません。

2010-05-30

さくらからEncode.pmでヤフーに添付メールを飛ばす

| 07:50 | さくらからEncode.pmでヤフーに添付メールを飛ばす - 初心者だけどPerlが大好き を含むブックマーク さくらからEncode.pmでヤフーに添付メールを飛ばす - 初心者だけどPerlが大好き のブックマークコメント

以前のは Jcode.pm でしたので 新しく書き換えました。

さくらレンタルサーバーで 動作確認をいたしました

ヤフーと Gmail と so-net に飛ばすことに成功しました。あと未確認。

いままで 作成したフォームをいじって

メールを書くページ         mail666.cgi

メールを書くページのスタイルシート form.css

メールを飛ばしてから 送信しましたという結果を表示するページ mail777.cgi

と 3つに分けました

セキュリティのことを考えると さらに 細かく書きこむことがありますが

とにかく みなさんが 理解しやすい 簡単なメールCGIを心がけました

'form.css'の内容は CGI.pmとスタイルシートの記事の内容そのままです

/* --基本部分の設定-- */

body{background-color:#66ffcc;font-size:20px;line-height:20px}

h1{text-align:center;margin:0 15%;

background-color:#eea8aa;

font-size:20px;

color:#ffffff;

font-style:italic;}

em{font-size:20px;

border-bottom:dashed;

color:#808000;}

#bbb {color:#ff1493;margin:0 15%;line-height:12px;}

.ccc {color:#008000;margin:0 15%;line-height:15px;}

f:id:trinity777:20091103171239j:image


メールを書くページは  mail666.cgi

  

#!/usr/bin/perl           #さくらレンタルサーバーのPerlのパス   
use utf8;
use CGI;
$q= new CGI;
print $q->header(-charset => 'utf-8'),
$q->start_html(-title=>"Example CGI.pm Form", -style=>{'src'=>'form.css'}),
$q->h1(' Example CGI.pm Form'),
$q->start_div({-class=>"aaa"}),
$q->p('これは class="aaa" の部分です'),
$q->start_form(-action=>'mail777.cgi'),
$q->em("What's your name?"),
$q->br,
$q->br,
$q->textfield('name'),
$q->checkbox('Not my real name'),
$q->br,
$q->em("What's your e-mail?"),
$q->br,
$q->br,
$q->textfield('email'),
$q->br,
$q->em("What's your subject?"),
$q->br,
$q->br,
$q->textfield('subject'),
$q->br,
$q->em('Any parting comments?'),
$q->br,
$q->br,
$q->textarea(-name=>'comments',-rows=>3,-columns=>50),
$q->reset,
$q->submit('Action','送信'),
$q->submit('Action','Scream'),
$q->endform,
$q->end_div,
$q->start_div({-id=>"bbb"}), 
$q->h3('これは id="bbb" の部分です'),
$q->end_div,
$q->start_div({-class=>"ccc"}),
$q->h3('これは class="ccc" の部分です'),
$q->end_div,
$q->end_html;

次は フォームから データを受け取って メールするcgiです

mail777.cgiとします

#!/usr/bin/perl      #さくらレンタルサーバーのPerlのパス
use utf8;
use CGI;
use Encode;
use MIME::Base64;
use File::Basename;
my $q = CGI->new();
$name= $q->param('name');
$email= $q->param('email');
$subject= $q->param('subject');
$comments= $q->param('comments');
$mailto='trinity777@yahowo.co.jp';
# ファイルネーム取得
my $filename = $q->param('uploaded_file');
# ファイルシステムの設定(デフォルト:Unix)
fileparse_set_fstype('MSWin32');
my $basename= basename($filename,"");
# ファイルハンドル取得
my $fh = $q->upload('uploaded_file');
# バイナリデータとして読み込む
binmode $fh;
my $data ='';
while (read $fh,$buf,60*57){$data.=$buf;}
close $fh;
#バイナリデータをBASE64することでメール添付するためのASCIIテキストにする
$base64filebody = encode_base64($data,'');
#本文を出力する前に$base64filebodyの改行を\nに置換
#Windowsの改行コードは\r\nでMacの改行コードは\rですから全て\nに置換
$base64filebody=~ s/\r\n/\n/g;
$base64filebody=~ s/\r/\n/g;
# 汚染チェックとして改行を取り除く
$name=~ s/\r|\n//g;
$email=~ s/\r|\n//g;
$subject=~ s/\r|\n//g;
$comments=~ s/\r|\n//g;
#バウンダリーの設定で適当な文字入れる
my $bound='wq5se3d1ew';
$mail_name= encode('MIME-Header-ISO_2022_JP',$name);
$mail_email=encode('MIME-Header-ISO_2022_JP',$email);
$mail_to=encode('MIME-Header-ISO_2022_JP',$mailto);
$mail_subject=encode('MIME-Header-ISO_2022_JP',$subject);
$mail_comments=encode('ISO_2022_JP', decode('utf-8', $comments));
$mail_filename=encode('MIME-Header-ISO_2022_JP',$basename);
#さくらのSendmailのパスの指定
$sendmail = '/usr/sbin/sendmail';
# Sendmailのファイルを開いてデータを書き込む
open(MAIL,"| $sendmail -t")|| &error(150," 送信に失敗しました");
# mailのヘッダー
### 全体のヘッダ
print MAIL "MIME-Version: 1.0\n";
print MAIL "Content-Type: Multipart/Mixed; boundary=$bound\n";
print MAIL "From: $mail_name <$mail_email>\n";
print MAIL "To: $mail_to\n";
print MAIL "Name: $mail_name\n";
print MAIL "Subject:$mail_subject\n";
print MAIL "--$bound\n";
print MAIL "Content-Type: text/plain; charset=ISO-2022-JP\n";
print MAIL "\n";
# mailの本文
$mail_comments =~ s/\r\n/\n/g;
print MAIL "$mail_comments\n";
print MAIL "--$bound\n";
print MAIL "Content-Type: application/octet-stream; name=$filename\n";
print MAIL "Content-Transfer-Encoding: base64\n";
print MAIL "Content-Disposition: attachment; filename=$mail_filename\n";
print MAIL "\n";
#添付するデータをbase64でエンコードしたもの
print MAIL "$base64filebody\n";
print MAIL "\n";
print MAIL "--$bound--\n";
close(MAIL);
print $q->header(-charset => 'utf-8'),
$q->start_html('Mail Form'),
$q->h1('settings in this form'),
$q->p('メールを送信しました。'),
$q->end_html;